diff --git a/.gitignore b/.gitignore
index eaa131d..e66367d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -75,6 +75,7 @@
 *.rej
 
 # Generated files.
+tools/dartium/out
 tools/out
 tools/xcodebuild
 editor/util/testing/mac/CodeLab.suite/Results
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 10c8136..3e3bef8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 ## 1.16.0
 
+### Core library changes
+
+* `dart:core`
+  * Fixed DateTime implementation in the VM (issue #19923), but no API change.
+
 ### Analyzer
 
 *   Static checking of `for in` statements. These will now produce static
diff --git a/DEPS b/DEPS
index 8e35a96..a696162 100644
--- a/DEPS
+++ b/DEPS
@@ -76,7 +76,7 @@
   "pub_semver_tag": "@1.2.1",
   "quiver_tag": "@0.21.4",
   "resource_rev":"@a49101ba2deb29c728acba6fb86000a8f730f4b1",
-  "root_certificates_rev": "@c3a41df63afacec62fcb8135196177e35fe72f71",
+  "root_certificates_rev": "@aed07942ce98507d2be28cbd29e879525410c7fc",
   "scheduled_test_tag": "@0.12.5+2",
   "shelf_tag": "@0.6.5",
   "smoke_rev" : "@f3361191cc2a85ebc1e4d4c33aec672d7915aba9",
@@ -97,7 +97,7 @@
   "watcher_tag": "@0.9.7",
   "when_tag": "@0.2.0+2",
   "which_tag": "@0.1.3+1",
-  "web_components_rev": "@0e636b534d9b12c9e96f841e6679398e91a986ec",
+  "web_components_rev": "@6349e09f9118dce7ae1b309af5763745e25a9d61",
   "web_socket_channel_tag": "@1.0.0",
   "WebCore_rev": "@a86fe28efadcfc781f836037a80f27e22a5dad17",
   "yaml_tag": "@2.1.5",
diff --git a/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart b/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
index a43d4b4..1bbd728 100644
--- a/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
@@ -6,8 +6,8 @@
 
 import 'dart:convert';
 
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:logging/logging.dart';
 
 import 'input_converter.dart';
diff --git a/pkg/analysis_server/benchmark/integration/local_runner.dart b/pkg/analysis_server/benchmark/integration/local_runner.dart
index bd0ff6b..c355ed8 100644
--- a/pkg/analysis_server/benchmark/integration/local_runner.dart
+++ b/pkg/analysis_server/benchmark/integration/local_runner.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
+
 import 'package:path/path.dart';
+
 import 'main.dart' as performance;
 
 // Local driver for performance measurement
@@ -15,8 +17,8 @@
   if (args.length < 3) printHelp('Expected 3 arguments');
   var gitDir = new Directory(args[0]);
   if (!gitDir.existsSync()) printHelp('${gitDir.path} does not exist');
-  if (!new Directory(join(gitDir.path, '.git')).existsSync()) printHelp(
-      '${gitDir.path} does not appear to be a local git repository');
+  if (!new Directory(join(gitDir.path, '.git')).existsSync())
+    printHelp('${gitDir.path} does not appear to be a local git repository');
   var branch = args[1];
   var inputFile = new File(args[2]);
   if (!inputFile.existsSync()) printHelp('${inputFile.path} does not exist');
diff --git a/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart b/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart
index 0781bae..ba98b3b 100644
--- a/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart
@@ -13,9 +13,9 @@
 import 'operation.dart';
 
 const CONNECTED_MSG_FRAGMENT = ' <= {"event":"server.connected"';
-final int NINE = '9'.codeUnitAt(0);
 const RECEIVED_FRAGMENT = ' <= {';
 const SENT_FRAGMENT = ' => {';
+final int NINE = '9'.codeUnitAt(0);
 final int ZERO = '0'.codeUnitAt(0);
 
 /**
diff --git a/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart b/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart
index a36a54a..7b9829a 100644
--- a/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/completion_timing_tests.dart
@@ -33,13 +33,13 @@
   Future.wait([new CompletionTimingTest().test_timing()]);
 }
 
+const COMPLETION_OFFSET = 'offset';
 const PRIORITY_FILE_OPTION = 'priority';
 const SOURCE_OPTION = 'source';
-const COMPLETION_OFFSET = 'offset';
 
+int offset;
 String priorityFile;
 String source;
-int offset;
 
 ArgParser _createArgParser() => new ArgParser()
   ..addOption(SOURCE_OPTION, help: 'full path to source directory for analysis')
diff --git a/pkg/analysis_server/benchmark/perf/performance_tests.dart b/pkg/analysis_server/benchmark/perf/performance_tests.dart
index 62a752c..b784c0c 100644
--- a/pkg/analysis_server/benchmark/perf/performance_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/performance_tests.dart
@@ -56,6 +56,11 @@
   }
 
   /**
+   * After every test, the server is stopped.
+   */
+  Future shutdown() async => await shutdownIfNeeded();
+
+  /**
    * Enable [SERVER_STATUS] notifications so that [analysisFinished]
    * can be used.
    */
@@ -64,11 +69,6 @@
     futures.add(sendServerSetSubscriptions([ServerService.STATUS]));
     return Future.wait(futures);
   }
-
-  /**
-   * After every test, the server is stopped.
-   */
-  Future shutdown() async => await shutdownIfNeeded();
 }
 
 class AbstractTimingTest extends AbstractAnalysisServerPerformanceTest {
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
index 14bdcb3..c216260 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
@@ -26,9 +26,9 @@
    * A comparator that can be used to sort assists by their relevance. The most
    * relevant assists will be sorted before assists with a lower relevance.
    */
-  static final Comparator<Assist> SORT_BY_RELEVANCE = (Assist firstAssist,
-          Assist secondAssist) =>
-      firstAssist.kind.relevance - secondAssist.kind.relevance;
+  static final Comparator<Assist> SORT_BY_RELEVANCE =
+      (Assist firstAssist, Assist secondAssist) =>
+          firstAssist.kind.relevance - secondAssist.kind.relevance;
 
   /**
    * A description of the assist being proposed.
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
index 0ff626f..aaf2c00 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
@@ -27,9 +27,9 @@
    * A comparator that can be used to sort fixes by their relevance. The most
    * relevant fixes will be sorted before fixes with a lower relevance.
    */
-  static final Comparator<Fix> SORT_BY_RELEVANCE = (Fix firstFix,
-          Fix secondFix) =>
-      firstFix.kind.relevance - secondFix.kind.relevance;
+  static final Comparator<Fix> SORT_BY_RELEVANCE =
+      (Fix firstFix, Fix secondFix) =>
+          firstFix.kind.relevance - secondFix.kind.relevance;
 
   /**
    * A description of the fix being proposed.
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 4e5036d..101348b 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -1471,6 +1471,16 @@
     onContextsChanged.listen((ContextsChangedEvent event) {
       for (AnalysisContext context in event.added) {
         context
+            .onResultChanged(RESOLVED_UNIT2)
+            .listen((ResultChangedEvent event) {
+          if (event.wasComputed) {
+            Object value = event.value;
+            if (value is CompilationUnit) {
+              index.indexDeclarations(value);
+            }
+          }
+        });
+        context
             .onResultChanged(RESOLVED_UNIT)
             .listen((ResultChangedEvent event) {
           if (event.wasInvalidated) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index e174b7d..018999a 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -6,9 +6,9 @@
 
 import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/protocol_server.dart' as proto;
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 
 /**
  * Return the elements that the given [element] overrides.
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 0d90251..5054f7b 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -7,137 +7,124 @@
 //
 // Server methods
 //
-const String SERVER_GET_VERSION = 'server.getVersion';
-const String SERVER_SHUTDOWN = 'server.shutdown';
-const String SERVER_SET_SUBSCRIPTIONS = 'server.setSubscriptions';
+const String ADD = 'add';
+const String ADDED = 'added';
+const String ANALYSIS_ANALYZED_FILES = 'analysis.analyzedFiles';
 
 //
 // Server notifications
 //
-const String SERVER_CONNECTED = 'server.connected';
-const String SERVER_ERROR = 'server.error';
-const String SERVER_STATUS = 'server.status';
+const String ANALYSIS_ERRORS = 'analysis.errors';
+const String ANALYSIS_GET_ERRORS = 'analysis.getErrors';
+const String ANALYSIS_GET_HOVER = 'analysis.getHover';
 
 //
 // Analysis methods
 //
-const String ANALYSIS_GET_ERRORS = 'analysis.getErrors';
-const String ANALYSIS_GET_HOVER = 'analysis.getHover';
 const String ANALYSIS_GET_LIBRARY_DEPENDENCIES =
     'analysis.getLibraryDependencies';
 const String ANALYSIS_GET_NAVIGATION = 'analysis.getNavigation';
 const String ANALYSIS_GET_REACHABLE_SOURCES = 'analysis.getReachableSources';
-const String ANALYSIS_REANALYZE = 'analysis.reanalyze';
-const String ANALYSIS_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
-const String ANALYSIS_SET_GENERAL_SUBSCRIPTIONS =
-    'analysis.setGeneralSubscriptions';
-const String ANALYSIS_SET_PRIORITY_FILES = 'analysis.setPriorityFiles';
-const String ANALYSIS_SET_SUBSCRIPTIONS = 'analysis.setSubscriptions';
-const String ANALYSIS_UPDATE_CONTENT = 'analysis.updateContent';
-const String ANALYSIS_UPDATE_OPTIONS = 'analysis.updateOptions';
-
-//
-// Analysis notifications
-//
-const String ANALYSIS_ANALYZED_FILES = 'analysis.analyzedFiles';
-const String ANALYSIS_ERRORS = 'analysis.errors';
 const String ANALYSIS_HIGHLIGHTS = 'analysis.highlights';
 const String ANALYSIS_IMPLEMENTED = 'analysis.implemented';
 const String ANALYSIS_NAVIGATION = 'analysis.navigation';
 const String ANALYSIS_OCCURRENCES = 'analysis.occurrences';
 const String ANALYSIS_OUTLINE = 'analysis.outline';
 const String ANALYSIS_OVERRIDES = 'analysis.overrides';
+const String ANALYSIS_REANALYZE = 'analysis.reanalyze';
+const String ANALYSIS_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
+const String ANALYSIS_SET_GENERAL_SUBSCRIPTIONS =
+    'analysis.setGeneralSubscriptions';
+
+//
+// Analysis notifications
+//
+const String ANALYSIS_SET_PRIORITY_FILES = 'analysis.setPriorityFiles';
+const String ANALYSIS_SET_SUBSCRIPTIONS = 'analysis.setSubscriptions';
+const String ANALYSIS_UPDATE_CONTENT = 'analysis.updateContent';
+const String ANALYSIS_UPDATE_OPTIONS = 'analysis.updateOptions';
+const String ASSISTS = 'assists';
+const String CHANGE = 'change';
+const String CHILDREN = 'children';
+const String CLASS_ELEMENT = 'classElement';
 
 //
 // Code Completion methods
 //
-const String COMPLETION_GET_SUGGESTIONS = 'completion.getSuggestions';
+const String CLASS_NAME = 'className';
 
 //
 // Code Completion notifications
 //
-const String COMPLETION_RESULTS = 'completion.results';
+const String CODE = 'code';
 
 //
 // Search methods
 //
-const String SEARCH_FIND_ELEMENT_REFERENCES = 'search.findElementReferences';
-const String SEARCH_FIND_MEMBER_DECLARATIONS = 'search.findMemberDeclarations';
-const String SEARCH_FIND_MEMBER_REFERENCES = 'search.findMemberReferences';
-const String SEARCH_FIND_TOP_LEVEL_DECLARATIONS =
-    'search.findTopLevelDeclarations';
-const String SEARCH_GET_TYPE_HIERARCHY = 'search.getTypeHierarchy';
+const String COMPLETION = 'completion';
+const String COMPLETION_GET_SUGGESTIONS = 'completion.getSuggestions';
+const String COMPLETION_RESULTS = 'completion.results';
+const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
+const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
 
 //
 // Search notifications
 //
-const String SEARCH_RESULTS = 'search.results';
+const String CONTENT = 'content';
 
 //
 // Edit methods
 //
+const String CORRECTION = 'correction';
+const String DART_DOC = 'dartdoc';
+const String DEFAULT = 'default';
+const String DISPLAY_NAME = 'displayName';
 const String EDIT_FORMAT = 'edit.format';
 const String EDIT_GET_ASSISTS = 'edit.getAssists';
 const String EDIT_GET_AVAILABLE_REFACTORINGS = 'edit.getAvailableRefactorings';
+
+//
+// Execution methods
+//
 const String EDIT_GET_FIXES = 'edit.getFixes';
 const String EDIT_GET_REFACTORING = 'edit.getRefactoring';
 const String EDIT_ORGANIZE_DIRECTIVES = 'edit.organizeDirectives';
 const String EDIT_SORT_MEMBERS = 'edit.sortMembers';
 
 //
-// Execution methods
-//
-const String EXECUTION_CREATE_CONTEXT = 'execution.createContext';
-const String EXECUTION_DELETE_CONTEXT = 'execution.deleteContext';
-const String EXECUTION_MAP_URI = 'execution.mapUri';
-const String EXECUTION_SET_SUBSCRIPTIONS = 'execution.setSubscriptions';
-
-//
 // Execution notifications
 //
-const String EXECUTION_LAUNCH_DATA = 'execution.launchData';
+const String EDITS = 'edits';
 
 //
 // Analysis option names
 //
+const String ELEMENT = 'element'; // boolean
+const String ELEMENT_DESCRIPTION = 'elementDescription'; // boolean
+const String ELEMENT_KIND = 'elementKind'; // boolean
 const String ENABLE_ASYNC = 'enableAsync'; // boolean
 const String ENABLE_DEFERRED_LOADING = 'enableDeferredLoading'; // boolean
-const String ENABLE_ENUMS = 'enableEnums'; // boolean
-const String GENERATE_DART2JS_HINTS = 'generateDart2jsHints'; // boolean
-const String GENERATE_HINTS = 'generateHints'; // boolean
 
 //
 // Property names
 //
-const String ADD = 'add';
-const String ADDED = 'added';
-const String ASSISTS = 'assists';
-const String CHANGE = 'change';
-const String CHILDREN = 'children';
-const String CLASS_ELEMENT = 'classElement';
-const String CLASS_NAME = 'className';
-const String CODE = 'code';
-const String COMPLETION = 'completion';
-const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
-const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
-const String CONTENT = 'content';
-const String CORRECTION = 'correction';
-const String DART_DOC = 'dartdoc';
-const String DEFAULT = 'default';
-const String DISPLAY_NAME = 'displayName';
-const String EDITS = 'edits';
-const String ELEMENT = 'element';
-const String ELEMENT_DESCRIPTION = 'elementDescription';
-const String ELEMENT_KIND = 'elementKind';
-const String EXCLUDED = 'excluded';
+const String ENABLE_ENUMS = 'enableEnums';
 const String ERROR = 'error';
 const String ERRORS = 'errors';
+const String EXCLUDED = 'excluded';
+const String EXECUTION_CREATE_CONTEXT = 'execution.createContext';
+const String EXECUTION_DELETE_CONTEXT = 'execution.deleteContext';
+const String EXECUTION_LAUNCH_DATA = 'execution.launchData';
+const String EXECUTION_MAP_URI = 'execution.mapUri';
+const String EXECUTION_SET_SUBSCRIPTIONS = 'execution.setSubscriptions';
 const String FATAL = 'fatal';
 const String FILE = 'file';
 const String FILE_STAMP = 'fileStamp';
 const String FILES = 'files';
 const String FIXES = 'fixes';
 const String FLAGS = 'flags';
+const String GENERATE_DART2JS_HINTS = 'generateDart2jsHints';
+const String GENERATE_HINTS = 'generateHints';
 const String HAS_FIX = 'hasFix';
 const String HIERARCHY_ITEMS = 'hierarchyItems';
 const String HOVERS = 'hovers';
@@ -178,14 +165,27 @@
 const String REMOVE = 'remove';
 const String REMOVED = 'removed';
 const String REPLACEMENT = 'replacement';
-const String REPLACEMENT_OFFSET = 'replacementOffset';
 const String REPLACEMENT_LENGTH = 'replacementLength';
-const String RETURN_TYPE = 'returnType';
+const String REPLACEMENT_OFFSET = 'replacementOffset';
 const String RESULTS = 'results';
+const String RETURN_TYPE = 'returnType';
+const String SEARCH_FIND_ELEMENT_REFERENCES = 'search.findElementReferences';
+const String SEARCH_FIND_MEMBER_DECLARATIONS = 'search.findMemberDeclarations';
+const String SEARCH_FIND_MEMBER_REFERENCES = 'search.findMemberReferences';
+const String SEARCH_FIND_TOP_LEVEL_DECLARATIONS =
+    'search.findTopLevelDeclarations';
+const String SEARCH_GET_TYPE_HIERARCHY = 'search.getTypeHierarchy';
+const String SEARCH_RESULTS = 'search.results';
 const String SELECTION = 'selection';
-const String SEVERITY = 'severity';
 const String SELECTION_LENGTH = 'selectionLength';
 const String SELECTION_OFFSET = 'selectionOffset';
+const String SERVER_CONNECTED = 'server.connected';
+const String SERVER_ERROR = 'server.error';
+const String SERVER_GET_VERSION = 'server.getVersion';
+const String SERVER_SET_SUBSCRIPTIONS = 'server.setSubscriptions';
+const String SERVER_SHUTDOWN = 'server.shutdown';
+const String SERVER_STATUS = 'server.status';
+const String SEVERITY = 'severity';
 const String STACK_TRACE = 'stackTrace';
 const String START_COLUMN = 'startColumn';
 const String START_LINE = 'startLine';
@@ -193,8 +193,8 @@
 const String SUBCLASSES = 'subclasses';
 const String SUBSCRIPTIONS = 'subscriptions';
 const String SUGGESTIONS = 'suggestions';
-const String SUPERCLASS = 'superclass';
 const String SUPER_CLASS_MEMBER = 'superclassMember';
+const String SUPERCLASS = 'superclass';
 const String TARGETS = 'targets';
 const String TYPE = 'type';
 const String VALUE = 'value';
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 4ce26ae..fc2573c 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -637,13 +637,13 @@
   }
 
   /**
-   * Return the options from the analysis options file in the given [folder], or
-   * `null` if there is no file in the folder or if the contents of the file are
-   * not valid YAML.
+   * Return the options from the analysis options file in the given [folder]
+   * if exists, or in one of the parent folders, or `null` if no analysis
+   * options file is found or if the contents of the file are not valid YAML.
    */
   Map<String, Object> readOptions(Folder folder) {
     try {
-      return analysisOptionsProvider.getOptions(folder);
+      return analysisOptionsProvider.getOptions(folder, crawlUp: true);
     } catch (_) {
       // Parse errors are reported by GenerateOptionsErrorsTask.
     }
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index c16924a..6f71721 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -250,10 +250,12 @@
  * Sets the cache size in the given [context] to the given value.
  */
 void setCacheSize(AnalysisContext context, int cacheSize) {
-  AnalysisOptionsImpl options =
-      new AnalysisOptionsImpl.from(context.analysisOptions);
-  options.cacheSize = cacheSize;
-  context.analysisOptions = options;
+  // TODO(scheglov) The cache size cannot be changed with task model.
+  // TODO(scheglov) Consider removing this function.
+//  AnalysisOptionsImpl options =
+//      new AnalysisOptionsImpl.from(context.analysisOptions);
+//  options.cacheSize = cacheSize;
+//  context.analysisOptions = options;
 }
 
 String _computeLibraryName(CompilationUnit unit) {
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart
index d5b4916..253a4ad 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_plugin.dart
@@ -51,9 +51,6 @@
    */
   ExtensionPoint _contributorExtensionPoint;
 
-  @override
-  String get uniqueIdentifier => UNIQUE_IDENTIFIER;
-
   /**
    * Return a list containing all of the Dart specific completion contributors.
    */
@@ -62,6 +59,9 @@
           .map((DartCompletionContributorFactory factory) => factory());
 
   @override
+  String get uniqueIdentifier => UNIQUE_IDENTIFIER;
+
+  @override
   void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) {
     _contributorExtensionPoint = registerExtensionPoint(
         CONTRIBUTOR_EXTENSION_POINT,
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index c053754..73867fe 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -399,16 +399,16 @@
       // Use DirectoryBasedDartSdk.defaultSdkDirectory, which will make a guess.
       defaultSdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
     }
-    SdkCreator defaultSdkCreator = () {
+    SdkCreator defaultSdkCreator = (AnalysisOptions options) {
       DirectoryBasedDartSdk sdk =
           new DirectoryBasedDartSdk(defaultSdkDirectory);
-      sdk.useSummary = true;
+      sdk.analysisOptions = options;
       return sdk;
     };
     // TODO(brianwilkerson) It would be nice to avoid creating an SDK that
     // cannot be re-used, but the SDK is needed to create a package map provider
     // in the case where we need to run `pub` in order to get the package map.
-    DirectoryBasedDartSdk defaultSdk = defaultSdkCreator();
+    DirectoryBasedDartSdk defaultSdk = defaultSdkCreator(null);
     //
     // Initialize the instrumentation service.
     //
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index 1a1352f..e3a8f0b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -79,6 +79,32 @@
 }
 
 /**
+ * Determine if the completion target is the label for a named argument.
+ */
+bool _isEditingNamedArgLabel(DartCompletionRequest request) {
+  AstNode node = request.target.containingNode;
+  if (node is ArgumentList) {
+    var entity = request.target.entity;
+    if (entity is NamedExpression) {
+      int offset = request.offset;
+      if (entity.offset < offset && offset < entity.end) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+/**
+ * Determine if the completion target is an emtpy argument list.
+ */
+bool _isEmptyArgList(DartCompletionRequest request) {
+  AstNode node = request.target.containingNode;
+  return node is ArgumentList &&
+      node.leftParenthesis.next == node.rightParenthesis;
+}
+
+/**
  * Determine if the completion target is in the middle or beginning of the list
  * of named parameters and is not preceded by a comma. This method assumes that
  * _isAppendingToArgList has been called and is false.
@@ -117,32 +143,6 @@
 }
 
 /**
- * Determine if the completion target is the label for a named argument.
- */
-bool _isEditingNamedArgLabel(DartCompletionRequest request) {
-  AstNode node = request.target.containingNode;
-  if (node is ArgumentList) {
-    var entity = request.target.entity;
-    if (entity is NamedExpression) {
-      int offset = request.offset;
-      if (entity.offset < offset && offset < entity.end) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-/**
- * Determine if the completion target is an emtpy argument list.
- */
-bool _isEmptyArgList(DartCompletionRequest request) {
-  AstNode node = request.target.containingNode;
-  return node is ArgumentList &&
-      node.leftParenthesis.next == node.rightParenthesis;
-}
-
-/**
  * Return a collection of currently specified named arguments
  */
 Iterable<String> _namedArgs(DartCompletionRequest request) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index 8b1d7a2..4010ece 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -10,8 +10,8 @@
     hide Element, ElementKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
 
 /**
  * A contributor for calculating `completion.getSuggestions` request results
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 42ae3df..42d6823 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -18,6 +18,7 @@
 import 'package:analysis_server/src/services/completion/dart/contribution_sorter.dart';
 import 'package:analysis_server/src/services/completion/dart/optype.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -25,7 +26,6 @@
 import 'package:analyzer/src/context/context.dart'
     show AnalysisFutureHelper, AnalysisContextImpl;
 import 'package:analyzer/src/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisContextImpl;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_declaration_visitor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_declaration_visitor.dart
index 63c291e..e46b7e5 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_declaration_visitor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_declaration_visitor.dart
@@ -4,10 +4,10 @@
 
 library services.completion.dart.local.declaration.visitor;
 
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
 
 /**
  * `LocalDeclarationCollector` visits an [AstNode] and its parent recursively
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index f4c51be..2024b75 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -4,12 +4,13 @@
 
 library services.correction.assist;
 
+import 'dart:async';
+
 import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'dart:async';
 
 /**
  * Compute and return the assists available at the given selection (described by
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
index 5d8a96db..0d35566 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
@@ -7,8 +7,8 @@
 import 'package:analysis_server/plugin/protocol/protocol.dart'
     hide AnalysisError, Element;
 import 'package:analysis_server/src/services/correction/strings.dart';
-import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/src/generated/error.dart';
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/dependencies/reachable_source_collector.dart b/pkg/analysis_server/lib/src/services/dependencies/reachable_source_collector.dart
index a0273ce..d0160d8 100644
--- a/pkg/analysis_server/lib/src/services/dependencies/reachable_source_collector.dart
+++ b/pkg/analysis_server/lib/src/services/dependencies/reachable_source_collector.dart
@@ -33,7 +33,6 @@
   }
 
   void _addDependencies(Source source) {
-
     String sourceUri = source.uri.toString();
 
     // Careful not to revisit.
diff --git a/pkg/analysis_server/lib/src/services/index/index.dart b/pkg/analysis_server/lib/src/services/index/index.dart
index 5e866bc..bf5e47d 100644
--- a/pkg/analysis_server/lib/src/services/index/index.dart
+++ b/pkg/analysis_server/lib/src/services/index/index.dart
@@ -77,10 +77,21 @@
   }
 
   /**
+   * Index declarations in the given partially resolved [unit].
+   */
+  void indexDeclarations(CompilationUnit unit) {
+    if (unit?.element?.library == null) {
+      return;
+    }
+    AnalysisContext context = unit.element.context;
+    _getContextIndex(context).indexDeclarations(unit);
+  }
+
+  /**
    * Index the given fully resolved [unit].
    */
   void indexUnit(CompilationUnit unit) {
-    if (unit == null || unit.element == null) {
+    if (unit?.element?.library == null) {
       return;
     }
     AnalysisContext context = unit.element.context;
@@ -256,18 +267,21 @@
   }
 
   /**
+   * Index declarations in the given partially resolved [unit].
+   */
+  void indexDeclarations(CompilationUnit unit) {
+    PackageIndexAssembler assembler = new PackageIndexAssembler();
+    assembler.indexDeclarations(unit);
+    _putUnitIndexBuilder(unit, assembler);
+  }
+
+  /**
    * Index the given fully resolved [unit].
    */
   void indexUnit(CompilationUnit unit) {
-    // Index the unit.
     PackageIndexAssembler assembler = new PackageIndexAssembler();
-    assembler.index(unit);
-    PackageIndexBuilder indexBuilder = assembler.assemble();
-    // Put the index into the map.
-    List<int> indexBytes = indexBuilder.toBuffer();
-    PackageIndex index = new PackageIndex.fromBuffer(indexBytes);
-    String key = _getUnitKeyForElement(unit.element);
-    indexMap[key] = index;
+    assembler.indexUnit(unit);
+    _putUnitIndexBuilder(unit, assembler);
   }
 
   /**
@@ -300,6 +314,16 @@
     }
     return locations;
   }
+
+  void _putUnitIndexBuilder(
+      CompilationUnit unit, PackageIndexAssembler assembler) {
+    PackageIndexBuilder indexBuilder = assembler.assemble();
+    // Put the index into the map.
+    List<int> indexBytes = indexBuilder.toBuffer();
+    PackageIndex index = new PackageIndex.fromBuffer(indexBytes);
+    String key = _getUnitKeyForElement(unit.element);
+    indexMap[key] = index;
+  }
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 5387a81..c7c5776 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -17,10 +17,10 @@
 import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
index 265ee9b..e8cf7c4 100644
--- a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
@@ -297,11 +297,8 @@
 
     if (enabled) {
       // Should produce a type warning.
-      expect(
-          errors.map((error) => error.type),
-          unorderedEquals([
-            AnalysisErrorType.STATIC_TYPE_WARNING
-          ]));
+      expect(errors.map((error) => error.type),
+          unorderedEquals([AnalysisErrorType.STATIC_TYPE_WARNING]));
     } else {
       // Should only produce a hint.
       expect(errors.map((error) => error.type),
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index b241eda..cf8aed1 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -129,7 +129,7 @@
         index,
         serverPlugin,
         new AnalysisServerOptions(),
-        () => new MockSdk(),
+        (_) => new MockSdk(),
         InstrumentationService.NULL_SERVICE);
   }
 
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 85a6bbc..8527528e 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -144,7 +144,7 @@
         null,
         plugin,
         new AnalysisServerOptions(),
-        () => new MockSdk(),
+        (_) => new MockSdk(),
         InstrumentationService.NULL_SERVICE,
         rethrowExceptions: true);
     processRequiredPlugins();
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index 86defe8..f2cd236 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -365,14 +365,14 @@
 class JsonDecoderX{}
 f1() {var x=new !2j!1s!3}''',
         <String>[
-      "1+json",
-      "1+jxx",
-      "2+json",
-      "2+jxx",
-      "2-JsonDecoder",
-      "3+json",
-      "3-jxx"
-    ]);
+          "1+json",
+          "1+jxx",
+          "2+json",
+          "2+jxx",
+          "2-JsonDecoder",
+          "3+json",
+          "3-jxx"
+        ]);
 
     buildTests(
         'testCommentSnippets050',
@@ -389,17 +389,17 @@
   const x!2dr.!3a(1, 2, 3);
 }''',
         <String>[
-      "1+xdr",
-      "1+xa",
-      "1+xdr.a",
-      "1+xdr.b",
-      "2+xa", // suggest default constructor
-      "2+xdr", // suggest normal constructor
-      "2+xdr.a",
-      "2+xdr.b", // suggest named constructor
-      "3+b", // suggest named constructor
-      "3+a"
-    ]);
+          "1+xdr",
+          "1+xa",
+          "1+xdr.a",
+          "1+xdr.b",
+          "2+xa", // suggest default constructor
+          "2+xdr", // suggest normal constructor
+          "2+xdr.a",
+          "2+xdr.b", // suggest named constructor
+          "3+b", // suggest named constructor
+          "3+a"
+        ]);
 
     // Type propagation.
     buildTests(
@@ -569,18 +569,18 @@
   }
 }''',
         <String>[
-      "1+a",
-      "2+b",
-      "1-g",
-      "2-h",
-      "3+b",
-      "4+c",
-      "5+a",
-      "6+c",
-      "7+g",
-      "8+j",
-      "9+h"
-    ]);
+          "1+a",
+          "2+b",
+          "1-g",
+          "2-h",
+          "3+b",
+          "4+c",
+          "5+a",
+          "6+c",
+          "7+g",
+          "8+j",
+          "9+h"
+        ]);
 
     buildTests(
         'testCommentSnippets065',
@@ -818,12 +818,12 @@
 }
 f() => new Fil!1''',
         <String>[
-      "1+File",
-      "1+File.fromPath",
-      "1+FileMode",
-      "1+FileMode._internal1",
-      "1+FileMode._internal"
-    ]);
+          "1+File",
+          "1+File.fromPath",
+          "1+FileMode",
+          "1+FileMode._internal1",
+          "1+FileMode._internal"
+        ]);
 
     buildTests(
         'testCommentSnippets078',
@@ -1265,14 +1265,14 @@
   methodB() {}
 }''',
         <String>[
-      "1+aaa",
-      "1-bbb",
-      "2+int",
-      "2-double",
-      "3+methodA",
-      "3+methodB",
-      "3-int"
-    ]);
+          "1+aaa",
+          "1-bbb",
+          "2+int",
+          "2-double",
+          "3+methodA",
+          "3+methodB",
+          "3-int"
+        ]);
 
     buildTests(
         'testCompletion_dartDoc_reference_incomplete',
@@ -1292,13 +1292,13 @@
  */
 class C {}''',
         <String>[
-      "1+double",
-      "1-int",
-      "2+int",
-      "2+String",
-      "3+int",
-      "3+String"
-    ]);
+          "1+double",
+          "1-int",
+          "2+int",
+          "2+String",
+          "3+int",
+          "3+String"
+        ]);
 
     buildTests(
         'testCompletion_double_inFractionPart',
@@ -1328,14 +1328,14 @@
   Str!3;
 }''',
         <String>[
-      "1+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
-      "1+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
-      "2+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
-      "2+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
-      "3+String" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
-      "3+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
-      "3+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/
-    ]);
+          "1+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+          "1+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+          "2+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+          "2+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+          "3+String" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+          "3+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+          "3+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/
+        ]);
 
     buildTests(
         'testCompletion_export_dart',
@@ -1594,13 +1594,13 @@
   var v2 = p is!4;
 }''',
         <String>[
-      "1+MyClass",
-      "2+MyClass",
-      "3+MyClass",
-      "3-v1",
-      "4+is",
-      "4-isVariable"
-    ]);
+          "1+MyClass",
+          "2+MyClass",
+          "3+MyClass",
+          "3-v1",
+          "4+is",
+          "4-isVariable"
+        ]);
 
     buildTests(
         'testCompletion_is_asIdentifierStart',
@@ -1719,9 +1719,9 @@
   foo(Functions.!1);
 }''',
         <String>[
-      "1+myFunc" /*":" + ProposalKind.METHOD*/,
-      "1+myFunc" /*":" + ProposalKind.METHOD_NAME*/
-    ]);
+          "1+myFunc" /*":" + ProposalKind.METHOD*/,
+          "1+myFunc" /*":" + ProposalKind.METHOD_NAME*/
+        ]);
 
     buildTests(
         'testCompletion_namedArgument_alreadyUsed',
@@ -2209,13 +2209,13 @@
             f2() {var x=new json.JsonDe!2}
             f3() {var x=new json.JsonDecoder!3}''',
         <String>[
-      "1+JsonDecoder",
-      "1-JsonDecoderX",
-      "2+JsonDecoder",
-      "2-JsonDecoderX",
-      "3+JsonDecoder",
-      "3-JsonDecoderX"
-    ]);
+          "1+JsonDecoder",
+          "1-JsonDecoderX",
+          "2+JsonDecoder",
+          "2-JsonDecoderX",
+          "3+JsonDecoder",
+          "3-JsonDecoderX"
+        ]);
 
     // TODO Enable after type propagation is implemented. Not yet.
     // TODO Include corelib analysis
@@ -2357,14 +2357,14 @@
   v.!1toString!2().!3hash!4Code
 }''',
         <String>[
-      "1+toString",
-      "1-==",
-      "2+toString",
-      "3+hashCode",
-      "3+toString",
-      "4+hashCode",
-      "4-toString"
-    ]);
+          "1+toString",
+          "1-==",
+          "2+toString",
+          "3+hashCode",
+          "3+toString",
+          "4+hashCode",
+          "4-toString"
+        ]);
 
     buildTests(
         'test002',
@@ -2748,22 +2748,22 @@
   }
 }''',
         <String>[
-      "1+m",
-      "2+_m",
-      "3+g",
-      "4+m",
-      "5+_m",
-      "6+g",
-      "7-g",
-      "8-m",
-      "9-_m",
-      "A+_m",
-      "B+m",
-      "C+g",
-      "D+_m",
-      "E+m",
-      "F+g"
-    ]);
+          "1+m",
+          "2+_m",
+          "3+g",
+          "4+m",
+          "5+_m",
+          "6+g",
+          "7-g",
+          "8-m",
+          "9-_m",
+          "A+_m",
+          "B+m",
+          "C+g",
+          "D+_m",
+          "E+m",
+          "F+g"
+        ]);
 
     buildTests('test026', '''var aBcD; var x=ab!1''', <String>["1+aBcD"]);
 
@@ -2799,15 +2799,15 @@
   }
 }''',
         <String>[
-      "1+ONE",
-      "1-UKSI",
-      "2+EIN",
-      "2-ICHI",
-      "3+ICHI",
-      "3+UKSI",
-      "3+EIN",
-      "3+ONE"
-    ]);
+          "1+ONE",
+          "1-UKSI",
+          "2+EIN",
+          "2-ICHI",
+          "3+ICHI",
+          "3+UKSI",
+          "3+EIN",
+          "3+ONE"
+        ]);
 
     buildTests(
         'test033',
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 8dbe635..cee64f0 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -153,7 +153,7 @@
     processRequiredPlugins();
     resourceProvider = new MemoryResourceProvider();
     packageMapProvider = new MockPackageMapProvider();
-    DartSdkManager sdkManager = new DartSdkManager(() {
+    DartSdkManager sdkManager = new DartSdkManager((_) {
       return new MockSdk();
     });
     manager = new ContextManagerImpl(
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index f8c0afd..da13829 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -47,7 +47,7 @@
         null,
         serverPlugin,
         new AnalysisServerOptions(),
-        () => new MockSdk(),
+        (_) => new MockSdk(),
         InstrumentationService.NULL_SERVICE);
     handler = new AnalysisDomainHandler(server);
   });
@@ -474,7 +474,7 @@
         null,
         serverPlugin,
         new AnalysisServerOptions(),
-        () => new MockSdk(),
+        (_) => new MockSdk(),
         InstrumentationService.NULL_SERVICE);
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 61734b6..3435be7 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -211,47 +211,6 @@
     });
   }
 
-  test_invocation() {
-    addTestFile('class A {b() {}} main() {A a; a.^}');
-    return getSuggestions().then((_) {
-      expect(replacementOffset, equals(completionOffset));
-      expect(replacementLength, equals(0));
-      assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
-    });
-  }
-
-  test_invocation_sdk_relevancy_off() {
-    var originalSorter = DartCompletionManager.contributionSorter;
-    var mockSorter = new MockRelevancySorter();
-    DartCompletionManager.contributionSorter = mockSorter;
-    addTestFile('main() {Map m; m.^}');
-    return getSuggestions().then((_) {
-      // Assert that the CommonUsageComputer has been replaced
-      expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
-          isFalse);
-      DartCompletionManager.contributionSorter = originalSorter;
-      mockSorter.enabled = false;
-    });
-  }
-
-  test_invocation_sdk_relevancy_on() {
-    addTestFile('main() {Map m; m.^}');
-    return getSuggestions().then((_) {
-      // Assert that the CommonUsageComputer is working
-      expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
-          isTrue);
-    });
-  }
-
-  test_invocation_withTrailingStmt() {
-    addTestFile('class A {b() {}} main() {A a; a.^ int x = 7;}');
-    return getSuggestions().then((_) {
-      expect(replacementOffset, equals(completionOffset));
-      expect(replacementLength, equals(0));
-      assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
-    });
-  }
-
   test_inComment_block_beforeNode() async {
     addTestFile('''
   main(aaa, bbb) {
@@ -348,6 +307,47 @@
     });
   }
 
+  test_invocation() {
+    addTestFile('class A {b() {}} main() {A a; a.^}');
+    return getSuggestions().then((_) {
+      expect(replacementOffset, equals(completionOffset));
+      expect(replacementLength, equals(0));
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
+    });
+  }
+
+  test_invocation_sdk_relevancy_off() {
+    var originalSorter = DartCompletionManager.contributionSorter;
+    var mockSorter = new MockRelevancySorter();
+    DartCompletionManager.contributionSorter = mockSorter;
+    addTestFile('main() {Map m; m.^}');
+    return getSuggestions().then((_) {
+      // Assert that the CommonUsageComputer has been replaced
+      expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
+          isFalse);
+      DartCompletionManager.contributionSorter = originalSorter;
+      mockSorter.enabled = false;
+    });
+  }
+
+  test_invocation_sdk_relevancy_on() {
+    addTestFile('main() {Map m; m.^}');
+    return getSuggestions().then((_) {
+      // Assert that the CommonUsageComputer is working
+      expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
+          isTrue);
+    });
+  }
+
+  test_invocation_withTrailingStmt() {
+    addTestFile('class A {b() {}} main() {A a; a.^ int x = 7;}');
+    return getSuggestions().then((_) {
+      expect(replacementOffset, equals(completionOffset));
+      expect(replacementLength, equals(0));
+      assertHasResult(CompletionSuggestionKind.INVOCATION, 'b');
+    });
+  }
+
   test_keyword() {
     addTestFile('library A; cl^');
     return getSuggestions().then((_) {
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index 277279a..d6de07f 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -53,7 +53,7 @@
         null,
         serverPlugin,
         new AnalysisServerOptions(),
-        () => new MockSdk(),
+        (_) => new MockSdk(),
         InstrumentationService.NULL_SERVICE);
     handler = new DiagnosticDomainHandler(server);
   });
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index e6d1dfb..7824a1b 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -48,7 +48,7 @@
           null,
           serverPlugin,
           new AnalysisServerOptions(),
-          () => new MockSdk(),
+          (_) => new MockSdk(),
           InstrumentationService.NULL_SERVICE);
       handler = new ExecutionDomainHandler(server);
     });
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 6dc24d1..5c3d75e 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -37,7 +37,7 @@
         null,
         serverPlugin,
         new AnalysisServerOptions(),
-        () => new MockSdk(),
+        (_) => new MockSdk(),
         InstrumentationService.NULL_SERVICE);
     handler = new ServerDomainHandler(server);
   });
diff --git a/pkg/analysis_server/test/edit/format_test.dart b/pkg/analysis_server/test/edit/format_test.dart
index e04ccf1..d864ef9 100644
--- a/pkg/analysis_server/test/edit/format_test.dart
+++ b/pkg/analysis_server/test/edit/format_test.dart
@@ -107,7 +107,7 @@
 
   Future test_format_withErrors() {
     addTestFile('''
-main() { int x = 
+main() { int x =
 ''');
     return waitForTasksFinished().then((_) {
       Request request = new EditFormatParams(testFile, 0, 3).toRequest('0');
@@ -119,8 +119,9 @@
   EditFormatResult _formatAt(int selectionOffset, int selectionLength,
       {int lineLength}) {
     Request request = new EditFormatParams(
-        testFile, selectionOffset, selectionLength,
-        lineLength: lineLength).toRequest('0');
+            testFile, selectionOffset, selectionLength,
+            lineLength: lineLength)
+        .toRequest('0');
     Response response = handleSuccessfulRequest(request);
     return new EditFormatResult.fromResponse(response);
   }
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 6ea46cf..b451396 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -27,36 +27,44 @@
     String badText = goodText.replaceAll(';', '');
     writeFile(pathname, badText);
     standardAnalysisSetup();
-    return analysisFinished.then((_) {
-      // The contents on disk (badText) are missing a semicolon.
-      expect(currentAnalysisErrors[pathname], isNotEmpty);
-    })
+    return analysisFinished
+        .then((_) {
+          // The contents on disk (badText) are missing a semicolon.
+          expect(currentAnalysisErrors[pathname], isNotEmpty);
+        })
         .then((_) => sendAnalysisUpdateContent(
             {pathname: new AddContentOverlay(goodText)}))
         .then((result) => analysisFinished)
         .then((_) {
-      // There should be no errors now because the contents on disk have been
-      // overriden with goodText.
-      expect(currentAnalysisErrors[pathname], isEmpty);
-      return sendAnalysisUpdateContent({
-        pathname: new ChangeContentOverlay(
-            [new SourceEdit(goodText.indexOf(';'), 1, '')])
-      });
-    }).then((result) => analysisFinished).then((_) {
-      // There should be errors now because we've removed the semicolon.
-      expect(currentAnalysisErrors[pathname], isNotEmpty);
-      return sendAnalysisUpdateContent({
-        pathname: new ChangeContentOverlay(
-            [new SourceEdit(goodText.indexOf(';'), 0, ';')])
-      });
-    }).then((result) => analysisFinished).then((_) {
-      // There should be no errors now because we've added the semicolon back.
-      expect(currentAnalysisErrors[pathname], isEmpty);
-      return sendAnalysisUpdateContent({pathname: new RemoveContentOverlay()});
-    }).then((result) => analysisFinished).then((_) {
-      // Now there should be errors again, because the contents on disk are no
-      // longer overridden.
-      expect(currentAnalysisErrors[pathname], isNotEmpty);
-    });
+          // There should be no errors now because the contents on disk have been
+          // overriden with goodText.
+          expect(currentAnalysisErrors[pathname], isEmpty);
+          return sendAnalysisUpdateContent({
+            pathname: new ChangeContentOverlay(
+                [new SourceEdit(goodText.indexOf(';'), 1, '')])
+          });
+        })
+        .then((result) => analysisFinished)
+        .then((_) {
+          // There should be errors now because we've removed the semicolon.
+          expect(currentAnalysisErrors[pathname], isNotEmpty);
+          return sendAnalysisUpdateContent({
+            pathname: new ChangeContentOverlay(
+                [new SourceEdit(goodText.indexOf(';'), 0, ';')])
+          });
+        })
+        .then((result) => analysisFinished)
+        .then((_) {
+          // There should be no errors now because we've added the semicolon back.
+          expect(currentAnalysisErrors[pathname], isEmpty);
+          return sendAnalysisUpdateContent(
+              {pathname: new RemoveContentOverlay()});
+        })
+        .then((result) => analysisFinished)
+        .then((_) {
+          // Now there should be errors again, because the contents on disk are no
+          // longer overridden.
+          expect(currentAnalysisErrors[pathname], isNotEmpty);
+        });
   }
 }
diff --git a/pkg/analysis_server/test/mock_sdk.dart b/pkg/analysis_server/test/mock_sdk.dart
index c43ef63..dc028c4 100644
--- a/pkg/analysis_server/test/mock_sdk.dart
+++ b/pkg/analysis_server/test/mock_sdk.dart
@@ -219,7 +219,7 @@
   @override
   AnalysisContext get context {
     if (_analysisContext == null) {
-      _analysisContext = new SdkAnalysisContext();
+      _analysisContext = new SdkAnalysisContext(null);
       SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
       _analysisContext.sourceFactory = factory;
     }
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index e7f4fea..c435848 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -77,19 +77,6 @@
   }
 
   /**
-   * Assert that the specified suggestions are the only suggestions.
-   */
-  void assertSuggestions(List<String> suggestions) {
-    List<CompletionSuggestion> expected = new List<CompletionSuggestion>();
-    for (String suggestion in suggestions) {
-      expected.add(assertSuggest('$suggestion',
-          csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
-          relevance: DART_RELEVANCE_NAMED_PARAMETER));
-    }
-    assertNoOtherSuggestions(expected);
-  }
-
-  /**
    * Assert that the specified named argument suggestions are the only
    * suggestions.
    */
@@ -103,18 +90,48 @@
     assertNoOtherSuggestions(expected);
   }
 
+  /**
+   * Assert that the specified suggestions are the only suggestions.
+   */
+  void assertSuggestions(List<String> suggestions) {
+    List<CompletionSuggestion> expected = new List<CompletionSuggestion>();
+    for (String suggestion in suggestions) {
+      expected.add(assertSuggest('$suggestion',
+          csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
+          relevance: DART_RELEVANCE_NAMED_PARAMETER));
+    }
+    assertNoOtherSuggestions(expected);
+  }
+
   @override
   DartCompletionContributor createContributor() {
     return new ArgListContributor();
   }
 
-  test_Annotation_local_constructor_named_param_negative() async {
+  fail_test_Annotation_local_constructor_named_param_10() async {
     addTestSource('''
-class A { const A(int one, int two, int three, {int four, String five:
-  'defaultValue'}); }
-@A(1, ^, 3) main() { }''');
+class A { const A({int one, String two: 'defaultValue'}); }
+@A(two: '2' ^) main() { }''');
     await computeSuggestions();
-    assertNoSuggestions();
+    assertSuggestions([', one: ']);
+  }
+
+  fail_test_Annotation_local_constructor_named_param_9() async {
+    addTestSource('''
+class A { const A({int one, String two: 'defaultValue'}); }
+@A(two: '2'^) main() { }''');
+    await computeSuggestions();
+    assertSuggestions([', one: ']);
+  }
+
+  test_Annotation_imported_constructor_named_param() async {
+    addSource(
+        '/libA.dart',
+        '''
+library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
+    addTestSource('import "/libA.dart"; @A(^) main() { }');
+    await computeSuggestions();
+    assertSuggestArguments(namedArguments: ['one', 'two']);
   }
 
   test_Annotation_local_constructor_named_param() async {
@@ -125,6 +142,14 @@
     assertSuggestArguments(namedArguments: ['one', 'two']);
   }
 
+  test_Annotation_local_constructor_named_param_11() async {
+    addTestSource('''
+class A { const A({int one, String two: 'defaultValue'}); }
+@A(two: '2', ^) main() { }''');
+    await computeSuggestions();
+    assertSuggestArguments(namedArguments: ['one']);
+  }
+
   test_Annotation_local_constructor_named_param_2() async {
     addTestSource('''
 class A { const A({int one, String two: 'defaultValue'}); }
@@ -181,38 +206,13 @@
     assertSuggestions(['one: ,']);
   }
 
-  fail_test_Annotation_local_constructor_named_param_9() async {
+  test_Annotation_local_constructor_named_param_negative() async {
     addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2'^) main() { }''');
+class A { const A(int one, int two, int three, {int four, String five:
+  'defaultValue'}); }
+@A(1, ^, 3) main() { }''');
     await computeSuggestions();
-    assertSuggestions([', one: ']);
-  }
-
-  fail_test_Annotation_local_constructor_named_param_10() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2' ^) main() { }''');
-    await computeSuggestions();
-    assertSuggestions([', one: ']);
-  }
-
-  test_Annotation_local_constructor_named_param_11() async {
-    addTestSource('''
-class A { const A({int one, String two: 'defaultValue'}); }
-@A(two: '2', ^) main() { }''');
-    await computeSuggestions();
-    assertSuggestArguments(namedArguments: ['one']);
-  }
-
-  test_Annotation_imported_constructor_named_param() async {
-    addSource(
-        '/libA.dart',
-        '''
-library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
-    addTestSource('import "/libA.dart"; @A(^) main() { }');
-    await computeSuggestions();
-    assertSuggestArguments(namedArguments: ['one', 'two']);
+    assertNoSuggestions();
   }
 
   test_ArgumentList_getter() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index 921525b..90856f7 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -7,11 +7,11 @@
 import 'package:analysis_server/plugin/protocol/protocol.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../utils.dart';
 import 'completion_contributor_util.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 main() {
   initializeTestEnvironment();
diff --git a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
index a864b34..568d796 100644
--- a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
@@ -4,6 +4,7 @@
 
 library test.services.completion.contributor.dart.inherited_ref;
 
+import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/inherited_reference_contributor.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -11,7 +12,6 @@
 
 import '../../../utils.dart';
 import 'completion_contributor_util.dart';
-import 'package:analysis_server/src/protocol_server.dart';
 
 main() {
   initializeTestEnvironment();
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index fd218a0..ddb0211 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -32,6 +32,21 @@
     assertNotSuggested('loadLibrary');
   }
 
+  test_libraryPrefix2() async {
+    // SimpleIdentifier  MethodInvocation  ExpressionStatement
+    addTestSource('import "dart:async" as bar; foo() {bar.^ print("f")}');
+    await computeSuggestions();
+    assertSuggestClass('Future');
+  }
+
+  test_libraryPrefix3() async {
+    // SimpleIdentifier  MethodInvocation  ExpressionStatement
+    addTestSource('import "dart:async" as bar; foo() {new bar.F^ print("f")}');
+    await computeSuggestions();
+    assertSuggestConstructor('Future');
+    assertSuggestConstructor('Future.delayed');
+  }
+
   test_libraryPrefix_cascade() async {
     addTestSource('''
     import "dart:math" as math;
@@ -64,21 +79,6 @@
     assertSuggestFunction('min', 'num');
   }
 
-  test_libraryPrefix2() async {
-    // SimpleIdentifier  MethodInvocation  ExpressionStatement
-    addTestSource('import "dart:async" as bar; foo() {bar.^ print("f")}');
-    await computeSuggestions();
-    assertSuggestClass('Future');
-  }
-
-  test_libraryPrefix3() async {
-    // SimpleIdentifier  MethodInvocation  ExpressionStatement
-    addTestSource('import "dart:async" as bar; foo() {new bar.F^ print("f")}');
-    await computeSuggestions();
-    assertSuggestConstructor('Future');
-    assertSuggestConstructor('Future.delayed');
-  }
-
   test_libraryPrefix_deferred() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestSource('import "dart:async" deferred as bar; foo() {bar.^}');
diff --git a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
index 64773f4..172d767 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
@@ -61,333 +61,6 @@
     return new LocalConstructorContributor();
   }
 
-  test_constructor_parameters_mixed_required_and_named() async {
-    addTestSource('class A {A(x, {int y}) {^}}');
-    await computeSuggestions();
-    assertNotSuggested('x');
-    assertNotSuggested('y');
-  }
-
-  test_constructor_parameters_mixed_required_and_positional() async {
-    addTestSource('class A {A(x, [int y]) {^}}');
-    await computeSuggestions();
-    assertNotSuggested('x');
-    assertNotSuggested('y');
-  }
-
-  test_constructor_parameters_named() async {
-    addTestSource('class A {A({x, int y}) {^}}');
-    await computeSuggestions();
-    assertNotSuggested('x');
-    assertNotSuggested('y');
-  }
-
-  test_constructor_parameters_positional() async {
-    addTestSource('class A {A([x, int y]) {^}}');
-    await computeSuggestions();
-    assertNotSuggested('x');
-    assertNotSuggested('y');
-  }
-
-  test_constructor_parameters_required() async {
-    addTestSource('class A {A(x, int y) {^}}');
-    await computeSuggestions();
-    assertNotSuggested('x');
-    assertNotSuggested('y');
-  }
-
-  test_enum() async {
-    addTestSource('enum E { one, two } main() {^}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-  }
-
-  test_enum_deprecated() async {
-    addTestSource('@deprecated enum E { one, two } main() {^}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-  }
-
-  test_function_parameters_mixed_required_and_named() async {
-    addTestSource('''
-void m(x, {int y}) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_function_parameters_mixed_required_and_positional() async {
-    addTestSource('''
-void m(x, [int y]) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_function_parameters_named() async {
-    addTestSource('''
-void m({x, int y}) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_function_parameters_none() async {
-    addTestSource('''
-void m() {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_function_parameters_positional() async {
-    addTestSource('''
-void m([x, int y]) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_function_parameters_required() async {
-    addTestSource('''
-void m(x, int y) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_ignore_symbol_being_completed() async {
-    addTestSource('class MyClass { } main(MC^) { }');
-    await computeSuggestions();
-    assertNotSuggested('MyClass');
-    assertNotSuggested('MC');
-  }
-
-  test_inDartDoc_reference1() async {
-    addTestSource('''
-/// The [^
-main(aaa, bbb) {}''');
-    await computeSuggestions();
-    assertNotSuggested('main');
-  }
-
-  test_inDartDoc_reference2() async {
-    addTestSource('''
-/// The [m^
-main(aaa, bbb) {}''');
-    await computeSuggestions();
-    assertNotSuggested('main');
-  }
-
-  test_inDartDoc_reference3() async {
-    addTestSource('''
-/// The [^]
-main(aaa, bbb) {}''');
-    await computeSuggestions();
-    assertNotSuggested('main');
-  }
-
-  test_inDartDoc_reference4() async {
-    addTestSource('''
-/// The [m^]
-main(aaa, bbb) {}''');
-    await computeSuggestions();
-    assertNotSuggested('main');
-  }
-
-  test_InstanceCreationExpression() async {
-    addTestSource('''
-class A {foo(){var f; {var x;}}}
-class B {B(this.x, [String boo]) { } int x;}
-class C {C.bar({boo: 'hoo', int z: 0}) { } }
-main() {new ^ String x = "hello";}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion;
-
-    suggestion = assertSuggestConstructor('A', elemOffset: -1);
-    expect(suggestion.element.parameters, '()');
-    expect(suggestion.element.returnType, 'A');
-    expect(suggestion.declaringType, 'A');
-    expect(suggestion.parameterNames, hasLength(0));
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, false);
-
-    suggestion = assertSuggestConstructor('B');
-    expect(suggestion.element.parameters, '(int x, [String boo])');
-    expect(suggestion.element.returnType, 'B');
-    expect(suggestion.declaringType, 'B');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.parameterNames[1], 'boo');
-    expect(suggestion.parameterTypes[1], 'String');
-    expect(suggestion.requiredParameterCount, 1);
-    expect(suggestion.hasNamedParameters, false);
-
-    suggestion = assertSuggestConstructor('C.bar');
-    expect(suggestion.element.parameters, '({dynamic boo: \'hoo\', int z: 0})');
-    expect(suggestion.element.returnType, 'C');
-    expect(suggestion.declaringType, 'C');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'boo');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'z');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, true);
-  }
-
-  test_method_parameters_mixed_required_and_named() async {
-    addTestSource('''
-class A {
-  void m(x, {int y}) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_mixed_required_and_positional() async {
-    addTestSource('''
-class A {
-  void m(x, [int y]) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_named() async {
-    addTestSource('''
-class A {
-  void m({x, int y}) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_none() async {
-    addTestSource('''
-class A {
-  void m() {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_positional() async {
-    addTestSource('''
-class A {
-  void m([x, int y]) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_required() async {
-    addTestSource('''
-class A {
-  void m(x, int y) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_missing_params_constructor() async {
-    addTestSource('class C1{C1{} main(){C^}}');
-    await computeSuggestions();
-  }
-
-  test_missing_params_function() async {
-    addTestSource('int f1{} main(){f^}');
-    await computeSuggestions();
-  }
-
-  test_missing_params_method() async {
-    addTestSource('class C1{int f1{} main(){f^}}');
-    await computeSuggestions();
-  }
-
-  test_overrides() async {
-    addTestSource('''
-class A {m() {}}
-class B extends A {m() {^}}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_prioritization() async {
-    addTestSource('main() {var ab; var _ab; ^}');
-    await computeSuggestions();
-    assertNotSuggested('ab');
-    assertNotSuggested('_ab');
-  }
-
-  test_prioritization_private() async {
-    addTestSource('main() {var ab; var _ab; _^}');
-    await computeSuggestions();
-    assertNotSuggested('ab');
-    assertNotSuggested('_ab');
-  }
-
-  test_prioritization_public() async {
-    addTestSource('main() {var ab; var _ab; a^}');
-    await computeSuggestions();
-    assertNotSuggested('ab');
-    assertNotSuggested('_ab');
-  }
-
-  test_shadowed_name() async {
-    addTestSource('var a; class A { var a; m() { ^ } }');
-    await computeSuggestions();
-    assertNotSuggested('a');
-  }
-
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
     addSource(
@@ -1946,6 +1619,41 @@
     //assertNotSuggested('T1');
   }
 
+  test_constructor_parameters_mixed_required_and_named() async {
+    addTestSource('class A {A(x, {int y}) {^}}');
+    await computeSuggestions();
+    assertNotSuggested('x');
+    assertNotSuggested('y');
+  }
+
+  test_constructor_parameters_mixed_required_and_positional() async {
+    addTestSource('class A {A(x, [int y]) {^}}');
+    await computeSuggestions();
+    assertNotSuggested('x');
+    assertNotSuggested('y');
+  }
+
+  test_constructor_parameters_named() async {
+    addTestSource('class A {A({x, int y}) {^}}');
+    await computeSuggestions();
+    assertNotSuggested('x');
+    assertNotSuggested('y');
+  }
+
+  test_constructor_parameters_positional() async {
+    addTestSource('class A {A([x, int y]) {^}}');
+    await computeSuggestions();
+    assertNotSuggested('x');
+    assertNotSuggested('y');
+  }
+
+  test_constructor_parameters_required() async {
+    addTestSource('class A {A(x, int y) {^}}');
+    await computeSuggestions();
+    assertNotSuggested('x');
+    assertNotSuggested('y');
+  }
+
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
@@ -2078,6 +1786,22 @@
     assertNotSuggested('bar');
   }
 
+  test_enum() async {
+    addTestSource('enum E { one, two } main() {^}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+  }
+
+  test_enum_deprecated() async {
+    addTestSource('@deprecated enum E { one, two } main() {^}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+  }
+
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
     addSource(
@@ -2301,6 +2025,72 @@
     assertNotSuggested('bar');
   }
 
+  test_function_parameters_mixed_required_and_named() async {
+    addTestSource('''
+void m(x, {int y}) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_function_parameters_mixed_required_and_positional() async {
+    addTestSource('''
+void m(x, [int y]) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_function_parameters_named() async {
+    addTestSource('''
+void m({x, int y}) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_function_parameters_none() async {
+    addTestSource('''
+void m() {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_function_parameters_positional() async {
+    addTestSource('''
+void m([x, int y]) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_function_parameters_required() async {
+    addTestSource('''
+void m(x, int y) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
   test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
     addSource(
@@ -2473,6 +2263,13 @@
     assertNotSuggested('==');
   }
 
+  test_ignore_symbol_being_completed() async {
+    addTestSource('class MyClass { } main(MC^) { }');
+    await computeSuggestions();
+    assertNotSuggested('MyClass');
+    assertNotSuggested('MC');
+  }
+
   test_ImportDirective_dart() async {
     // SimpleStringLiteral  ImportDirective
     addTestSource('''
@@ -2483,6 +2280,38 @@
     assertNoSuggestions();
   }
 
+  test_inDartDoc_reference1() async {
+    addTestSource('''
+/// The [^
+main(aaa, bbb) {}''');
+    await computeSuggestions();
+    assertNotSuggested('main');
+  }
+
+  test_inDartDoc_reference2() async {
+    addTestSource('''
+/// The [m^
+main(aaa, bbb) {}''');
+    await computeSuggestions();
+    assertNotSuggested('main');
+  }
+
+  test_inDartDoc_reference3() async {
+    addTestSource('''
+/// The [^]
+main(aaa, bbb) {}''');
+    await computeSuggestions();
+    assertNotSuggested('main');
+  }
+
+  test_inDartDoc_reference4() async {
+    addTestSource('''
+/// The [m^]
+main(aaa, bbb) {}''');
+    await computeSuggestions();
+    assertNotSuggested('main');
+  }
+
   test_IndexExpression() async {
     // ExpressionStatement  Block
     addSource(
@@ -2533,6 +2362,48 @@
     //assertNotSuggested('T1');
   }
 
+  test_InstanceCreationExpression() async {
+    addTestSource('''
+class A {foo(){var f; {var x;}}}
+class B {B(this.x, [String boo]) { } int x;}
+class C {C.bar({boo: 'hoo', int z: 0}) { } }
+main() {new ^ String x = "hello";}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion;
+
+    suggestion = assertSuggestConstructor('A', elemOffset: -1);
+    expect(suggestion.element.parameters, '()');
+    expect(suggestion.element.returnType, 'A');
+    expect(suggestion.declaringType, 'A');
+    expect(suggestion.parameterNames, hasLength(0));
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+
+    suggestion = assertSuggestConstructor('B');
+    expect(suggestion.element.parameters, '(int x, [String boo])');
+    expect(suggestion.element.returnType, 'B');
+    expect(suggestion.declaringType, 'B');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'int');
+    expect(suggestion.parameterNames[1], 'boo');
+    expect(suggestion.parameterTypes[1], 'String');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+
+    suggestion = assertSuggestConstructor('C.bar');
+    expect(suggestion.element.parameters, '({dynamic boo: \'hoo\', int z: 0})');
+    expect(suggestion.element.returnType, 'C');
+    expect(suggestion.declaringType, 'C');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'boo');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'z');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
   test_InstanceCreationExpression_imported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
     addSource(
@@ -2811,6 +2682,14 @@
     assertNoSuggestions();
   }
 
+  test_localVariableDeclarationName() async {
+    addTestSource('main() {String m^}');
+    await computeSuggestions();
+
+    assertNotSuggested('main');
+    assertNotSuggested('min');
+  }
+
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
     addSource(
@@ -2890,6 +2769,84 @@
     assertNotSuggested('T2');
   }
 
+  test_method_parameters_mixed_required_and_named() async {
+    addTestSource('''
+class A {
+  void m(x, {int y}) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_mixed_required_and_positional() async {
+    addTestSource('''
+class A {
+  void m(x, [int y]) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_named() async {
+    addTestSource('''
+class A {
+  void m({x, int y}) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_none() async {
+    addTestSource('''
+class A {
+  void m() {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_positional() async {
+    addTestSource('''
+class A {
+  void m([x, int y]) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_required() async {
+    addTestSource('''
+class A {
+  void m(x, int y) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
   test_MethodDeclaration_body_getters() async {
     // Block  BlockFunctionBody  MethodDeclaration
     addTestSource('class A {@deprecated X get f => 0; Z a() {^} get _g => 1;}');
@@ -3147,6 +3104,21 @@
     assertNotSuggested('==');
   }
 
+  test_missing_params_constructor() async {
+    addTestSource('class C1{C1{} main(){C^}}');
+    await computeSuggestions();
+  }
+
+  test_missing_params_function() async {
+    addTestSource('int f1{} main(){f^}');
+    await computeSuggestions();
+  }
+
+  test_missing_params_method() async {
+    addTestSource('class C1{int f1{} main(){f^}}');
+    await computeSuggestions();
+  }
+
   test_new_instance() async {
     addTestSource('import "dart:math"; class A {x() {new Random().^}}');
     await computeSuggestions();
@@ -3159,6 +3131,15 @@
     assertNotSuggested('A');
   }
 
+  test_overrides() async {
+    addTestSource('''
+class A {m() {}}
+class B extends A {m() {^}}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
   test_parameterName_excludeTypes() async {
     addTestSource('m(int ^) {}');
     await computeSuggestions();
@@ -3595,14 +3576,6 @@
     assertNotSuggested('length');
   }
 
-  test_localVariableDeclarationName() async {
-    addTestSource('main() {String m^}');
-    await computeSuggestions();
-
-    assertNotSuggested('main');
-    assertNotSuggested('min');
-  }
-
   test_PrefixedIdentifier_trailingStmt_param2() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestSource('f(String g) {g.^ int y = 0;}');
@@ -3619,6 +3592,27 @@
     assertNotSuggested('length');
   }
 
+  test_prioritization() async {
+    addTestSource('main() {var ab; var _ab; ^}');
+    await computeSuggestions();
+    assertNotSuggested('ab');
+    assertNotSuggested('_ab');
+  }
+
+  test_prioritization_private() async {
+    addTestSource('main() {var ab; var _ab; _^}');
+    await computeSuggestions();
+    assertNotSuggested('ab');
+    assertNotSuggested('_ab');
+  }
+
+  test_prioritization_public() async {
+    addTestSource('main() {var ab; var _ab; a^}');
+    await computeSuggestions();
+    assertNotSuggested('ab');
+    assertNotSuggested('_ab');
+  }
+
   test_PropertyAccess_expression() async {
     // SimpleIdentifier  MethodInvocation  PropertyAccess  ExpressionStatement
     addTestSource('class A {a() {"hello".to^String().length}}');
@@ -3665,6 +3659,12 @@
     assertNotSuggested('==');
   }
 
+  test_shadowed_name() async {
+    addTestSource('var a; class A { var a; m() { ^ } }');
+    await computeSuggestions();
+    assertNotSuggested('a');
+  }
+
   test_SwitchStatement_c() async {
     // SwitchStatement  Block  BlockFunctionBody  MethodDeclaration
     addTestSource('class A {String g(int x) {switch(x) {c^}}}');
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index fc707f9..eeab8d7 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -64,6 +64,45 @@
         relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
   }
 
+  test_partFile_Constructor2() async {
+    // SimpleIdentifier  TypeName  ConstructorName
+    addSource(
+        '/testB.dart',
+        '''
+        lib B;
+        int T1;
+        F1() { }
+        class X {X.c(); X._d(); z() {}}''');
+    addSource(
+        '/testA.dart',
+        '''
+        part of libA;
+        class B { }''');
+    addTestSource('''
+        library libA;
+        import "/testB.dart";
+        part "/testA.dart";
+        class A { A({String boo: 'hoo'}) { } }
+        main() {new ^}
+        var m;''');
+    await computeLibrariesContaining();
+    await computeSuggestions();
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestConstructor('B');
+    // Suggested by ConstructorContributor
+    assertNotSuggested('A');
+    // Suggested by ImportedReferenceContributor
+    assertNotSuggested('Object');
+    assertNotSuggested('X.c');
+    assertNotSuggested('X._d');
+    assertNotSuggested('F1');
+    assertNotSuggested('T1');
+    assertNotSuggested('_d');
+    assertNotSuggested('z');
+    assertNotSuggested('m');
+  }
+
   test_partFile_TypeName() async {
     addSource(
         '/testB.dart',
@@ -111,45 +150,6 @@
     assertNotSuggested('z');
   }
 
-  test_partFile_Constructor2() async {
-    // SimpleIdentifier  TypeName  ConstructorName
-    addSource(
-        '/testB.dart',
-        '''
-        lib B;
-        int T1;
-        F1() { }
-        class X {X.c(); X._d(); z() {}}''');
-    addSource(
-        '/testA.dart',
-        '''
-        part of libA;
-        class B { }''');
-    addTestSource('''
-        library libA;
-        import "/testB.dart";
-        part "/testA.dart";
-        class A { A({String boo: 'hoo'}) { } }
-        main() {new ^}
-        var m;''');
-    await computeLibrariesContaining();
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggestConstructor('B');
-    // Suggested by ConstructorContributor
-    assertNotSuggested('A');
-    // Suggested by ImportedReferenceContributor
-    assertNotSuggested('Object');
-    assertNotSuggested('X.c');
-    assertNotSuggested('X._d');
-    assertNotSuggested('F1');
-    assertNotSuggested('T1');
-    assertNotSuggested('_d');
-    assertNotSuggested('z');
-    assertNotSuggested('m');
-  }
-
   test_partFile_TypeName2() async {
     addSource(
         '/testB.dart',
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index e5d854d..a9389c0 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -61,335 +61,6 @@
     return new LocalReferenceContributor();
   }
 
-  test_constructor_parameters_mixed_required_and_named() async {
-    addTestSource('class A {A(x, {int y}) {^}}');
-    await computeSuggestions();
-    assertSuggestParameter('x', null);
-    assertSuggestParameter('y', 'int');
-  }
-
-  test_constructor_parameters_mixed_required_and_positional() async {
-    addTestSource('class A {A(x, [int y]) {^}}');
-    await computeSuggestions();
-    assertSuggestParameter('x', null);
-    assertSuggestParameter('y', 'int');
-  }
-
-  test_constructor_parameters_named() async {
-    addTestSource('class A {A({x, int y}) {^}}');
-    await computeSuggestions();
-    assertSuggestParameter('x', null);
-    assertSuggestParameter('y', 'int');
-  }
-
-  test_constructor_parameters_positional() async {
-    addTestSource('class A {A([x, int y]) {^}}');
-    await computeSuggestions();
-    assertSuggestParameter('x', null);
-    assertSuggestParameter('y', 'int');
-  }
-
-  test_constructor_parameters_required() async {
-    addTestSource('class A {A(x, int y) {^}}');
-    await computeSuggestions();
-    assertSuggestParameter('x', null);
-    assertSuggestParameter('y', 'int');
-  }
-
-  test_enum() async {
-    addTestSource('enum E { one, two } main() {^}');
-    await computeSuggestions();
-    assertSuggestEnum('E');
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-  }
-
-  test_enum_deprecated() async {
-    addTestSource('@deprecated enum E { one, two } main() {^}');
-    await computeSuggestions();
-    assertSuggestEnum('E', isDeprecated: true);
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-  }
-
-  test_function_parameters_mixed_required_and_named() async {
-    addTestSource('''
-void m(x, {int y}) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 1);
-    expect(suggestion.hasNamedParameters, true);
-  }
-
-  test_function_parameters_mixed_required_and_positional() async {
-    addTestSource('''
-void m(x, [int y]) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 1);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_function_parameters_named() async {
-    addTestSource('''
-void m({x, int y}) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, true);
-  }
-
-  test_function_parameters_none() async {
-    addTestSource('''
-void m() {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    expect(suggestion.parameterNames, isEmpty);
-    expect(suggestion.parameterTypes, isEmpty);
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_function_parameters_positional() async {
-    addTestSource('''
-void m([x, int y]) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_function_parameters_required() async {
-    addTestSource('''
-void m(x, int y) {}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 2);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_ignore_symbol_being_completed() async {
-    addTestSource('class MyClass { } main(MC^) { }');
-    await computeSuggestions();
-    assertSuggestClass('MyClass');
-    assertNotSuggested('MC');
-  }
-
-  test_inDartDoc_reference3() async {
-    addTestSource('''
-/// The [^]
-main(aaa, bbb) {}''');
-    await computeSuggestions();
-    assertSuggestFunction('main', null,
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-  }
-
-  test_inDartDoc_reference4() async {
-    addTestSource('''
-/// The [m^]
-main(aaa, bbb) {}''');
-    await computeSuggestions();
-    assertSuggestFunction('main', null,
-        kind: CompletionSuggestionKind.IDENTIFIER,
-        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
-  }
-
-  test_InstanceCreationExpression() async {
-    addTestSource('''
-class A {foo(){var f; {var x;}}}
-class B {B(this.x, [String boo]) { } int x;}
-class C {C.bar({boo: 'hoo', int z: 0}) { } }
-main() {new ^ String x = "hello";}''');
-    await computeSuggestions();
-    // Suggested by LocalConstructorContributor
-    assertNoSuggestions();
-  }
-
-  test_method_parameters_mixed_required_and_named() async {
-    addTestSource('''
-class A {
-  void m(x, {int y}) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_mixed_required_and_positional() async {
-    addTestSource('''
-class A {
-  void m(x, [int y]) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_named() async {
-    addTestSource('''
-class A {
-  void m({x, int y}) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_none() async {
-    addTestSource('''
-class A {
-  void m() {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_positional() async {
-    addTestSource('''
-class A {
-  void m([x, int y]) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_method_parameters_required() async {
-    addTestSource('''
-class A {
-  void m(x, int y) {}
-}
-class B extends A {
-  main() {^}
-}
-''');
-    await computeSuggestions();
-    assertNotSuggested('m');
-  }
-
-  test_missing_params_constructor() async {
-    addTestSource('class C1{C1{} main(){C^}}');
-    await computeSuggestions();
-  }
-
-  test_missing_params_function() async {
-    addTestSource('int f1{} main(){f^}');
-    await computeSuggestions();
-  }
-
-  test_missing_params_method() async {
-    addTestSource('class C1{int f1{} main(){f^}}');
-    await computeSuggestions();
-  }
-
-  test_overrides() async {
-    addTestSource('''
-class A {m() {}}
-class B extends A {m() {^}}
-''');
-    await computeSuggestions();
-    assertSuggestMethod('m', 'B', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
-  }
-
-  test_prioritization() async {
-    addTestSource('main() {var ab; var _ab; ^}');
-    await computeSuggestions();
-    assertSuggestLocalVariable('ab', null);
-    assertSuggestLocalVariable('_ab', null, relevance: DART_RELEVANCE_DEFAULT);
-  }
-
-  test_prioritization_private() async {
-    addTestSource('main() {var ab; var _ab; _^}');
-    await computeSuggestions();
-    assertSuggestLocalVariable('ab', null);
-    assertSuggestLocalVariable('_ab', null);
-  }
-
-  test_prioritization_public() async {
-    addTestSource('main() {var ab; var _ab; a^}');
-    await computeSuggestions();
-    assertSuggestLocalVariable('ab', null);
-    assertSuggestLocalVariable('_ab', null, relevance: DART_RELEVANCE_DEFAULT);
-  }
-
-  test_shadowed_name() async {
-    addTestSource('var a; class A { var a; m() { ^ } }');
-    await computeSuggestions();
-    assertSuggestField('a', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
-  }
-
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
     addSource(
@@ -2003,6 +1674,41 @@
     //assertNotSuggested('T1');
   }
 
+  test_constructor_parameters_mixed_required_and_named() async {
+    addTestSource('class A {A(x, {int y}) {^}}');
+    await computeSuggestions();
+    assertSuggestParameter('x', null);
+    assertSuggestParameter('y', 'int');
+  }
+
+  test_constructor_parameters_mixed_required_and_positional() async {
+    addTestSource('class A {A(x, [int y]) {^}}');
+    await computeSuggestions();
+    assertSuggestParameter('x', null);
+    assertSuggestParameter('y', 'int');
+  }
+
+  test_constructor_parameters_named() async {
+    addTestSource('class A {A({x, int y}) {^}}');
+    await computeSuggestions();
+    assertSuggestParameter('x', null);
+    assertSuggestParameter('y', 'int');
+  }
+
+  test_constructor_parameters_positional() async {
+    addTestSource('class A {A([x, int y]) {^}}');
+    await computeSuggestions();
+    assertSuggestParameter('x', null);
+    assertSuggestParameter('y', 'int');
+  }
+
+  test_constructor_parameters_required() async {
+    addTestSource('class A {A(x, int y) {^}}');
+    await computeSuggestions();
+    assertSuggestParameter('x', null);
+    assertSuggestParameter('y', 'int');
+  }
+
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
@@ -2136,6 +1842,22 @@
     assertNotSuggested('bar');
   }
 
+  test_enum() async {
+    addTestSource('enum E { one, two } main() {^}');
+    await computeSuggestions();
+    assertSuggestEnum('E');
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+  }
+
+  test_enum_deprecated() async {
+    addTestSource('@deprecated enum E { one, two } main() {^}');
+    await computeSuggestions();
+    assertSuggestEnum('E', isDeprecated: true);
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+  }
+
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
     addSource(
@@ -2216,6 +1938,39 @@
     assertNoSuggestions();
   }
 
+  test_ForEachStatement() async {
+    // SimpleIdentifier  ForEachStatement
+    addTestSource('main() {List<int> values; for (int index in ^)}');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestLocalVariable('values', 'List');
+    assertNotSuggested('index');
+  }
+
+  test_ForEachStatement2() async {
+    // SimpleIdentifier  ForEachStatement
+    addTestSource('main() {List<int> values; for (int index in i^)}');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset - 1);
+    expect(replacementLength, 1);
+    assertSuggestLocalVariable('values', 'List');
+    assertNotSuggested('index');
+  }
+
+  test_ForEachStatement3() async {
+    // SimpleIdentifier ParenthesizedExpression  ForEachStatement
+    addTestSource('main() {List<int> values; for (int index in (i^))}');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset - 1);
+    expect(replacementLength, 1);
+    assertSuggestLocalVariable('values', 'List');
+    assertNotSuggested('index');
+  }
+
   test_ForEachStatement_body_typed() async {
     // Block  ForEachStatement
     addTestSource('main(args) {for (int foo in bar) {^}}');
@@ -2304,39 +2059,6 @@
     assertNotSuggested('bar');
   }
 
-  test_ForEachStatement() async {
-    // SimpleIdentifier  ForEachStatement
-    addTestSource('main() {List<int> values; for (int index in ^)}');
-    await computeSuggestions();
-
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggestLocalVariable('values', 'List');
-    assertNotSuggested('index');
-  }
-
-  test_ForEachStatement2() async {
-    // SimpleIdentifier  ForEachStatement
-    addTestSource('main() {List<int> values; for (int index in i^)}');
-    await computeSuggestions();
-
-    expect(replacementOffset, completionOffset - 1);
-    expect(replacementLength, 1);
-    assertSuggestLocalVariable('values', 'List');
-    assertNotSuggested('index');
-  }
-
-  test_ForEachStatement3() async {
-    // SimpleIdentifier ParenthesizedExpression  ForEachStatement
-    addTestSource('main() {List<int> values; for (int index in (i^))}');
-    await computeSuggestions();
-
-    expect(replacementOffset, completionOffset - 1);
-    expect(replacementLength, 1);
-    assertSuggestLocalVariable('values', 'List');
-    assertNotSuggested('index');
-  }
-
   test_ForStatement_body() async {
     // Block  ForStatement
     addTestSource('main(args) {for (int i; i < 10; ++i) {^}}');
@@ -2395,6 +2117,117 @@
     assertNotSuggested('bar');
   }
 
+  test_function_parameters_mixed_required_and_named() async {
+    addTestSource('''
+void m(x, {int y}) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_function_parameters_mixed_required_and_positional() async {
+    addTestSource('''
+void m(x, [int y]) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_function_parameters_named() async {
+    addTestSource('''
+void m({x, int y}) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_function_parameters_none() async {
+    addTestSource('''
+void m() {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    expect(suggestion.parameterNames, isEmpty);
+    expect(suggestion.parameterTypes, isEmpty);
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_function_parameters_positional() async {
+    addTestSource('''
+void m([x, int y]) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_function_parameters_required() async {
+    addTestSource('''
+void m(x, int y) {}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestFunction('m', 'void',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
   test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
     addSource(
@@ -2588,6 +2421,13 @@
     assertNotSuggested('==');
   }
 
+  test_ignore_symbol_being_completed() async {
+    addTestSource('class MyClass { } main(MC^) { }');
+    await computeSuggestions();
+    assertSuggestClass('MyClass');
+    assertNotSuggested('MC');
+  }
+
   test_ImportDirective_dart() async {
     // SimpleStringLiteral  ImportDirective
     addTestSource('''
@@ -2598,6 +2438,26 @@
     assertNoSuggestions();
   }
 
+  test_inDartDoc_reference3() async {
+    addTestSource('''
+/// The [^]
+main(aaa, bbb) {}''');
+    await computeSuggestions();
+    assertSuggestFunction('main', null,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+  }
+
+  test_inDartDoc_reference4() async {
+    addTestSource('''
+/// The [m^]
+main(aaa, bbb) {}''');
+    await computeSuggestions();
+    assertSuggestFunction('main', null,
+        kind: CompletionSuggestionKind.IDENTIFIER,
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION);
+  }
+
   test_IndexExpression() async {
     // ExpressionStatement  Block
     addSource(
@@ -2651,6 +2511,17 @@
     //assertNotSuggested('T1');
   }
 
+  test_InstanceCreationExpression() async {
+    addTestSource('''
+class A {foo(){var f; {var x;}}}
+class B {B(this.x, [String boo]) { } int x;}
+class C {C.bar({boo: 'hoo', int z: 0}) { } }
+main() {new ^ String x = "hello";}''');
+    await computeSuggestions();
+    // Suggested by LocalConstructorContributor
+    assertNoSuggestions();
+  }
+
   test_InstanceCreationExpression_imported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
     addSource(
@@ -2936,6 +2807,14 @@
     assertNoSuggestions();
   }
 
+  test_localVariableDeclarationName() async {
+    addTestSource('main() {String m^}');
+    await computeSuggestions();
+
+    assertNotSuggested('main');
+    assertNotSuggested('min');
+  }
+
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
     addSource(
@@ -3018,6 +2897,84 @@
         relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE);
   }
 
+  test_method_parameters_mixed_required_and_named() async {
+    addTestSource('''
+class A {
+  void m(x, {int y}) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_mixed_required_and_positional() async {
+    addTestSource('''
+class A {
+  void m(x, [int y]) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_named() async {
+    addTestSource('''
+class A {
+  void m({x, int y}) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_none() async {
+    addTestSource('''
+class A {
+  void m() {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_positional() async {
+    addTestSource('''
+class A {
+  void m([x, int y]) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
+  test_method_parameters_required() async {
+    addTestSource('''
+class A {
+  void m(x, int y) {}
+}
+class B extends A {
+  main() {^}
+}
+''');
+    await computeSuggestions();
+    assertNotSuggested('m');
+  }
+
   test_MethodDeclaration_body_getters() async {
     // Block  BlockFunctionBody  MethodDeclaration
     addTestSource('class A {@deprecated X get f => 0; Z a() {^} get _g => 1;}');
@@ -3347,6 +3304,21 @@
     assertNotSuggested('==');
   }
 
+  test_missing_params_constructor() async {
+    addTestSource('class C1{C1{} main(){C^}}');
+    await computeSuggestions();
+  }
+
+  test_missing_params_function() async {
+    addTestSource('int f1{} main(){f^}');
+    await computeSuggestions();
+  }
+
+  test_missing_params_method() async {
+    addTestSource('class C1{int f1{} main(){f^}}');
+    await computeSuggestions();
+  }
+
   test_new_instance() async {
     addTestSource('import "dart:math"; class A {x() {new Random().^}}');
     await computeSuggestions();
@@ -3359,6 +3331,15 @@
     assertNotSuggested('A');
   }
 
+  test_overrides() async {
+    addTestSource('''
+class A {m() {}}
+class B extends A {m() {^}}
+''');
+    await computeSuggestions();
+    assertSuggestMethod('m', 'B', null, relevance: DART_RELEVANCE_LOCAL_METHOD);
+  }
+
   test_parameterName_excludeTypes() async {
     addTestSource('m(int ^) {}');
     await computeSuggestions();
@@ -3798,14 +3779,6 @@
     assertNotSuggested('length');
   }
 
-  test_localVariableDeclarationName() async {
-    addTestSource('main() {String m^}');
-    await computeSuggestions();
-
-    assertNotSuggested('main');
-    assertNotSuggested('min');
-  }
-
   test_PrefixedIdentifier_trailingStmt_param2() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestSource('f(String g) {g.^ int y = 0;}');
@@ -3822,6 +3795,27 @@
     assertNotSuggested('length');
   }
 
+  test_prioritization() async {
+    addTestSource('main() {var ab; var _ab; ^}');
+    await computeSuggestions();
+    assertSuggestLocalVariable('ab', null);
+    assertSuggestLocalVariable('_ab', null, relevance: DART_RELEVANCE_DEFAULT);
+  }
+
+  test_prioritization_private() async {
+    addTestSource('main() {var ab; var _ab; _^}');
+    await computeSuggestions();
+    assertSuggestLocalVariable('ab', null);
+    assertSuggestLocalVariable('_ab', null);
+  }
+
+  test_prioritization_public() async {
+    addTestSource('main() {var ab; var _ab; a^}');
+    await computeSuggestions();
+    assertSuggestLocalVariable('ab', null);
+    assertSuggestLocalVariable('_ab', null, relevance: DART_RELEVANCE_DEFAULT);
+  }
+
   test_PropertyAccess_expression() async {
     // SimpleIdentifier  MethodInvocation  PropertyAccess  ExpressionStatement
     addTestSource('class A {a() {"hello".to^String().length}}');
@@ -3868,6 +3862,12 @@
     assertNotSuggested('==');
   }
 
+  test_shadowed_name() async {
+    addTestSource('var a; class A { var a; m() { ^ } }');
+    await computeSuggestions();
+    assertSuggestField('a', null, relevance: DART_RELEVANCE_LOCAL_FIELD);
+  }
+
   test_SwitchStatement_c() async {
     // SwitchStatement  Block  BlockFunctionBody  MethodDeclaration
     addTestSource('class A {String g(int x) {switch(x) {c^}}}');
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index 0ac517b..b633efd 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -7,12 +7,12 @@
 import 'package:analysis_server/plugin/protocol/protocol.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/named_constructor_contributor.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../../utils.dart';
 import 'completion_contributor_util.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 main() {
   initializeTestEnvironment();
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 6efd8ab..878fbdb7 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -36,53 +36,6 @@
     assertSuggestField('values', 'List<E>', isDeprecated: true);
   }
 
-  test_PrefixedIdentifier_class_const() async {
-    // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource(
-        '/testB.dart',
-        '''
-        lib B;
-        class I {
-          static const scI = 'boo';
-          X get f => new A();
-          get _g => new A();}
-        class B implements I {
-          static const int scB = 12;
-          var b; X _c;
-          X get d => new A();get _e => new A();
-          set s1(I x) {} set _s2(I x) {}
-          m(X x) {} I _n(X x) {}}
-        class X{}''');
-    addTestSource('''
-        import "/testB.dart";
-        class A extends B {
-          static const String scA = 'foo';
-          w() { }}
-        main() {A.^}''');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggestField('scA', 'String');
-    assertNotSuggested('scB');
-    assertNotSuggested('scI');
-    assertNotSuggested('b');
-    assertNotSuggested('_c');
-    assertNotSuggested('d');
-    assertNotSuggested('_e');
-    assertNotSuggested('f');
-    assertNotSuggested('_g');
-    assertNotSuggested('s1');
-    assertNotSuggested('_s2');
-    assertNotSuggested('m');
-    assertNotSuggested('_n');
-    assertNotSuggested('a');
-    assertNotSuggested('A');
-    assertNotSuggested('X');
-    assertNotSuggested('w');
-    assertNotSuggested('Object');
-    assertNotSuggested('==');
-  }
-
   test_enumConst() async {
     addTestSource('enum E { one, two } main() {E.^}');
     await computeSuggestions();
@@ -286,4 +239,51 @@
     await computeSuggestions();
     assertSuggestMethod('wait', 'Future', 'Future<dynamic>');
   }
+
+  test_PrefixedIdentifier_class_const() async {
+    // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
+    addSource(
+        '/testB.dart',
+        '''
+        lib B;
+        class I {
+          static const scI = 'boo';
+          X get f => new A();
+          get _g => new A();}
+        class B implements I {
+          static const int scB = 12;
+          var b; X _c;
+          X get d => new A();get _e => new A();
+          set s1(I x) {} set _s2(I x) {}
+          m(X x) {} I _n(X x) {}}
+        class X{}''');
+    addTestSource('''
+        import "/testB.dart";
+        class A extends B {
+          static const String scA = 'foo';
+          w() { }}
+        main() {A.^}''');
+    await computeSuggestions();
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestField('scA', 'String');
+    assertNotSuggested('scB');
+    assertNotSuggested('scI');
+    assertNotSuggested('b');
+    assertNotSuggested('_c');
+    assertNotSuggested('d');
+    assertNotSuggested('_e');
+    assertNotSuggested('f');
+    assertNotSuggested('_g');
+    assertNotSuggested('s1');
+    assertNotSuggested('_s2');
+    assertNotSuggested('m');
+    assertNotSuggested('_n');
+    assertNotSuggested('a');
+    assertNotSuggested('A');
+    assertNotSuggested('X');
+    assertNotSuggested('w');
+    assertNotSuggested('Object');
+    assertNotSuggested('==');
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/test_all.dart b/pkg/analysis_server/test/services/completion/dart/test_all.dart
index b936392..1d395ac 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -9,8 +9,8 @@
 import '../../../utils.dart';
 import 'arglist_contributor_test.dart' as arglist_test;
 import 'combinator_contributor_test.dart' as combinator_test;
-import 'completion_manager_test.dart' as completion_manager;
 import 'common_usage_sorter_test.dart' as common_usage_test;
+import 'completion_manager_test.dart' as completion_manager;
 import 'field_formal_contributor_test.dart' as field_formal_contributor_test;
 import 'imported_reference_contributor_test.dart' as imported_ref_test;
 import 'inherited_reference_contributor_test.dart' as inherited_ref_test;
@@ -35,8 +35,8 @@
   group('dart/completion', () {
     arglist_test.main();
     combinator_test.main();
-    completion_manager.main();
     common_usage_test.main();
+    completion_manager.main();
     field_formal_contributor_test.main();
     imported_ref_test.main();
     inherited_ref_test.main();
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index 8d176b8..1a74e78 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -53,573 +53,18 @@
     }
   }
 
-  fail_test_PrefixedIdentifier_trailingStmt_const_untyped() async {
-    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addTestSource('const g = "hello"; f() {g.^ int y = 0;}');
-    await computeSuggestions();
-    assertSuggestGetter('length', 'int');
-  }
-
   @override
   DartCompletionContributor createContributor() {
     return new TypeMemberContributor();
   }
 
-  test_enumConst() async {
-    addTestSource('enum E { one, two } main() {E.^}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    // Suggested by StaticMemberContributor
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-    assertNotSuggested('index');
-    assertNotSuggested('values');
-  }
-
-  test_enumConst2() async {
-    addTestSource('enum E { one, two } main() {E.o^}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    // Suggested by StaticMemberContributor
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-    assertNotSuggested('index');
-    assertNotSuggested('values');
-  }
-
-  test_enumConst3() async {
-    addTestSource('enum E { one, two } main() {E.^ int g;}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    // Suggested by StaticMemberContributor
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-    assertNotSuggested('index');
-    assertNotSuggested('values');
-  }
-
-  test_enumConst_index() async {
-    addTestSource('enum E { one, two } main() {E.one.^}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-    assertSuggestField('index', 'int');
-    assertNotSuggested('values');
-  }
-
-  test_enumConst_index2() async {
-    addTestSource('enum E { one, two } main() {E.one.i^}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-    assertSuggestField('index', 'int');
-    assertNotSuggested('values');
-  }
-
-  test_enumConst_index3() async {
-    addTestSource('enum E { one, two } main() {E.one.^ int g;}');
-    await computeSuggestions();
-    assertNotSuggested('E');
-    assertNotSuggested('one');
-    assertNotSuggested('two');
-    assertSuggestField('index', 'int');
-    assertNotSuggested('values');
-  }
-
-  test_generic_field() async {
-    addTestSource('''
-class C<T> {
-  T t;
-}
-void f(C<int> c) {
-  c.^
-}
-''');
-    await computeSuggestions();
-    assertSuggestField('t', 'int');
-  }
-
-  test_generic_getter() async {
-    addTestSource('''
-class C<T> {
-  T get t => null;
-}
-void f(C<int> c) {
-  c.^
-}
-''');
-    await computeSuggestions();
-    assertSuggestGetter('t', 'int');
-  }
-
-  test_generic_method() async {
-    addTestSource('''
-class C<T> {
-  T m(T t) {}
-}
-void f(C<int> c) {
-  c.^
-}
-''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'int');
-    expect(suggestion.parameterTypes[0], 'int');
-    expect(suggestion.element.returnType, 'int');
-    expect(suggestion.element.parameters, '(int t)');
-  }
-
-  test_generic_setter() async {
-    addTestSource('''
-class C<T> {
-  set t(T value) {}
-}
-void f(C<int> c) {
-  c.^
-}
-''');
-    await computeSuggestions();
-    // TODO(paulberry): modify assertSuggestSetter so that we can pass 'int'
-    // as a parmeter to it, and it will check the appropriate field in
-    // the suggestion object.
-    CompletionSuggestion suggestion = assertSuggestSetter('t');
-    expect(suggestion.element.parameters, '(int value)');
-  }
-
-  test_keyword() async {
-    addTestSource('class C { static C get instance => null; } main() {C.in^}');
-    await computeSuggestions();
-    // Suggested by StaticMemberContributor
-    assertNotSuggested('instance');
-  }
-
-  test_libraryPrefix() async {
+  fail_test_PrefixedIdentifier_trailingStmt_const_untyped() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addTestSource('import "dart:async" as bar; foo() {bar.^}');
-    await computeSuggestions();
-    // Suggested by LibraryMemberContributor
-    assertNotSuggested('Future');
-    assertNotSuggested('loadLibrary');
-  }
-
-  test_libraryPrefix2() async {
-    // SimpleIdentifier  MethodInvocation  ExpressionStatement
-    addTestSource('import "dart:async" as bar; foo() {bar.^ print("f")}');
-    await computeSuggestions();
-    // Suggested by LibraryMemberContributor
-    assertNotSuggested('Future');
-  }
-
-  test_libraryPrefix3() async {
-    // SimpleIdentifier  MethodInvocation  ExpressionStatement
-    addTestSource('import "dart:async" as bar; foo() {new bar.F^ print("f")}');
-    await computeSuggestions();
-    // Suggested by LibraryMemberContributor
-    assertNotSuggested('Future');
-    assertNotSuggested('Future.delayed');
-  }
-
-  test_libraryPrefix_deferred() async {
-    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addTestSource('import "dart:async" deferred as bar; foo() {bar.^}');
-    await computeSuggestions();
-    // Suggested by LibraryMemberContributor
-    assertNotSuggested('Future');
-    assertNotSuggested('loadLibrary');
-  }
-
-  test_libraryPrefix_with_exports() async {
-    addSource('/libA.dart', 'library libA; class A { }');
-    addSource('/libB.dart', 'library libB; export "/libA.dart"; class B { }');
-    addTestSource('import "/libB.dart" as foo; main() {foo.^} class C { }');
-    await computeSuggestions();
-    // Suggested by LibraryMemberContributor
-    assertNotSuggested('B');
-    assertNotSuggested('A');
-  }
-
-  test_local() async {
-    addTestSource('foo() {String x = "bar"; x.^}');
+    addTestSource('const g = "hello"; f() {g.^ int y = 0;}');
     await computeSuggestions();
     assertSuggestGetter('length', 'int');
   }
 
-  test_local_is() async {
-    addTestSource('foo() {var x; if (x is String) x.^}');
-    await computeSuggestions();
-    assertSuggestGetter('length', 'int');
-  }
-
-  test_local_propogatedType() async {
-    addTestSource('foo() {var x = "bar"; x.^}');
-    await computeSuggestions();
-    assertSuggestGetter('length', 'int');
-  }
-
-  test_method_parameters_mixed_required_and_named() async {
-    addTestSource('''
-class C {
-  void m(x, {int y}) {}
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 1);
-    expect(suggestion.hasNamedParameters, true);
-  }
-
-  test_method_parameters_mixed_required_and_positional() async {
-    addTestSource('''
-class C {
-  void m(x, [int y]) {}
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 1);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_method_parameters_named() async {
-    addTestSource('''
-class C {
-  void m({x, int y}) {}
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, true);
-  }
-
-  test_method_parameters_none() async {
-    addTestSource('''
-class C {
-  void m() {}
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, isEmpty);
-    expect(suggestion.parameterTypes, isEmpty);
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_method_parameters_positional() async {
-    addTestSource('''
-class C {
-  void m([x, int y]) {}
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 0);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_method_parameters_required() async {
-    addTestSource('''
-class C {
-  void m(x, int y) {}
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
-    expect(suggestion.parameterNames, hasLength(2));
-    expect(suggestion.parameterNames[0], 'x');
-    expect(suggestion.parameterTypes[0], 'dynamic');
-    expect(suggestion.parameterNames[1], 'y');
-    expect(suggestion.parameterTypes[1], 'int');
-    expect(suggestion.requiredParameterCount, 2);
-    expect(suggestion.hasNamedParameters, false);
-  }
-
-  test_no_parameters_field() async {
-    addTestSource('''
-class C {
-  int x;
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestField('x', 'int');
-    assertHasNoParameterInfo(suggestion);
-  }
-
-  test_no_parameters_getter() async {
-    addTestSource('''
-class C {
-  int get x => null;
-}
-void main() {int y = new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestGetter('x', 'int');
-    assertHasNoParameterInfo(suggestion);
-  }
-
-  test_no_parameters_setter() async {
-    addTestSource('''
-class C {
-  set x(int value) {};
-}
-void main() {int y = new C().^}''');
-    await computeSuggestions();
-    CompletionSuggestion suggestion = assertSuggestSetter('x');
-    assertHasNoParameterInfo(suggestion);
-  }
-
-  test_only_instance() async {
-    // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addTestSource('''
-class C {
-  int f1;
-  static int f2;
-  m1() {}
-  static m2() {}
-}
-void main() {new C().^}''');
-    await computeSuggestions();
-    assertSuggestField('f1', 'int');
-    assertNotSuggested('f2');
-    assertSuggestMethod('m1', 'C', null);
-    assertNotSuggested('m2');
-  }
-
-  test_only_instance2() async {
-    // SimpleIdentifier  MethodInvocation  ExpressionStatement
-    addTestSource('''
-class C {
-  int f1;
-  static int f2;
-  m1() {}
-  static m2() {}
-}
-void main() {new C().^ print("something");}''');
-    await computeSuggestions();
-    assertSuggestField('f1', 'int');
-    assertNotSuggested('f2');
-    assertSuggestMethod('m1', 'C', null);
-    assertNotSuggested('m2');
-  }
-
-  test_only_static() async {
-    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addTestSource('''
-class C {
-  int f1;
-  static int f2;
-  m1() {}
-  static m2() {}
-}
-void main() {C.^}''');
-    await computeSuggestions();
-    assertNotSuggested('f1');
-    // Suggested by StaticMemberContributor
-    assertNotSuggested('f2');
-    assertNotSuggested('m1');
-    assertNotSuggested('m2');
-  }
-
-  test_only_static2() async {
-    // SimpleIdentifier  MethodInvocation  ExpressionStatement
-    addTestSource('''
-class C {
-  int f1;
-  static int f2;
-  m1() {}
-  static m2() {}
-}
-void main() {C.^ print("something");}''');
-    await computeSuggestions();
-    assertNotSuggested('f1');
-    // Suggested by StaticMemberContributor
-    assertNotSuggested('f2');
-    assertNotSuggested('m1');
-    assertNotSuggested('m2');
-  }
-
-  test_param() async {
-    addTestSource('foo(String x) {x.^}');
-    await computeSuggestions();
-    assertSuggestGetter('length', 'int');
-  }
-
-  test_param_is() async {
-    addTestSource('foo(x) {if (x is String) x.^}');
-    await computeSuggestions();
-    assertSuggestGetter('length', 'int');
-  }
-
-  test_shadowing_field_over_field() =>
-      check_shadowing('int x;', 'int x;', true);
-
-  test_shadowing_field_over_getter() =>
-      check_shadowing('int x;', 'int get x => null;', true);
-
-  test_shadowing_field_over_method() =>
-      check_shadowing('int x;', 'void x() {}', true);
-
-  test_shadowing_field_over_setter() =>
-      check_shadowing('int x;', 'set x(int value) {}', true);
-
-  test_shadowing_getter_over_field() =>
-      check_shadowing('int get x => null;', 'int x;', false);
-
-  test_shadowing_getter_over_getter() =>
-      check_shadowing('int get x => null;', 'int get x => null;', true);
-
-  test_shadowing_getter_over_method() =>
-      check_shadowing('int get x => null;', 'void x() {}', true);
-
-  test_shadowing_getter_over_setter() =>
-      check_shadowing('int get x => null;', 'set x(int value) {}', false);
-
-  test_shadowing_method_over_field() =>
-      check_shadowing('void x() {}', 'int x;', true);
-
-  test_shadowing_method_over_getter() =>
-      check_shadowing('void x() {}', 'int get x => null;', true);
-
-  test_shadowing_method_over_method() =>
-      check_shadowing('void x() {}', 'void x() {}', true);
-
-  test_shadowing_method_over_setter() =>
-      check_shadowing('void x() {}', 'set x(int value) {}', true);
-
-  test_shadowing_mixin_order() async {
-    addTestSource('''
-class Base {
-}
-class Mixin1 {
-  void f() {}
-}
-class Mixin2 {
-  void f() {}
-}
-class Derived extends Base with Mixin1, Mixin2 {
-}
-void test(Derived d) {
-  d.^
-}
-''');
-    await computeSuggestions();
-    // Note: due to dartbug.com/22069, analyzer currently analyzes mixins in
-    // reverse order.  The correct order is that Derived inherits from
-    // "Base with Mixin1, Mixin2", which inherits from "Base with Mixin1",
-    // which inherits from "Base".  So the definition of f in Mixin2 should
-    // shadow the definition in Mixin1.
-    assertSuggestMethod('f', 'Mixin2', 'void');
-  }
-
-  test_shadowing_mixin_over_superclass() async {
-    addTestSource('''
-class Base {
-  void f() {}
-}
-class Mixin {
-  void f() {}
-}
-class Derived extends Base with Mixin {
-}
-void test(Derived d) {
-  d.^
-}
-''');
-    await computeSuggestions();
-    assertSuggestMethod('f', 'Mixin', 'void');
-  }
-
-  test_shadowing_setter_over_field() =>
-      check_shadowing('set x(int value) {}', 'int x;', false);
-
-  test_shadowing_setter_over_getter() =>
-      check_shadowing('set x(int value) {}', 'int get x => null;', false);
-
-  test_shadowing_setter_over_method() =>
-      check_shadowing('set x(int value) {}', 'void x() {}', true);
-
-  test_shadowing_setter_over_setter() =>
-      check_shadowing('set x(int value) {}', 'set x(int value) {}', true);
-
-  test_shadowing_superclass_over_interface() async {
-    addTestSource('''
-class Base {
-  void f() {}
-}
-class Interface {
-  void f() {}
-}
-class Derived extends Base implements Interface {
-}
-void test(Derived d) {
-  d.^
-}
-''');
-    await computeSuggestions();
-    assertSuggestMethod('f', 'Base', 'void');
-  }
-
-  test_super() async {
-    // SimpleIdentifier  MethodInvocation  ExpressionStatement
-    addTestSource('''
-class C3 {
-  int fi3;
-  static int fs3;
-  m() {}
-  mi3() {}
-  static ms3() {}
-}
-class C2 {
-  int fi2;
-  static int fs2;
-  m() {}
-  mi2() {}
-  static ms2() {}
-}
-class C1 extends C2 implements C3 {
-  int fi1;
-  static int fs1;
-  m() {super.^}
-  mi1() {}
-  static ms1() {}
-}''');
-    await computeSuggestions();
-    assertNotSuggested('fi1');
-    assertNotSuggested('fs1');
-    assertNotSuggested('mi1');
-    assertNotSuggested('ms1');
-    assertSuggestField('fi2', 'int');
-    assertNotSuggested('fs2');
-    assertSuggestMethod('mi2', 'C2', null);
-    assertNotSuggested('ms2');
-    assertSuggestMethod('m', 'C2', null, relevance: DART_RELEVANCE_HIGH);
-    assertNotSuggested('fi3');
-    assertNotSuggested('fs3');
-    assertNotSuggested('mi3');
-    assertNotSuggested('ms3');
-  }
-
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
     addSource(
@@ -2272,6 +1717,69 @@
     assertNotSuggested('bar');
   }
 
+  test_enumConst() async {
+    addTestSource('enum E { one, two } main() {E.^}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    // Suggested by StaticMemberContributor
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+    assertNotSuggested('index');
+    assertNotSuggested('values');
+  }
+
+  test_enumConst2() async {
+    addTestSource('enum E { one, two } main() {E.o^}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    // Suggested by StaticMemberContributor
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+    assertNotSuggested('index');
+    assertNotSuggested('values');
+  }
+
+  test_enumConst3() async {
+    addTestSource('enum E { one, two } main() {E.^ int g;}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    // Suggested by StaticMemberContributor
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+    assertNotSuggested('index');
+    assertNotSuggested('values');
+  }
+
+  test_enumConst_index() async {
+    addTestSource('enum E { one, two } main() {E.one.^}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+    assertSuggestField('index', 'int');
+    assertNotSuggested('values');
+  }
+
+  test_enumConst_index2() async {
+    addTestSource('enum E { one, two } main() {E.one.i^}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+    assertSuggestField('index', 'int');
+    assertNotSuggested('values');
+  }
+
+  test_enumConst_index3() async {
+    addTestSource('enum E { one, two } main() {E.one.^ int g;}');
+    await computeSuggestions();
+    assertNotSuggested('E');
+    assertNotSuggested('one');
+    assertNotSuggested('two');
+    assertSuggestField('index', 'int');
+    assertNotSuggested('values');
+  }
+
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
     addSource(
@@ -2588,6 +2096,65 @@
     assertNotSuggested('Object');
   }
 
+  test_generic_field() async {
+    addTestSource('''
+class C<T> {
+  T t;
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    await computeSuggestions();
+    assertSuggestField('t', 'int');
+  }
+
+  test_generic_getter() async {
+    addTestSource('''
+class C<T> {
+  T get t => null;
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    await computeSuggestions();
+    assertSuggestGetter('t', 'int');
+  }
+
+  test_generic_method() async {
+    addTestSource('''
+class C<T> {
+  T m(T t) {}
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'int');
+    expect(suggestion.parameterTypes[0], 'int');
+    expect(suggestion.element.returnType, 'int');
+    expect(suggestion.element.parameters, '(int t)');
+  }
+
+  test_generic_setter() async {
+    addTestSource('''
+class C<T> {
+  set t(T value) {}
+}
+void f(C<int> c) {
+  c.^
+}
+''');
+    await computeSuggestions();
+    // TODO(paulberry): modify assertSuggestSetter so that we can pass 'int'
+    // as a parmeter to it, and it will check the appropriate field in
+    // the suggestion object.
+    CompletionSuggestion suggestion = assertSuggestSetter('t');
+    expect(suggestion.element.parameters, '(int value)');
+  }
+
   test_IfStatement() async {
     // SimpleIdentifier  IfStatement
     addTestSource('''
@@ -2910,6 +2477,13 @@
     assertNotSuggested('Object');
   }
 
+  test_keyword() async {
+    addTestSource('class C { static C get instance => null; } main() {C.in^}');
+    await computeSuggestions();
+    // Suggested by StaticMemberContributor
+    assertNotSuggested('instance');
+  }
+
   test_keyword2() async {
     addSource(
         '/testB.dart',
@@ -2937,6 +2511,51 @@
     assertNotSuggested('newer');
   }
 
+  test_libraryPrefix() async {
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
+    addTestSource('import "dart:async" as bar; foo() {bar.^}');
+    await computeSuggestions();
+    // Suggested by LibraryMemberContributor
+    assertNotSuggested('Future');
+    assertNotSuggested('loadLibrary');
+  }
+
+  test_libraryPrefix2() async {
+    // SimpleIdentifier  MethodInvocation  ExpressionStatement
+    addTestSource('import "dart:async" as bar; foo() {bar.^ print("f")}');
+    await computeSuggestions();
+    // Suggested by LibraryMemberContributor
+    assertNotSuggested('Future');
+  }
+
+  test_libraryPrefix3() async {
+    // SimpleIdentifier  MethodInvocation  ExpressionStatement
+    addTestSource('import "dart:async" as bar; foo() {new bar.F^ print("f")}');
+    await computeSuggestions();
+    // Suggested by LibraryMemberContributor
+    assertNotSuggested('Future');
+    assertNotSuggested('Future.delayed');
+  }
+
+  test_libraryPrefix_deferred() async {
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
+    addTestSource('import "dart:async" deferred as bar; foo() {bar.^}');
+    await computeSuggestions();
+    // Suggested by LibraryMemberContributor
+    assertNotSuggested('Future');
+    assertNotSuggested('loadLibrary');
+  }
+
+  test_libraryPrefix_with_exports() async {
+    addSource('/libA.dart', 'library libA; class A { }');
+    addSource('/libB.dart', 'library libB; export "/libA.dart"; class B { }');
+    addTestSource('import "/libB.dart" as foo; main() {foo.^} class C { }');
+    await computeSuggestions();
+    // Suggested by LibraryMemberContributor
+    assertNotSuggested('B');
+    assertNotSuggested('A');
+  }
+
   test_Literal_list() async {
     // ']'  ListLiteral  ArgumentList  MethodInvocation
     addTestSource('main() {var Some; print([^]);}');
@@ -2960,6 +2579,31 @@
     assertNoSuggestions();
   }
 
+  test_local() async {
+    addTestSource('foo() {String x = "bar"; x.^}');
+    await computeSuggestions();
+    assertSuggestGetter('length', 'int');
+  }
+
+  test_local_is() async {
+    addTestSource('foo() {var x; if (x is String) x.^}');
+    await computeSuggestions();
+    assertSuggestGetter('length', 'int');
+  }
+
+  test_local_propogatedType() async {
+    addTestSource('foo() {var x = "bar"; x.^}');
+    await computeSuggestions();
+    assertSuggestGetter('length', 'int');
+  }
+
+  test_localVariableDeclarationName() async {
+    addTestSource('main() {String m^}');
+    await computeSuggestions();
+    assertNotSuggested('main');
+    assertNotSuggested('min');
+  }
+
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
     addSource(
@@ -3033,6 +2677,105 @@
     assertNotSuggested('T2');
   }
 
+  test_method_parameters_mixed_required_and_named() async {
+    addTestSource('''
+class C {
+  void m(x, {int y}) {}
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_method_parameters_mixed_required_and_positional() async {
+    addTestSource('''
+class C {
+  void m(x, [int y]) {}
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 1);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_method_parameters_named() async {
+    addTestSource('''
+class C {
+  void m({x, int y}) {}
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, true);
+  }
+
+  test_method_parameters_none() async {
+    addTestSource('''
+class C {
+  void m() {}
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
+    expect(suggestion.parameterNames, isEmpty);
+    expect(suggestion.parameterTypes, isEmpty);
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_method_parameters_positional() async {
+    addTestSource('''
+class C {
+  void m([x, int y]) {}
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 0);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
+  test_method_parameters_required() async {
+    addTestSource('''
+class C {
+  void m(x, int y) {}
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestMethod('m', 'C', 'void');
+    expect(suggestion.parameterNames, hasLength(2));
+    expect(suggestion.parameterNames[0], 'x');
+    expect(suggestion.parameterTypes[0], 'dynamic');
+    expect(suggestion.parameterNames[1], 'y');
+    expect(suggestion.parameterTypes[1], 'int');
+    expect(suggestion.requiredParameterCount, 2);
+    expect(suggestion.hasNamedParameters, false);
+  }
+
   test_MethodDeclaration_body_getters() async {
     // Block  BlockFunctionBody  MethodDeclaration
     addTestSource('class A {@deprecated X get f => 0; Z a() {^} get _g => 1;}');
@@ -3290,6 +3033,121 @@
     assertNotSuggested('A');
   }
 
+  test_no_parameters_field() async {
+    addTestSource('''
+class C {
+  int x;
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestField('x', 'int');
+    assertHasNoParameterInfo(suggestion);
+  }
+
+  test_no_parameters_getter() async {
+    addTestSource('''
+class C {
+  int get x => null;
+}
+void main() {int y = new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestGetter('x', 'int');
+    assertHasNoParameterInfo(suggestion);
+  }
+
+  test_no_parameters_setter() async {
+    addTestSource('''
+class C {
+  set x(int value) {};
+}
+void main() {int y = new C().^}''');
+    await computeSuggestions();
+    CompletionSuggestion suggestion = assertSuggestSetter('x');
+    assertHasNoParameterInfo(suggestion);
+  }
+
+  test_only_instance() async {
+    // SimpleIdentifier  PropertyAccess  ExpressionStatement
+    addTestSource('''
+class C {
+  int f1;
+  static int f2;
+  m1() {}
+  static m2() {}
+}
+void main() {new C().^}''');
+    await computeSuggestions();
+    assertSuggestField('f1', 'int');
+    assertNotSuggested('f2');
+    assertSuggestMethod('m1', 'C', null);
+    assertNotSuggested('m2');
+  }
+
+  test_only_instance2() async {
+    // SimpleIdentifier  MethodInvocation  ExpressionStatement
+    addTestSource('''
+class C {
+  int f1;
+  static int f2;
+  m1() {}
+  static m2() {}
+}
+void main() {new C().^ print("something");}''');
+    await computeSuggestions();
+    assertSuggestField('f1', 'int');
+    assertNotSuggested('f2');
+    assertSuggestMethod('m1', 'C', null);
+    assertNotSuggested('m2');
+  }
+
+  test_only_static() async {
+    // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
+    addTestSource('''
+class C {
+  int f1;
+  static int f2;
+  m1() {}
+  static m2() {}
+}
+void main() {C.^}''');
+    await computeSuggestions();
+    assertNotSuggested('f1');
+    // Suggested by StaticMemberContributor
+    assertNotSuggested('f2');
+    assertNotSuggested('m1');
+    assertNotSuggested('m2');
+  }
+
+  test_only_static2() async {
+    // SimpleIdentifier  MethodInvocation  ExpressionStatement
+    addTestSource('''
+class C {
+  int f1;
+  static int f2;
+  m1() {}
+  static m2() {}
+}
+void main() {C.^ print("something");}''');
+    await computeSuggestions();
+    assertNotSuggested('f1');
+    // Suggested by StaticMemberContributor
+    assertNotSuggested('f2');
+    assertNotSuggested('m1');
+    assertNotSuggested('m2');
+  }
+
+  test_param() async {
+    addTestSource('foo(String x) {x.^}');
+    await computeSuggestions();
+    assertSuggestGetter('length', 'int');
+  }
+
+  test_param_is() async {
+    addTestSource('foo(x) {if (x is String) x.^}');
+    await computeSuggestions();
+    assertSuggestGetter('length', 'int');
+  }
+
   test_parameterName_excludeTypes() async {
     addTestSource('m(int ^) {}');
     await computeSuggestions();
@@ -3702,13 +3560,6 @@
     assertSuggestGetter('length', 'int');
   }
 
-  test_localVariableDeclarationName() async {
-    addTestSource('main() {String m^}');
-    await computeSuggestions();
-    assertNotSuggested('main');
-    assertNotSuggested('min');
-  }
-
   test_PrefixedIdentifier_trailingStmt_param2() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addTestSource('f(String g) {g.^ int y = 0;}');
@@ -3765,6 +3616,155 @@
     assertNotSuggested('==');
   }
 
+  test_shadowing_field_over_field() =>
+      check_shadowing('int x;', 'int x;', true);
+
+  test_shadowing_field_over_getter() =>
+      check_shadowing('int x;', 'int get x => null;', true);
+
+  test_shadowing_field_over_method() =>
+      check_shadowing('int x;', 'void x() {}', true);
+
+  test_shadowing_field_over_setter() =>
+      check_shadowing('int x;', 'set x(int value) {}', true);
+
+  test_shadowing_getter_over_field() =>
+      check_shadowing('int get x => null;', 'int x;', false);
+
+  test_shadowing_getter_over_getter() =>
+      check_shadowing('int get x => null;', 'int get x => null;', true);
+
+  test_shadowing_getter_over_method() =>
+      check_shadowing('int get x => null;', 'void x() {}', true);
+
+  test_shadowing_getter_over_setter() =>
+      check_shadowing('int get x => null;', 'set x(int value) {}', false);
+
+  test_shadowing_method_over_field() =>
+      check_shadowing('void x() {}', 'int x;', true);
+
+  test_shadowing_method_over_getter() =>
+      check_shadowing('void x() {}', 'int get x => null;', true);
+
+  test_shadowing_method_over_method() =>
+      check_shadowing('void x() {}', 'void x() {}', true);
+
+  test_shadowing_method_over_setter() =>
+      check_shadowing('void x() {}', 'set x(int value) {}', true);
+
+  test_shadowing_mixin_order() async {
+    addTestSource('''
+class Base {
+}
+class Mixin1 {
+  void f() {}
+}
+class Mixin2 {
+  void f() {}
+}
+class Derived extends Base with Mixin1, Mixin2 {
+}
+void test(Derived d) {
+  d.^
+}
+''');
+    await computeSuggestions();
+    // Note: due to dartbug.com/22069, analyzer currently analyzes mixins in
+    // reverse order.  The correct order is that Derived inherits from
+    // "Base with Mixin1, Mixin2", which inherits from "Base with Mixin1",
+    // which inherits from "Base".  So the definition of f in Mixin2 should
+    // shadow the definition in Mixin1.
+    assertSuggestMethod('f', 'Mixin2', 'void');
+  }
+
+  test_shadowing_mixin_over_superclass() async {
+    addTestSource('''
+class Base {
+  void f() {}
+}
+class Mixin {
+  void f() {}
+}
+class Derived extends Base with Mixin {
+}
+void test(Derived d) {
+  d.^
+}
+''');
+    await computeSuggestions();
+    assertSuggestMethod('f', 'Mixin', 'void');
+  }
+
+  test_shadowing_setter_over_field() =>
+      check_shadowing('set x(int value) {}', 'int x;', false);
+
+  test_shadowing_setter_over_getter() =>
+      check_shadowing('set x(int value) {}', 'int get x => null;', false);
+
+  test_shadowing_setter_over_method() =>
+      check_shadowing('set x(int value) {}', 'void x() {}', true);
+
+  test_shadowing_setter_over_setter() =>
+      check_shadowing('set x(int value) {}', 'set x(int value) {}', true);
+
+  test_shadowing_superclass_over_interface() async {
+    addTestSource('''
+class Base {
+  void f() {}
+}
+class Interface {
+  void f() {}
+}
+class Derived extends Base implements Interface {
+}
+void test(Derived d) {
+  d.^
+}
+''');
+    await computeSuggestions();
+    assertSuggestMethod('f', 'Base', 'void');
+  }
+
+  test_super() async {
+    // SimpleIdentifier  MethodInvocation  ExpressionStatement
+    addTestSource('''
+class C3 {
+  int fi3;
+  static int fs3;
+  m() {}
+  mi3() {}
+  static ms3() {}
+}
+class C2 {
+  int fi2;
+  static int fs2;
+  m() {}
+  mi2() {}
+  static ms2() {}
+}
+class C1 extends C2 implements C3 {
+  int fi1;
+  static int fs1;
+  m() {super.^}
+  mi1() {}
+  static ms1() {}
+}''');
+    await computeSuggestions();
+    assertNotSuggested('fi1');
+    assertNotSuggested('fs1');
+    assertNotSuggested('mi1');
+    assertNotSuggested('ms1');
+    assertSuggestField('fi2', 'int');
+    assertNotSuggested('fs2');
+    assertSuggestMethod('mi2', 'C2', null);
+    assertNotSuggested('ms2');
+    assertSuggestMethod('m', 'C2', null, relevance: DART_RELEVANCE_HIGH);
+    assertNotSuggested('fi3');
+    assertNotSuggested('fs3');
+    assertNotSuggested('mi3');
+    assertNotSuggested('ms3');
+  }
+
   test_SwitchStatement_c() async {
     // SwitchStatement  Block  BlockFunctionBody  MethodDeclaration
     addTestSource('class A {String g(int x) {switch(x) {c^}}}');
diff --git a/pkg/analysis_server/test/services/index/index_test.dart b/pkg/analysis_server/test/services/index/index_test.dart
index 406479e..1787407 100644
--- a/pkg/analysis_server/test/services/index/index_test.dart
+++ b/pkg/analysis_server/test/services/index/index_test.dart
@@ -122,6 +122,23 @@
     _assertHasDefinedName(locations, topE);
   }
 
+  test_getDefinedNames_topLevel2() async {
+    _indexTestUnit(
+        '''
+class A {} // A
+class B = Object with A;
+class NoMatchABCDE {}
+''',
+        declOnly: true);
+    Element topA = findElement('A');
+    Element topB = findElement('B');
+    List<Location> locations = await index.getDefinedNames(
+        new RegExp(r'^[A-E]$'), IndexNameKind.topLevel);
+    expect(locations, hasLength(2));
+    _assertHasDefinedName(locations, topA);
+    _assertHasDefinedName(locations, topB);
+  }
+
   test_getRelations_isExtendedBy() async {
     _indexTestUnit(r'''
 class A {}
@@ -230,6 +247,16 @@
     findLocationTest(locations, 'test();', false);
   }
 
+  test_indexDeclarations_nullUnit() async {
+    index.indexDeclarations(null);
+  }
+
+  test_indexDeclarations_nullUnitElement() async {
+    resolveTestUnit('');
+    testUnit.element = null;
+    index.indexDeclarations(testUnit);
+  }
+
   test_indexUnit_nullUnit() async {
     index.indexUnit(null);
   }
@@ -298,9 +325,13 @@
         '${locations.join('\n')}');
   }
 
-  void _indexTestUnit(String code) {
+  void _indexTestUnit(String code, {bool declOnly: false}) {
     resolveTestUnit(code);
-    index.indexUnit(testUnit);
+    if (declOnly) {
+      index.indexDeclarations(testUnit);
+    } else {
+      index.indexUnit(testUnit);
+    }
   }
 
   Source _indexUnit(String path, String code) {
diff --git a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
index 9b58386..37f46cd 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
@@ -317,7 +317,8 @@
 $a
 bbb''';
 }
-""".replaceAll('\n', '\r\n'));
+"""
+        .replaceAll('\n', '\r\n'));
     _createRefactoring('a =');
     // validate change
     return assertSuccessfulRefactoring(r"""
@@ -328,7 +329,8 @@
 a
 bbb''';
 }
-""".replaceAll('\n', '\r\n'));
+"""
+        .replaceAll('\n', '\r\n'));
   }
 
   test_OK_intoStringInterpolation_string_multiLineIntoSingle() {
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 70caeff..ffdfd4c 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -525,6 +525,28 @@
     await _verifyReferences(element, expected);
   }
 
+  test_searchReferences_LocalVariableElement_inForEachLoop() async {
+    _indexTestUnit('''
+main() {
+  for (var v in []) {
+    v = 1;
+    v += 2;
+    print(v);
+    v();
+  }
+}
+''');
+    LocalVariableElement element = findElement('v');
+    Element mainElement = findElement('main');
+    var expected = [
+      _expectId(mainElement, MatchKind.WRITE, 'v = 1;'),
+      _expectId(mainElement, MatchKind.READ_WRITE, 'v += 2;'),
+      _expectId(mainElement, MatchKind.READ, 'v);'),
+      _expectId(mainElement, MatchKind.INVOCATION, 'v();')
+    ];
+    await _verifyReferences(element, expected);
+  }
+
   test_searchReferences_MethodElement() async {
     _indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 1175320..395072a 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -112,12 +112,12 @@
     ServerPlugin serverPlugin = new ServerPlugin();
     ExtensionManager manager = new ExtensionManager();
     manager.processPlugins([serverPlugin]);
-    SdkCreator sdkCreator = () =>
+    SdkCreator sdkCreator = (_) =>
         new DirectoryBasedDartSdk(DirectoryBasedDartSdk.defaultSdkDirectory);
     return new SocketServer(
         new AnalysisServerOptions(),
         sdkCreator,
-        sdkCreator(),
+        sdkCreator(null),
         InstrumentationService.NULL_SERVICE,
         serverPlugin,
         null,
diff --git a/pkg/analysis_server/test/stress/utilities/git.dart b/pkg/analysis_server/test/stress/utilities/git.dart
index 30e45f7..32c7e9b 100644
--- a/pkg/analysis_server/test/stress/utilities/git.dart
+++ b/pkg/analysis_server/test/stress/utilities/git.dart
@@ -379,7 +379,7 @@
    */
   bool isFor(String fileName) =>
       (srcPath != null && fileName == path.basename(srcPath)) ||
-          (dstPath != null && fileName == path.basename(dstPath));
+      (dstPath != null && fileName == path.basename(dstPath));
 
   @override
   String toString() => srcPath ?? dstPath;
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index b752b2e..b28531a 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -480,8 +480,7 @@
 //        }
       if (className != 'Outline') {
         publicMethod('fromJson', () {
-          writeln(
-              'public static $className fromJson(JsonObject jsonObject) {');
+          writeln('public static $className fromJson(JsonObject jsonObject) {');
           indent(() {
             for (TypeObjectField field in fields) {
               write('${javaFieldType(field)} ${javaName(field.name)} = ');
diff --git a/pkg/analysis_server/tool/spec/from_html.dart b/pkg/analysis_server/tool/spec/from_html.dart
index 3840d86..671b124 100644
--- a/pkg/analysis_server/tool/spec/from_html.dart
+++ b/pkg/analysis_server/tool/spec/from_html.dart
@@ -423,7 +423,8 @@
   checkName(html, 'type');
   String name = html.attributes['name'];
   String context = name != null ? name : 'type';
-  checkAttributes(html, ['name'], context, optionalAttributes: ['experimental']);
+  checkAttributes(html, ['name'], context,
+      optionalAttributes: ['experimental']);
   TypeDecl type = processContentsAsType(html, context);
   bool experimental = html.attributes['experimental'] == 'true';
   return new TypeDefinition(name, type, html, experimental: experimental);
@@ -517,7 +518,7 @@
  * Create a [TypeObject] from an HTML description.
  */
 TypeObject typeObjectFromHtml(dom.Element html, String context) {
-  checkAttributes(html, [], context,  optionalAttributes: ['experimental']);
+  checkAttributes(html, [], context, optionalAttributes: ['experimental']);
   List<TypeObjectField> fields = <TypeObjectField>[];
   recurse(html, context, {
     'field': (dom.Element child) {
diff --git a/pkg/analysis_server/tool/spec/to_html.dart b/pkg/analysis_server/tool/spec/to_html.dart
index 2ccf00e..a8babb1 100644
--- a/pkg/analysis_server/tool/spec/to_html.dart
+++ b/pkg/analysis_server/tool/spec/to_html.dart
@@ -79,7 +79,8 @@
 
   list-style-type: none;
 }
-'''.trim();
+'''
+    .trim();
 
 final GeneratedFile target =
     new GeneratedFile('doc/api.html', (String pkgPath) {
@@ -448,7 +449,8 @@
     });
   }
 
-  @override visitRefactoring(Refactoring refactoring) {
+  @override
+  visitRefactoring(Refactoring refactoring) {
     dt('refactoring', () {
       write(refactoring.kind);
     });
diff --git a/pkg/analyzer/benchmark/errors_in_all_libraries.dart b/pkg/analyzer/benchmark/errors_in_all_libraries.dart
new file mode 100644
index 0000000..f428191
--- /dev/null
+++ b/pkg/analyzer/benchmark/errors_in_all_libraries.dart
@@ -0,0 +1,88 @@
+#!/usr/bin/env dart
+// 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.
+
+/// Resolves this library and everything it transitively imports and generates
+/// errors in all of those libraries. Does this in an infinite loop, starting
+/// from scratch each time, to show how VM warm-up affects things and to make
+/// it easier to connect to this with observatory.
+import 'dart:io';
+
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart' as p;
+
+void main(List<String> args) {
+  JavaSystemIO.setProperty(
+      "com.google.dart.sdk",
+      p.normalize(
+          p.join(p.dirname(p.fromUri(Platform.script)), "../../../sdk")));
+
+  // Assumes you have run "pub get" in the analyzer directory itself and uses
+  // that "packages" directory as its package root.
+  var packageRoot =
+      p.normalize(p.join(p.dirname(p.fromUri(Platform.script)), "packages"));
+
+  var best = new Duration(days: 1);
+  while (true) {
+    var start = new DateTime.now();
+    AnalysisEngine.instance.clearCaches();
+
+    var context = AnalysisEngine.instance.createAnalysisContext();
+    context.sourceFactory = new SourceFactory([
+      new DartUriResolver(DirectoryBasedDartSdk.defaultSdk),
+      new FileUriResolver(),
+      new PackageUriResolver([new JavaFile(packageRoot)])
+    ]);
+
+    context.analysisOptions.strongMode = true;
+    context.analysisOptions.strongModeHints = true;
+
+    var mainSource =
+        new FileBasedSource(new JavaFile(p.fromUri(Platform.script)));
+    context.applyChanges(new ChangeSet()..addedSource(mainSource));
+
+    var initialLibrary =
+        context.resolveCompilationUnit2(mainSource, mainSource);
+
+    // Walk all of the transitively referenced libraries and compute errors.
+    var errorCount = 0;
+    var allLibraries = _reachableLibraries(initialLibrary.element.library);
+    for (var lib in allLibraries) {
+      for (var unit in lib.units) {
+        var source = unit.source;
+
+        // Skip core libraries.
+        if (source.uri.scheme == 'dart') continue;
+
+        var librarySource = context.getLibrariesContaining(source).single;
+        context.resolveCompilationUnit2(source, librarySource);
+        errorCount += context.computeErrors(source).length;
+      }
+    }
+
+    var elapsed = new DateTime.now().difference(start);
+    print("$elapsed : $errorCount errors ${elapsed < best ? "(best)" : ""}");
+    if (elapsed < best) best = elapsed;
+  }
+}
+
+/// Returns all libraries transitively imported or exported from [start].
+List<LibraryElement> _reachableLibraries(LibraryElement start) {
+  var results = <LibraryElement>[];
+  var seen = new Set();
+  void find(LibraryElement lib) {
+    if (seen.contains(lib)) return;
+    seen.add(lib);
+    results.add(lib);
+    lib.importedLibraries.forEach(find);
+    lib.exportedLibraries.forEach(find);
+  }
+  find(start);
+  return results;
+}
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index e53a204..9e5bca2 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -6704,7 +6704,12 @@
   /**
    * Initialize a newly created identifier.
    */
-  factory SimpleIdentifier(Token token) = SimpleIdentifierImpl;
+  factory SimpleIdentifier(Token token, {bool isDeclaration: false}) {
+    if (isDeclaration) {
+      return new DeclaredSimpleIdentifier(token);
+    }
+    return new SimpleIdentifierImpl(token);
+  }
 
   /**
    * Return the auxiliary elements associated with this identifier, or `null` if
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index f387048..989e7c6 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -895,893 +895,6 @@
 }
 
 /**
- * An AST Visitor that captures visit call timings.
- */
-class TimedAstVisitor<T> implements AstVisitor<T> {
-  /**
-   * The base visitor whose visit methods will be timed.
-   */
-  final AstVisitor<T> _baseVisitor;
-
-  /**
-   * Collects elapsed time for visit calls.
-   */
-  final Stopwatch stopwatch;
-
-  /**
-   * Initialize a newly created visitor to time calls to the given base
-   * visitor's visits.
-   */
-  TimedAstVisitor(this._baseVisitor, [Stopwatch watch])
-      : stopwatch = watch ?? new Stopwatch();
-
-  @override
-  T visitAdjacentStrings(AdjacentStrings node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitAdjacentStrings(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitAnnotation(Annotation node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitAnnotation(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitArgumentList(ArgumentList node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitArgumentList(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitAsExpression(AsExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitAsExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitAssertStatement(AssertStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitAssertStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitAssignmentExpression(AssignmentExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitAssignmentExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitAwaitExpression(AwaitExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitAwaitExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitBinaryExpression(BinaryExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitBinaryExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitBlock(Block node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitBlock(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitBlockFunctionBody(BlockFunctionBody node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitBlockFunctionBody(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitBooleanLiteral(BooleanLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitBooleanLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitBreakStatement(BreakStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitBreakStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitCascadeExpression(CascadeExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitCascadeExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitCatchClause(CatchClause node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitCatchClause(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitClassDeclaration(ClassDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitClassDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitClassTypeAlias(ClassTypeAlias node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitClassTypeAlias(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitComment(Comment node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitComment(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitCommentReference(CommentReference node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitCommentReference(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitCompilationUnit(CompilationUnit node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitCompilationUnit(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitConditionalExpression(ConditionalExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitConditionalExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitConfiguration(Configuration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitConfiguration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitConstructorDeclaration(ConstructorDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitConstructorDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitConstructorFieldInitializer(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitConstructorName(ConstructorName node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitConstructorName(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitContinueStatement(ContinueStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitContinueStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitDeclaredIdentifier(DeclaredIdentifier node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitDeclaredIdentifier(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitDefaultFormalParameter(DefaultFormalParameter node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitDefaultFormalParameter(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitDoStatement(DoStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitDoStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitDottedName(DottedName node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitDottedName(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitDoubleLiteral(DoubleLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitDoubleLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitEmptyFunctionBody(EmptyFunctionBody node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitEmptyFunctionBody(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitEmptyStatement(EmptyStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitEmptyStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitEnumConstantDeclaration(EnumConstantDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitEnumConstantDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitEnumDeclaration(EnumDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitEnumDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitExportDirective(ExportDirective node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitExportDirective(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitExpressionFunctionBody(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitExpressionStatement(ExpressionStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitExpressionStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitExtendsClause(ExtendsClause node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitExtendsClause(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFieldDeclaration(FieldDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFieldDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFieldFormalParameter(FieldFormalParameter node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFieldFormalParameter(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitForEachStatement(ForEachStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitForEachStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFormalParameterList(FormalParameterList node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFormalParameterList(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitForStatement(ForStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitForStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFunctionDeclaration(FunctionDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFunctionDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFunctionDeclarationStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFunctionExpression(FunctionExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFunctionExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFunctionExpressionInvocation(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFunctionTypeAlias(FunctionTypeAlias node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFunctionTypeAlias(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitFunctionTypedFormalParameter(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitHideCombinator(HideCombinator node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitHideCombinator(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitIfStatement(IfStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitIfStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitImplementsClause(ImplementsClause node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitImplementsClause(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitImportDirective(ImportDirective node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitImportDirective(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitIndexExpression(IndexExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitIndexExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitInstanceCreationExpression(InstanceCreationExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitInstanceCreationExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitIntegerLiteral(IntegerLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitIntegerLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitInterpolationExpression(InterpolationExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitInterpolationExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitInterpolationString(InterpolationString node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitInterpolationString(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitIsExpression(IsExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitIsExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitLabel(Label node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitLabel(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitLabeledStatement(LabeledStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitLabeledStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitLibraryDirective(LibraryDirective node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitLibraryDirective(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitLibraryIdentifier(LibraryIdentifier node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitLibraryIdentifier(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitListLiteral(ListLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitListLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitMapLiteral(MapLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitMapLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitMapLiteralEntry(MapLiteralEntry node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitMapLiteralEntry(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitMethodDeclaration(MethodDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitMethodDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitMethodInvocation(MethodInvocation node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitMethodInvocation(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitNamedExpression(NamedExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitNamedExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitNativeClause(NativeClause node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitNativeClause(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitNativeFunctionBody(NativeFunctionBody node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitNativeFunctionBody(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitNullLiteral(NullLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitNullLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitParenthesizedExpression(ParenthesizedExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitParenthesizedExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitPartDirective(PartDirective node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitPartDirective(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitPartOfDirective(PartOfDirective node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitPartOfDirective(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitPostfixExpression(PostfixExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitPostfixExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitPrefixedIdentifier(PrefixedIdentifier node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitPrefixedIdentifier(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitPrefixExpression(PrefixExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitPrefixExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitPropertyAccess(PropertyAccess node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitPropertyAccess(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitRedirectingConstructorInvocation(
-      RedirectingConstructorInvocation node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitRedirectingConstructorInvocation(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitRethrowExpression(RethrowExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitRethrowExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitReturnStatement(ReturnStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitReturnStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitScriptTag(ScriptTag node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitScriptTag(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitShowCombinator(ShowCombinator node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitShowCombinator(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSimpleFormalParameter(SimpleFormalParameter node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSimpleFormalParameter(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSimpleIdentifier(SimpleIdentifier node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSimpleIdentifier(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSimpleStringLiteral(SimpleStringLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSimpleStringLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitStringInterpolation(StringInterpolation node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitStringInterpolation(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSuperConstructorInvocation(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSuperExpression(SuperExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSuperExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSwitchCase(SwitchCase node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSwitchCase(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSwitchDefault(SwitchDefault node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSwitchDefault(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSwitchStatement(SwitchStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSwitchStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitSymbolLiteral(SymbolLiteral node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitSymbolLiteral(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitThisExpression(ThisExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitThisExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitThrowExpression(ThrowExpression node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitThrowExpression(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitTopLevelVariableDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitTryStatement(TryStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitTryStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitTypeArgumentList(TypeArgumentList node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitTypeArgumentList(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitTypeName(TypeName node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitTypeName(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitTypeParameter(TypeParameter node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitTypeParameter(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitTypeParameterList(TypeParameterList node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitTypeParameterList(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitVariableDeclaration(VariableDeclaration node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitVariableDeclaration(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitVariableDeclarationList(VariableDeclarationList node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitVariableDeclarationList(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitVariableDeclarationStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitWhileStatement(WhileStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitWhileStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitWithClause(WithClause node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitWithClause(node);
-    stopwatch.stop();
-    return result;
-  }
-
-  @override
-  T visitYieldStatement(YieldStatement node) {
-    stopwatch.start();
-    T result = _baseVisitor.visitYieldStatement(node);
-    stopwatch.stop();
-    return result;
-  }
-}
-
-/**
  * An AST visitor that will recursively visit all of the nodes in an AST
  * structure (like instances of the class [RecursiveAstVisitor]). In addition,
  * when a node of a specific type is visited not only will the visit method for
@@ -3214,6 +2327,893 @@
 }
 
 /**
+ * An AST Visitor that captures visit call timings.
+ */
+class TimedAstVisitor<T> implements AstVisitor<T> {
+  /**
+   * The base visitor whose visit methods will be timed.
+   */
+  final AstVisitor<T> _baseVisitor;
+
+  /**
+   * Collects elapsed time for visit calls.
+   */
+  final Stopwatch stopwatch;
+
+  /**
+   * Initialize a newly created visitor to time calls to the given base
+   * visitor's visits.
+   */
+  TimedAstVisitor(this._baseVisitor, [Stopwatch watch])
+      : stopwatch = watch ?? new Stopwatch();
+
+  @override
+  T visitAdjacentStrings(AdjacentStrings node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitAdjacentStrings(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitAnnotation(Annotation node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitAnnotation(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitArgumentList(ArgumentList node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitArgumentList(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitAsExpression(AsExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitAsExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitAssertStatement(AssertStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitAssertStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitAssignmentExpression(AssignmentExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitAssignmentExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitAwaitExpression(AwaitExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitAwaitExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitBinaryExpression(BinaryExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitBinaryExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitBlock(Block node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitBlock(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitBlockFunctionBody(BlockFunctionBody node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitBlockFunctionBody(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitBooleanLiteral(BooleanLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitBooleanLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitBreakStatement(BreakStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitBreakStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitCascadeExpression(CascadeExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitCascadeExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitCatchClause(CatchClause node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitCatchClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitClassDeclaration(ClassDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitClassDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitClassTypeAlias(ClassTypeAlias node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitClassTypeAlias(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitComment(Comment node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitComment(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitCommentReference(CommentReference node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitCommentReference(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitCompilationUnit(CompilationUnit node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitCompilationUnit(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitConditionalExpression(ConditionalExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitConditionalExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitConfiguration(Configuration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitConfiguration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitConstructorDeclaration(ConstructorDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitConstructorDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitConstructorFieldInitializer(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitConstructorName(ConstructorName node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitConstructorName(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitContinueStatement(ContinueStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitContinueStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitDeclaredIdentifier(DeclaredIdentifier node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitDeclaredIdentifier(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitDefaultFormalParameter(DefaultFormalParameter node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitDefaultFormalParameter(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitDoStatement(DoStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitDoStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitDottedName(DottedName node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitDottedName(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitDoubleLiteral(DoubleLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitDoubleLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitEmptyFunctionBody(EmptyFunctionBody node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitEmptyFunctionBody(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitEmptyStatement(EmptyStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitEmptyStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitEnumConstantDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitEnumDeclaration(EnumDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitEnumDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitExportDirective(ExportDirective node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitExportDirective(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitExpressionFunctionBody(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitExpressionStatement(ExpressionStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitExpressionStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitExtendsClause(ExtendsClause node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitExtendsClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFieldDeclaration(FieldDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFieldDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFieldFormalParameter(FieldFormalParameter node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFieldFormalParameter(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitForEachStatement(ForEachStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitForEachStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFormalParameterList(FormalParameterList node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFormalParameterList(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitForStatement(ForStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitForStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFunctionDeclaration(FunctionDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFunctionDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFunctionDeclarationStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFunctionExpression(FunctionExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFunctionExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFunctionExpressionInvocation(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFunctionTypeAlias(FunctionTypeAlias node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFunctionTypeAlias(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitFunctionTypedFormalParameter(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitHideCombinator(HideCombinator node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitHideCombinator(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitIfStatement(IfStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitIfStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitImplementsClause(ImplementsClause node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitImplementsClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitImportDirective(ImportDirective node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitImportDirective(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitIndexExpression(IndexExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitIndexExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitInstanceCreationExpression(InstanceCreationExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitInstanceCreationExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitIntegerLiteral(IntegerLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitIntegerLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitInterpolationExpression(InterpolationExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitInterpolationExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitInterpolationString(InterpolationString node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitInterpolationString(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitIsExpression(IsExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitIsExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitLabel(Label node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitLabel(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitLabeledStatement(LabeledStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitLabeledStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitLibraryDirective(LibraryDirective node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitLibraryDirective(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitLibraryIdentifier(LibraryIdentifier node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitLibraryIdentifier(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitListLiteral(ListLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitListLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitMapLiteral(MapLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitMapLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitMapLiteralEntry(MapLiteralEntry node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitMapLiteralEntry(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitMethodDeclaration(MethodDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitMethodDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitMethodInvocation(MethodInvocation node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitMethodInvocation(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitNamedExpression(NamedExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitNamedExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitNativeClause(NativeClause node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitNativeClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitNativeFunctionBody(NativeFunctionBody node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitNativeFunctionBody(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitNullLiteral(NullLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitNullLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitParenthesizedExpression(ParenthesizedExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitParenthesizedExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitPartDirective(PartDirective node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitPartDirective(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitPartOfDirective(PartOfDirective node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitPartOfDirective(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitPostfixExpression(PostfixExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitPostfixExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitPrefixedIdentifier(PrefixedIdentifier node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitPrefixedIdentifier(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitPrefixExpression(PrefixExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitPrefixExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitPropertyAccess(PropertyAccess node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitPropertyAccess(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitRedirectingConstructorInvocation(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitRethrowExpression(RethrowExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitRethrowExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitReturnStatement(ReturnStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitReturnStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitScriptTag(ScriptTag node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitScriptTag(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitShowCombinator(ShowCombinator node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitShowCombinator(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSimpleFormalParameter(SimpleFormalParameter node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSimpleFormalParameter(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSimpleIdentifier(SimpleIdentifier node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSimpleIdentifier(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSimpleStringLiteral(SimpleStringLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSimpleStringLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitStringInterpolation(StringInterpolation node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitStringInterpolation(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSuperConstructorInvocation(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSuperExpression(SuperExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSuperExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSwitchCase(SwitchCase node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSwitchCase(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSwitchDefault(SwitchDefault node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSwitchDefault(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSwitchStatement(SwitchStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSwitchStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitSymbolLiteral(SymbolLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSymbolLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitThisExpression(ThisExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitThisExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitThrowExpression(ThrowExpression node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitThrowExpression(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitTopLevelVariableDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitTryStatement(TryStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitTryStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitTypeArgumentList(TypeArgumentList node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitTypeArgumentList(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitTypeName(TypeName node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitTypeName(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitTypeParameter(TypeParameter node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitTypeParameter(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitTypeParameterList(TypeParameterList node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitTypeParameterList(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitVariableDeclaration(VariableDeclaration node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitVariableDeclaration(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitVariableDeclarationList(VariableDeclarationList node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitVariableDeclarationList(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitVariableDeclarationStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitWhileStatement(WhileStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitWhileStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitWithClause(WithClause node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitWithClause(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
+  T visitYieldStatement(YieldStatement node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitYieldStatement(node);
+    stopwatch.stop();
+    return result;
+  }
+}
+
+/**
  * An AST visitor that will recursively visit all of the nodes in an AST
  * structure (like instances of the class [RecursiveAstVisitor]). In addition,
  * every node will also be visited by using a single unified [visitNode] method.
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index 22d1b81..93428bc 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -456,17 +456,6 @@
   bool exists() => file.exists;
 
   @override
-  Uri resolveRelativeUri(Uri relativeUri) {
-    Uri baseUri = uri;
-    String scheme = uri.scheme;
-    if (scheme == DartUriResolver.DART_SCHEME) {
-      String libraryName = uri.path;
-      baseUri = Uri.parse('$scheme:$libraryName/$libraryName.dart');
-    }
-    return baseUri.resolveUri(relativeUri);
-  }
-
-  @override
   String toString() => file.toString();
 }
 
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 66125a6..1088fcc 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -132,21 +132,21 @@
   }
 
   @override
-  void writeAsBytesSync(List<int> bytes) {
+  Resource renameSync(String newPath) {
     try {
       io.File file = _entry as io.File;
-      file.writeAsBytesSync(bytes);
+      io.File newFile = file.renameSync(newPath);
+      return new _PhysicalFile(newFile);
     } on io.FileSystemException catch (exception) {
       throw new FileSystemException(exception.path, exception.message);
     }
   }
 
   @override
-  Resource renameSync(String newPath) {
+  void writeAsBytesSync(List<int> bytes) {
     try {
       io.File file = _entry as io.File;
-      io.File newFile = file.renameSync(newPath);
-      return new _PhysicalFile(newFile);
+      file.writeAsBytesSync(bytes);
     } on io.FileSystemException catch (exception) {
       throw new FileSystemException(exception.path, exception.message);
     }
diff --git a/pkg/analyzer/lib/source/analysis_options_provider.dart b/pkg/analyzer/lib/source/analysis_options_provider.dart
index b96ba5c..3e15c64 100644
--- a/pkg/analyzer/lib/source/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/source/analysis_options_provider.dart
@@ -4,6 +4,8 @@
 
 library analyzer.source.analysis_options_provider;
 
+import 'dart:core' hide Resource;
+
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/util/yaml.dart';
@@ -14,10 +16,16 @@
 class AnalysisOptionsProvider {
   /// Provide the options found in [root]/[ANALYSIS_OPTIONS_FILE].
   /// Return an empty options map if the file does not exist.
-  Map<String, YamlNode> getOptions(Folder root) {
-    var optionsSource = _readAnalysisOptionsFile(
-        root.getChild(AnalysisEngine.ANALYSIS_OPTIONS_FILE));
-    return getOptionsFromString(optionsSource);
+  Map<String, YamlNode> getOptions(Folder root, {bool crawlUp: false}) {
+    Resource resource;
+    for (Folder folder = root; folder != null; folder = folder.parent) {
+      resource = folder.getChild(AnalysisEngine.ANALYSIS_OPTIONS_FILE);
+      if (resource.exists || !crawlUp) {
+        break;
+      }
+    }
+    String optionsText = _readAnalysisOptionsFile(resource);
+    return getOptionsFromString(optionsText);
   }
 
   /// Provide the options found in [file].
diff --git a/pkg/analyzer/lib/source/embedder.dart b/pkg/analyzer/lib/source/embedder.dart
index bbc6659..b55f5d9 100644
--- a/pkg/analyzer/lib/source/embedder.dart
+++ b/pkg/analyzer/lib/source/embedder.dart
@@ -40,7 +40,7 @@
   @override
   AnalysisContext get context {
     if (_analysisContext == null) {
-      _analysisContext = new SdkAnalysisContext();
+      _analysisContext = new SdkAnalysisContext(null);
       SourceFactory factory = new SourceFactory([_resolver]);
       _analysisContext.sourceFactory = factory;
       List<String> uris = this.uris;
diff --git a/pkg/analyzer/lib/src/codegen/tools.dart b/pkg/analyzer/lib/src/codegen/tools.dart
index dd6ee41..763359a 100644
--- a/pkg/analyzer/lib/src/codegen/tools.dart
+++ b/pkg/analyzer/lib/src/codegen/tools.dart
@@ -99,14 +99,16 @@
    */
   void docComment(List<dom.Node> docs, {bool removeTrailingNewLine: false}) {
     if (containsOnlyWhitespace(docs)) return;
-    if (codeGeneratorSettings.docCommentStartMarker != null) writeln(codeGeneratorSettings.docCommentStartMarker);
+    if (codeGeneratorSettings.docCommentStartMarker != null)
+      writeln(codeGeneratorSettings.docCommentStartMarker);
     int width = codeGeneratorSettings.commentLineLength;
     bool javadocStyle = codeGeneratorSettings.languageName == 'java';
     indentBy(codeGeneratorSettings.docCommentLineLeader, () {
       write(nodesToText(docs, width - _state.indent.length, javadocStyle,
           removeTrailingNewLine: removeTrailingNewLine));
     });
-    if (codeGeneratorSettings.docCommentEndMarker != null) writeln(codeGeneratorSettings.docCommentEndMarker);
+    if (codeGeneratorSettings.docCommentEndMarker != null)
+      writeln(codeGeneratorSettings.docCommentEndMarker);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 90d5ffc..d2659ba 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -1066,7 +1066,8 @@
       // If not the same content (e.g. the file is being closed without save),
       // then force analysis.
       if (changed) {
-        if (!analysisOptions.incremental ||
+        if (newContents == null ||
+            !analysisOptions.incremental ||
             !_tryPoorMansIncrementalResolution(source, newContents)) {
           _sourceChanged(source);
         }
@@ -2173,6 +2174,22 @@
  * An [AnalysisContext] that only contains sources for a Dart SDK.
  */
 class SdkAnalysisContext extends AnalysisContextImpl {
+  /**
+   * Initialize a newly created SDK analysis context with the given [options].
+   * Analysis options cannot be changed afterwards.  If the given [options] are
+   * `null`, then default options are used.
+   */
+  SdkAnalysisContext(AnalysisOptions options) {
+    if (options != null) {
+      super.analysisOptions = options;
+    }
+  }
+
+  @override
+  void set analysisOptions(AnalysisOptions options) {
+    throw new StateError('AnalysisOptions of SDK context cannot be changed.');
+  }
+
   @override
   AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
     if (factory == null) {
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 5d18886..3a22291 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -286,7 +286,8 @@
             "Cannot resolve a relative URI without a containing source: "
             "$containedUri");
       }
-      containedUri = containingSource.resolveRelativeUri(containedUri);
+      containedUri =
+          utils.resolveRelativeUri(containingSource.uri, containedUri);
     }
 
     Uri actualUri = containedUri;
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 3f398ac..a8d1917 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3258,6 +3258,24 @@
 }
 
 /**
+ * A simple identifier that declares a name.
+ */
+// TODO(rnystrom): Consider making this distinct from [SimpleIdentifier] and
+// get rid of all of the:
+//
+//     if (node.inDeclarationContext()) { ... }
+//
+// code and instead visit this separately. A declaration is semantically pretty
+// different from a use, so using the same node type doesn't seem to buy us
+// much.
+class DeclaredSimpleIdentifier extends SimpleIdentifierImpl {
+  DeclaredSimpleIdentifier(Token token) : super(token);
+
+  @override
+  bool inDeclarationContext() => true;
+}
+
+/**
  * A formal parameter with a default value. There are two kinds of parameters
  * that are both represented by this class: named formal parameters and
  * positional formal parameters.
@@ -8930,7 +8948,7 @@
 
   @override
   void set propagatedElement(Element element) {
-    _propagatedElement = _validateElement(element);
+    _propagatedElement = element;
   }
 
   @override
@@ -8938,7 +8956,7 @@
 
   @override
   void set staticElement(Element element) {
-    _staticElement = _validateElement(element);
+    _staticElement = element;
   }
 
   @override
@@ -8946,46 +8964,7 @@
       visitor.visitSimpleIdentifier(this);
 
   @override
-  bool inDeclarationContext() {
-    // TODO(brianwilkerson) Convert this to a getter.
-    AstNode parent = this.parent;
-    if (parent is CatchClause) {
-      CatchClause clause = parent;
-      return identical(this, clause.exceptionParameter) ||
-          identical(this, clause.stackTraceParameter);
-    } else if (parent is ClassDeclaration) {
-      return identical(this, parent.name);
-    } else if (parent is ClassTypeAlias) {
-      return identical(this, parent.name);
-    } else if (parent is ConstructorDeclaration) {
-      return identical(this, parent.name);
-    } else if (parent is DeclaredIdentifier) {
-      return identical(this, parent.identifier);
-    } else if (parent is EnumDeclaration) {
-      return identical(this, parent.name);
-    } else if (parent is EnumConstantDeclaration) {
-      return identical(this, parent.name);
-    } else if (parent is FunctionDeclaration) {
-      return identical(this, parent.name);
-    } else if (parent is FunctionTypeAlias) {
-      return identical(this, parent.name);
-    } else if (parent is ImportDirective) {
-      return identical(this, parent.prefix);
-    } else if (parent is Label) {
-      return identical(this, parent.label) &&
-          (parent.parent is LabeledStatement);
-    } else if (parent is MethodDeclaration) {
-      return identical(this, parent.name);
-    } else if (parent is FunctionTypedFormalParameter ||
-        parent is SimpleFormalParameter) {
-      return identical(this, (parent as NormalFormalParameter).identifier);
-    } else if (parent is TypeParameter) {
-      return identical(this, parent.name);
-    } else if (parent is VariableDeclaration) {
-      return identical(this, parent.name);
-    }
-    return false;
-  }
+  bool inDeclarationContext() => false;
 
   @override
   bool inGetterContext() {
@@ -9066,66 +9045,6 @@
   void visitChildren(AstVisitor visitor) {
     // There are no children to visit.
   }
-
-  /**
-   * Return the given element if it is valid, or report the problem and return
-   * `null` if it is not appropriate.
-   *
-   * The [parent] is the parent of the element, used for reporting when there is
-   * a problem.
-   * The [isValid] is `true` if the element is appropriate.
-   * The [element] is the element to be associated with this identifier.
-   */
-  Element _returnOrReportElement(
-      AstNode parent, bool isValid, Element element) {
-    if (!isValid) {
-      AnalysisEngine.instance.logger.logInformation(
-          "Internal error: attempting to set the name of a ${parent.runtimeType} to a ${element.runtimeType}",
-          new CaughtException(new AnalysisException(), null));
-      return null;
-    }
-    return element;
-  }
-
-  /**
-   * Return the given [element] if it is an appropriate element based on the
-   * parent of this identifier, or `null` if it is not appropriate.
-   */
-  Element _validateElement(Element element) {
-    if (element == null) {
-      return null;
-    }
-    AstNode parent = this.parent;
-    if (parent is ClassDeclaration && identical(parent.name, this)) {
-      return _returnOrReportElement(parent, element is ClassElement, element);
-    } else if (parent is ClassTypeAlias && identical(parent.name, this)) {
-      return _returnOrReportElement(parent, element is ClassElement, element);
-    } else if (parent is DeclaredIdentifier &&
-        identical(parent.identifier, this)) {
-      return _returnOrReportElement(
-          parent, element is LocalVariableElement, element);
-    } else if (parent is FormalParameter &&
-        identical(parent.identifier, this)) {
-      return _returnOrReportElement(
-          parent, element is ParameterElement, element);
-    } else if (parent is FunctionDeclaration && identical(parent.name, this)) {
-      return _returnOrReportElement(
-          parent, element is ExecutableElement, element);
-    } else if (parent is FunctionTypeAlias && identical(parent.name, this)) {
-      return _returnOrReportElement(
-          parent, element is FunctionTypeAliasElement, element);
-    } else if (parent is MethodDeclaration && identical(parent.name, this)) {
-      return _returnOrReportElement(
-          parent, element is ExecutableElement, element);
-    } else if (parent is TypeParameter && identical(parent.name, this)) {
-      return _returnOrReportElement(
-          parent, element is TypeParameterElement, element);
-    } else if (parent is VariableDeclaration && identical(parent.name, this)) {
-      return _returnOrReportElement(
-          parent, element is VariableElement, element);
-    }
-    return element;
-  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 3628346..edd0196 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -778,7 +778,8 @@
 
   @override
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) =>
-      new SimpleIdentifier(cloneToken(node.token));
+      new SimpleIdentifier(cloneToken(node.token),
+          isDeclaration: node.inDeclarationContext());
 
   @override
   SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) =>
@@ -3433,7 +3434,8 @@
       // documentation comments for the parser.
       mappedToken = node.token;
     }
-    SimpleIdentifier copy = new SimpleIdentifier(mappedToken);
+    SimpleIdentifier copy = new SimpleIdentifier(mappedToken,
+        isDeclaration: node.inDeclarationContext());
     copy.auxiliaryElements = node.auxiliaryElements;
     copy.propagatedElement = node.propagatedElement;
     copy.propagatedType = node.propagatedType;
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 5484bba..2bf03d5 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -295,16 +295,17 @@
           // any other constants.  So we don't need to report any dependencies.
           return;
         }
-        bool superInvocationFound = false;
+        bool defaultSuperInvocationNeeded = true;
         List<ConstructorInitializer> initializers =
             constant.constantInitializers;
         for (ConstructorInitializer initializer in initializers) {
-          if (initializer is SuperConstructorInvocation) {
-            superInvocationFound = true;
+          if (initializer is SuperConstructorInvocation ||
+              initializer is RedirectingConstructorInvocation) {
+            defaultSuperInvocationNeeded = false;
           }
           initializer.accept(referenceFinder);
         }
-        if (!superInvocationFound) {
+        if (defaultSuperInvocationNeeded) {
           // No explicit superconstructor invocation found, so we need to
           // manually insert a reference to the implicit superconstructor.
           InterfaceType superclass =
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 2754786..2803273 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -370,6 +370,7 @@
       if (node.exceptionType == null) {
         exception.hasImplicitType = true;
       }
+      exception.setVisibleRange(node.offset, node.length);
       _currentHolder.addLocalVariable(exception);
       exceptionParameter.staticElement = exception;
       // stack trace
@@ -378,6 +379,7 @@
         LocalVariableElementImpl stackTrace =
             new LocalVariableElementImpl.forNode(stackTraceParameter);
         _setCodeRange(stackTrace, stackTraceParameter);
+        stackTrace.setVisibleRange(node.offset, node.length);
         _currentHolder.addLocalVariable(stackTrace);
         stackTraceParameter.staticElement = stackTrace;
       }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index c91582c..01da784f 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -568,7 +568,8 @@
   @override
   MethodElement lookUpConcreteMethod(
           String methodName, LibraryElement library) =>
-      _internalLookUpConcreteMethod(methodName, library, true);
+      _internalLookUpConcreteMethod(
+          methodName, library, true, new HashSet<ClassElement>());
 
   @override
   PropertyAccessorElement lookUpGetter(
@@ -583,7 +584,8 @@
   @override
   MethodElement lookUpInheritedConcreteMethod(
           String methodName, LibraryElement library) =>
-      _internalLookUpConcreteMethod(methodName, library, false);
+      _internalLookUpConcreteMethod(
+          methodName, library, false, new HashSet<ClassElement>());
 
   @override
   PropertyAccessorElement lookUpInheritedConcreteSetter(
@@ -593,11 +595,13 @@
   @override
   MethodElement lookUpInheritedMethod(
           String methodName, LibraryElement library) =>
-      _internalLookUpMethod(methodName, library, false);
+      _internalLookUpMethod(
+          methodName, library, false, new HashSet<ClassElement>());
 
   @override
   MethodElement lookUpMethod(String methodName, LibraryElement library) =>
-      _internalLookUpMethod(methodName, library, true);
+      _internalLookUpMethod(
+          methodName, library, true, new HashSet<ClassElement>());
 
   @override
   PropertyAccessorElement lookUpSetter(
@@ -679,11 +683,7 @@
         visitedClasses.add(this);
       }
       try {
-        ClassElement superclass = supertype.element;
-        if (superclass is ClassElementHandle) {
-          superclass = (superclass as ClassElementHandle).actualElement;
-        }
-        constructorsToForward = (superclass as ClassElementImpl)
+        constructorsToForward = getImpl(supertype.element)
             ._computeMixinAppConstructors(visitedClasses);
       } finally {
         visitedClasses.removeLast();
@@ -745,25 +745,29 @@
         _internalLookUpGetter(getterName, library, includeThisClass);
     while (getter != null && getter.isAbstract) {
       Element definingClass = getter.enclosingElement;
-      if (definingClass is! ClassElementImpl) {
+      if (definingClass is! ClassElement) {
         return null;
       }
-      getter = (definingClass as ClassElementImpl)
+      getter = getImpl(definingClass)
           ._internalLookUpGetter(getterName, library, false);
     }
     return getter;
   }
 
   MethodElement _internalLookUpConcreteMethod(
-      String methodName, LibraryElement library, bool includeThisClass) {
-    MethodElement method =
-        _internalLookUpMethod(methodName, library, includeThisClass);
+      String methodName,
+      LibraryElement library,
+      bool includeThisClass,
+      HashSet<ClassElement> visitedClasses) {
+    MethodElement method = _internalLookUpMethod(
+        methodName, library, includeThisClass, visitedClasses);
     while (method != null && method.isAbstract) {
       ClassElement definingClass = method.enclosingElement;
       if (definingClass == null) {
         return null;
       }
-      method = definingClass.lookUpInheritedMethod(methodName, library);
+      method = getImpl(definingClass)
+          ._internalLookUpMethod(methodName, library, false, visitedClasses);
     }
     return method;
   }
@@ -816,9 +820,8 @@
     return null;
   }
 
-  MethodElement _internalLookUpMethod(
-      String methodName, LibraryElement library, bool includeThisClass) {
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+  MethodElement _internalLookUpMethod(String methodName, LibraryElement library,
+      bool includeThisClass, HashSet<ClassElement> visitedClasses) {
     ClassElement currentElement = this;
     if (includeThisClass) {
       MethodElement element = currentElement.getMethod(methodName);
@@ -908,6 +911,18 @@
     }
     return false;
   }
+
+  /**
+   * Return the [ClassElementImpl] of the given [classElement].  May throw an
+   * exception if the [ClassElementImpl] cannot be provided (should not happen
+   * though).
+   */
+  static ClassElementImpl getImpl(ClassElement classElement) {
+    if (classElement is ClassElementHandle) {
+      return getImpl(classElement.actualElement);
+    }
+    return classElement as ClassElementImpl;
+  }
 }
 
 /**
@@ -1082,7 +1097,13 @@
    */
   void set types(List<ClassElement> types) {
     for (ClassElement type in types) {
-      (type as ClassElementImpl).enclosingElement = this;
+      // Another implementation of ClassElement is _DeferredClassElement,
+      // which is used to resynthesize classes lazily. We cannot cast it
+      // to ClassElementImpl, and it already can provide correct values of the
+      // 'enclosingElement' property.
+      if (type is ClassElementImpl) {
+        type.enclosingElement = this;
+      }
     }
     this._types = types;
   }
@@ -2742,6 +2763,20 @@
    */
   FunctionElementImpl.forOffset(int nameOffset) : super("", nameOffset);
 
+  /**
+   * Synthesize an unnamed function element that takes [parameters] and returns
+   * [returnType].
+   */
+  FunctionElementImpl.synthetic(
+      List<ParameterElement> parameters, DartType returnType)
+      : super("", -1) {
+    synthetic = true;
+    this.returnType = returnType;
+    this.parameters = parameters;
+
+    type = new FunctionTypeImpl(this);
+  }
+
   @override
   String get identifier {
     String identifier = super.identifier;
@@ -3758,8 +3793,8 @@
   }
 
   @override
-  VariableDeclaration computeNode() =>
-      getNodeMatching((node) => node is VariableDeclaration);
+  Declaration computeNode() => getNodeMatching(
+      (node) => node is DeclaredIdentifier || node is VariableDeclaration);
 
   /**
    * Set the visible range for this element to the range starting at the given
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 9945d4e..e8591ae 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -631,7 +631,7 @@
       // does not apply to conditional method invocation (i.e. 'C?.m(...)').
       //
       bool isConditional = node.operator.type == TokenType.QUESTION_PERIOD;
-      ClassElementImpl typeReference = getTypeReference(target);
+      ClassElement typeReference = getTypeReference(target);
       if (typeReference != null) {
         if (node.isCascaded) {
           typeReference = _typeType.element;
@@ -783,7 +783,7 @@
           return null;
         }
         if (!node.isCascaded) {
-          ClassElementImpl typeReference = getTypeReference(target);
+          ClassElement typeReference = getTypeReference(target);
           if (typeReference != null) {
             ConstructorElement constructor =
                 typeReference.getNamedConstructor(methodName.name);
@@ -1118,7 +1118,8 @@
 
   @override
   Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    ClassElementImpl enclosingClass = _resolver.enclosingClass;
+    ClassElementImpl enclosingClass =
+        ClassElementImpl.getImpl(_resolver.enclosingClass);
     if (enclosingClass == null) {
       // TODO(brianwilkerson) Report this error.
       return null;
@@ -2252,7 +2253,7 @@
     // hierarchy, instead we just look for the member in the type only.  This
     // does not apply to conditional property accesses (i.e. 'C?.m').
     //
-    ClassElementImpl typeReference = getTypeReference(target);
+    ClassElement typeReference = getTypeReference(target);
     if (typeReference != null) {
       if (isCascaded) {
         typeReference = _typeType.element;
@@ -2441,10 +2442,10 @@
    * then the element representing the class is returned, otherwise `null` is
    * returned.
    */
-  static ClassElementImpl getTypeReference(Expression expression) {
+  static ClassElement getTypeReference(Expression expression) {
     if (expression is Identifier) {
       Element staticElement = expression.staticElement;
-      if (staticElement is ClassElementImpl) {
+      if (staticElement is ClassElement) {
         return staticElement;
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 28d02ec..c77d13a 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -198,7 +198,7 @@
    * The class containing the AST nodes being visited, or `null` if we are not
    * in the scope of a class.
    */
-  ClassElement _enclosingClass;
+  ClassElementImpl _enclosingClass;
 
   /**
    * The method or function that we are currently visiting, or `null` if we are
@@ -420,10 +420,10 @@
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement outerClass = _enclosingClass;
+    ClassElementImpl outerClass = _enclosingClass;
     try {
       _isInNativeClass = node.nativeClause != null;
-      _enclosingClass = node.element;
+      _enclosingClass = ClassElementImpl.getImpl(node.element);
       ExtendsClause extendsClause = node.extendsClause;
       ImplementsClause implementsClause = node.implementsClause;
       WithClause withClause = node.withClause;
@@ -472,7 +472,7 @@
    */
   void visitClassDeclarationIncrementally(ClassDeclaration node) {
     _isInNativeClass = node.nativeClause != null;
-    _enclosingClass = node.element;
+    _enclosingClass = ClassElementImpl.getImpl(node.element);
     // initialize initialFieldElementsMap
     if (_enclosingClass != null) {
       List<FieldElement> fieldElements = _enclosingClass.fields;
@@ -490,9 +490,9 @@
   Object visitClassTypeAlias(ClassTypeAlias node) {
     _checkForBuiltInIdentifierAsName(
         node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
-    ClassElement outerClassElement = _enclosingClass;
+    ClassElementImpl outerClassElement = _enclosingClass;
     try {
-      _enclosingClass = node.element;
+      _enclosingClass = ClassElementImpl.getImpl(node.element);
       ImplementsClause implementsClause = node.implementsClause;
       // Only check for all of the inheritance logic around clauses if there
       // isn't an error code such as "Cannot extend double" already on the
@@ -608,10 +608,10 @@
 
   @override
   Object visitEnumDeclaration(EnumDeclaration node) {
-    ClassElement outerClass = _enclosingClass;
+    ClassElementImpl outerClass = _enclosingClass;
     try {
       _isInNativeClass = false;
-      _enclosingClass = node.element;
+      _enclosingClass = ClassElementImpl.getImpl(node.element);
       return super.visitEnumDeclaration(node);
     } finally {
       _enclosingClass = outerClass;
@@ -642,7 +642,13 @@
       DartType expectedReturnType = functionType == null
           ? DynamicTypeImpl.instance
           : functionType.returnType;
-      _checkForReturnOfInvalidType(node.expression, expectedReturnType);
+      bool isSetterWithImplicitReturn =
+          _enclosingFunction.hasImplicitReturnType &&
+              _enclosingFunction is PropertyAccessorElement &&
+              (_enclosingFunction as PropertyAccessorElement).isSetter;
+      if (!isSetterWithImplicitReturn) {
+        _checkForReturnOfInvalidType(node.expression, expectedReturnType);
+      }
       return super.visitExpressionFunctionBody(node);
     } finally {
       _inAsync = wasInAsync;
@@ -681,6 +687,12 @@
   }
 
   @override
+  Object visitForEachStatement(ForEachStatement node) {
+    _checkForInIterable(node);
+    return super.visitForEachStatement(node);
+  }
+
+  @override
   Object visitForStatement(ForStatement node) {
     if (node.condition != null) {
       _checkForNonBoolCondition(node.condition);
@@ -689,12 +701,6 @@
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
-    _checkForInIterable(node);
-    return super.visitForEachStatement(node);
-  }
-
-  @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
@@ -939,7 +945,7 @@
 
   @override
   Object visitNativeFunctionBody(NativeFunctionBody node) {
-    _checkForNativeFunctionBodyInNonSDKCode(node);
+    _checkForNativeFunctionBodyInNonSdkCode(node);
     return super.visitNativeFunctionBody(node);
   }
 
@@ -1159,7 +1165,25 @@
     if (expression != null && !enableAssertMessage) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.EXTRA_ARGUMENT_TO_ASSERT, expression);
-      return;
+    }
+  }
+
+  /**
+   * Given a list of [directives] that have the same prefix, generate an error
+   * if there is more than one import and any of those imports is deferred.
+   *
+   * See [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX].
+   */
+  void _checkDeferredPrefixCollision(List<ImportDirective> directives) {
+    int count = directives.length;
+    if (count > 1) {
+      for (int i = 0; i < count; i++) {
+        Token deferredToken = directives[i].deferredKeyword;
+        if (deferredToken != null) {
+          _errorReporter.reportErrorForToken(
+              CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken);
+        }
+      }
     }
   }
 
@@ -1169,18 +1193,14 @@
    *
    * See [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS].
    */
-  bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
-    // check number of type arguments
+  void _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
     int num = typeArguments.arguments.length;
-    if (num == 2) {
-      return false;
+    if (num != 2) {
+      _errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
+          typeArguments,
+          [num]);
     }
-    // report problem
-    _errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
-        typeArguments,
-        [num]);
-    return true;
   }
 
   /**
@@ -1192,18 +1212,18 @@
    * [StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR], and
    * [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES].
    */
-  bool _checkForAllFinalInitializedErrorCodes(
+  void _checkForAllFinalInitializedErrorCodes(
       ConstructorDeclaration constructor) {
     if (constructor.factoryKeyword != null ||
         constructor.redirectedConstructor != null ||
         constructor.externalKeyword != null) {
-      return false;
+      return;
     }
     // Ignore if native class.
     if (_isInNativeClass) {
-      return false;
+      return;
     }
-    bool foundError = false;
+
     HashMap<FieldElement, INIT_STATE> fieldElementsMap =
         new HashMap<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
     // Visit all of the field formal parameters
@@ -1227,7 +1247,6 @@
                     .FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
                 formalParameter.identifier,
                 [fieldElement.displayName]);
-            foundError = true;
           }
         } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
           if (fieldElement.isFinal || fieldElement.isConst) {
@@ -1235,7 +1254,6 @@
                 CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
                 formalParameter.identifier,
                 [fieldElement.displayName]);
-            foundError = true;
           }
         }
       }
@@ -1244,7 +1262,7 @@
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     for (ConstructorInitializer constructorInitializer in initializers) {
       if (constructorInitializer is RedirectingConstructorInvocation) {
-        return false;
+        return;
       }
       if (constructorInitializer is ConstructorFieldInitializer) {
         ConstructorFieldInitializer constructorFieldInitializer =
@@ -1262,20 +1280,17 @@
                   StaticWarningCode
                       .FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
                   fieldName);
-              foundError = true;
             }
           } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
             _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode
                     .FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER,
                 fieldName);
-            foundError = true;
           } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
             _errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
                 fieldName,
                 [fieldElement.displayName]);
-            foundError = true;
           }
         }
       }
@@ -1298,13 +1313,11 @@
               CompileTimeErrorCode.CONST_NOT_INITIALIZED,
               constructor.returnType,
               [fieldElement.name]);
-          foundError = true;
         }
       }
     });
 
     if (notInitFinalFields.isNotEmpty) {
-      foundError = true;
       AnalysisErrorWithProperties analysisError;
       List<String> names = notInitFinalFields.map((item) => item.name).toList();
       names.sort();
@@ -1328,7 +1341,6 @@
           ErrorProperty.NOT_INITIALIZED_FIELDS, notInitFinalFields);
       _errorReporter.reportError(analysisError);
     }
-    return foundError;
   }
 
   /**
@@ -1693,7 +1705,7 @@
    * the parameters of the executable element. The [errorNameTarget] is the node
    * to report problems on.
    */
-  bool _checkForAllInvalidOverrideErrorCodesForExecutable(
+  void _checkForAllInvalidOverrideErrorCodesForExecutable(
       ExecutableElement executableElement,
       List<ParameterElement> parameters,
       List<AstNode> parameterLocations,
@@ -1705,15 +1717,14 @@
         .lookupOverrides(_enclosingClass, executableElement.name);
     if (_checkForInstanceMethodNameCollidesWithSuperclassStatic(
         executableElement, errorNameTarget)) {
-      return true;
+      return;
     }
     for (ExecutableElement overriddenElement in overriddenExecutables) {
       if (_checkForAllInvalidOverrideErrorCodes(executableElement,
           overriddenElement, parameters, parameterLocations, errorNameTarget)) {
-        return true;
+        return;
       }
     }
-    return false;
   }
 
   /**
@@ -1721,12 +1732,12 @@
    *
    * See [_checkForAllInvalidOverrideErrorCodes].
    */
-  bool _checkForAllInvalidOverrideErrorCodesForField(
+  void _checkForAllInvalidOverrideErrorCodesForField(
       FieldDeclaration declaration) {
     if (_enclosingClass == null || declaration.isStatic) {
-      return false;
+      return;
     }
-    bool hasProblems = false;
+
     VariableDeclarationList fields = declaration.fields;
     for (VariableDeclaration field in fields.variables) {
       FieldElement element = field.element as FieldElement;
@@ -1737,19 +1748,14 @@
       PropertyAccessorElement setter = element.setter;
       SimpleIdentifier fieldName = field.name;
       if (getter != null) {
-        if (_checkForAllInvalidOverrideErrorCodesForExecutable(getter,
-            ParameterElement.EMPTY_LIST, AstNode.EMPTY_LIST, fieldName)) {
-          hasProblems = true;
-        }
+        _checkForAllInvalidOverrideErrorCodesForExecutable(
+            getter, ParameterElement.EMPTY_LIST, AstNode.EMPTY_LIST, fieldName);
       }
       if (setter != null) {
-        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
-            setter, setter.parameters, <AstNode>[fieldName], fieldName)) {
-          hasProblems = true;
-        }
+        _checkForAllInvalidOverrideErrorCodesForExecutable(
+            setter, setter.parameters, <AstNode>[fieldName], fieldName);
       }
     }
-    return hasProblems;
   }
 
   /**
@@ -1757,27 +1763,27 @@
    *
    * See [_checkForAllInvalidOverrideErrorCodes].
    */
-  bool _checkForAllInvalidOverrideErrorCodesForMethod(
+  void _checkForAllInvalidOverrideErrorCodesForMethod(
       MethodDeclaration method) {
     if (_enclosingClass == null ||
         method.isStatic ||
         method.body is NativeFunctionBody) {
-      return false;
+      return;
     }
     ExecutableElement executableElement = method.element;
     if (executableElement == null) {
-      return false;
+      return;
     }
     SimpleIdentifier methodName = method.name;
     if (methodName.isSynthetic) {
-      return false;
+      return;
     }
     FormalParameterList formalParameterList = method.parameters;
     NodeList<FormalParameter> parameterList =
         formalParameterList != null ? formalParameterList.parameters : null;
     List<AstNode> parameters =
         parameterList != null ? new List.from(parameterList) : null;
-    return _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement,
+    _checkForAllInvalidOverrideErrorCodesForExecutable(executableElement,
         executableElement.parameters, parameters, methodName);
   }
 
@@ -1829,32 +1835,25 @@
    * [StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE], and
    * [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR].
    */
-  bool _checkForAllRedirectConstructorErrorCodes(
+  void _checkForAllRedirectConstructorErrorCodes(
       ConstructorDeclaration declaration) {
-    //
     // Prepare redirected constructor node
-    //
     ConstructorName redirectedConstructor = declaration.redirectedConstructor;
     if (redirectedConstructor == null) {
-      return false;
+      return;
     }
-    //
+
     // Prepare redirected constructor type
-    //
     ConstructorElement redirectedElement = redirectedConstructor.staticElement;
     if (redirectedElement == null) {
-      //
       // If the element is null, we check for the
       // REDIRECT_TO_MISSING_CONSTRUCTOR case
-      //
       TypeName constructorTypeName = redirectedConstructor.type;
       DartType redirectedType = constructorTypeName.type;
       if (redirectedType != null &&
           redirectedType.element != null &&
           !redirectedType.isDynamic) {
-        //
         // Prepare the constructor name
-        //
         String constructorStrName = constructorTypeName.name.name;
         if (redirectedConstructor.name != null) {
           constructorStrName += ".${redirectedConstructor.name.name}";
@@ -1864,15 +1863,13 @@
             : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
         _errorReporter.reportErrorForNode(errorCode, redirectedConstructor,
             [constructorStrName, redirectedType.displayName]);
-        return true;
       }
-      return false;
+      return;
     }
     FunctionType redirectedType = redirectedElement.type;
     DartType redirectedReturnType = redirectedType.returnType;
-    //
+
     // Report specific problem when return type is incompatible
-    //
     FunctionType constructorType = declaration.element.type;
     DartType constructorReturnType = constructorType.returnType;
     if (!_typeSystem.isAssignableTo(
@@ -1881,19 +1878,14 @@
           StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE,
           redirectedConstructor,
           [redirectedReturnType, constructorReturnType]);
-      return true;
-    }
-    //
-    // Check parameters
-    //
-    if (!_typeSystem.isSubtypeOf(redirectedType, constructorType)) {
+      return;
+    } else if (!_typeSystem.isSubtypeOf(redirectedType, constructorType)) {
+      // Check parameters.
       _errorReporter.reportErrorForNode(
           StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE,
           redirectedConstructor,
           [redirectedType, constructorType]);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -1911,7 +1903,7 @@
    * [StaticWarningCode.RETURN_WITHOUT_VALUE], and
    * [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
    */
-  bool _checkForAllReturnStatementErrorCodes(ReturnStatement statement) {
+  void _checkForAllReturnStatementErrorCodes(ReturnStatement statement) {
     FunctionType functionType =
         _enclosingFunction == null ? null : _enclosingFunction.type;
     DartType expectedReturnType = functionType == null
@@ -1923,24 +1915,24 @@
         !(_enclosingFunction as ConstructorElement).isFactory;
     if (isGenerativeConstructor) {
       if (returnExpression == null) {
-        return false;
+        return;
       }
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR,
           returnExpression);
-      return true;
+      return;
     }
     // RETURN_WITHOUT_VALUE
     if (returnExpression == null) {
       if (_inGenerator ||
           _typeSystem.isAssignableTo(
               _computeReturnTypeForMethod(null), expectedReturnType)) {
-        return false;
+        return;
       }
       _hasReturnWithoutValue = true;
       _errorReporter.reportErrorForNode(
           StaticWarningCode.RETURN_WITHOUT_VALUE, statement);
-      return true;
+      return;
     } else if (_inGenerator) {
       // RETURN_IN_GENERATOR
       _errorReporter.reportErrorForNode(
@@ -1948,8 +1940,8 @@
           statement,
           [_inAsync ? "async*" : "sync*"]);
     }
-    // RETURN_OF_INVALID_TYPE
-    return _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
+
+    _checkForReturnOfInvalidType(returnExpression, expectedReturnType);
   }
 
   /**
@@ -1961,10 +1953,10 @@
    *
    * See [CompileTimeErrorCode.AMBIGUOUS_EXPORT].
    */
-  bool _checkForAmbiguousExport(ExportDirective directive,
+  void _checkForAmbiguousExport(ExportDirective directive,
       ExportElement exportElement, LibraryElement exportedLibrary) {
     if (exportedLibrary == null) {
-      return false;
+      return;
     }
     // check exported names
     Namespace namespace =
@@ -1980,12 +1972,11 @@
           prevElement.library.definingCompilationUnit.displayName,
           element.library.definingCompilationUnit.displayName
         ]);
-        return true;
+        return;
       } else {
         _exportedElements[name] = element;
       }
     }
-    return false;
   }
 
   /**
@@ -2005,22 +1996,18 @@
    * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
    * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
    */
-  bool _checkForArgumentTypeNotAssignable(
+  void _checkForArgumentTypeNotAssignable(
       Expression expression,
       DartType expectedStaticType,
       DartType actualStaticType,
       ErrorCode errorCode) {
-    //
     // Warning case: test static type information
-    //
-    if (actualStaticType != null && expectedStaticType != null) {
-      if (!_typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
-        _errorReporter.reportTypeErrorForNode(
-            errorCode, expression, [actualStaticType, expectedStaticType]);
-        return true;
-      }
+    if (actualStaticType != null &&
+        expectedStaticType != null &&
+        !_typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
+      _errorReporter.reportTypeErrorForNode(
+          errorCode, expression, [actualStaticType, expectedStaticType]);
     }
-    return false;
   }
 
   /**
@@ -2032,14 +2019,14 @@
    *
    * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
    */
-  bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
+  void _checkForArgumentTypeNotAssignableForArgument(Expression argument) {
     if (argument == null) {
-      return false;
+      return;
     }
     ParameterElement staticParameterElement = argument.staticParameterElement;
     DartType staticParameterType =
         staticParameterElement == null ? null : staticParameterElement.type;
-    return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument,
+    _checkForArgumentTypeNotAssignableWithExpectedTypes(argument,
         staticParameterType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
   }
 
@@ -2058,12 +2045,11 @@
    * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
    * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
    */
-  bool _checkForArgumentTypeNotAssignableWithExpectedTypes(
-          Expression expression,
-          DartType expectedStaticType,
-          ErrorCode errorCode) =>
-      _checkForArgumentTypeNotAssignable(
-          expression, expectedStaticType, getStaticType(expression), errorCode);
+  void _checkForArgumentTypeNotAssignableWithExpectedTypes(
+      Expression expression, DartType expectedStaticType, ErrorCode errorCode) {
+    _checkForArgumentTypeNotAssignable(
+        expression, expectedStaticType, getStaticType(expression), errorCode);
+  }
 
   /**
    * Verify that the arguments in the given [argumentList] can be assigned to
@@ -2074,17 +2060,14 @@
    *
    * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
    */
-  bool _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
+  void _checkForArgumentTypesNotAssignableInList(ArgumentList argumentList) {
     if (argumentList == null) {
-      return false;
+      return;
     }
-    bool problemReported = false;
+
     for (Expression argument in argumentList.arguments) {
-      if (_checkForArgumentTypeNotAssignableForArgument(argument)) {
-        problemReported = true;
-      }
+      _checkForArgumentTypeNotAssignableForArgument(argument);
     }
-    return problemReported;
   }
 
   /**
@@ -2094,20 +2077,19 @@
    * [errorCode] is the error code to be reported. The [arguments] are the
    * arguments to pass in when creating the error.
    */
-  bool _checkForAssignability(Expression expression, InterfaceType type,
+  void _checkForAssignability(Expression expression, InterfaceType type,
       ErrorCode errorCode, List<Object> arguments) {
     if (expression == null) {
-      return false;
+      return;
     }
     DartType expressionType = expression.staticType;
     if (expressionType == null) {
-      return false;
+      return;
     }
     if (_typeSystem.isAssignableTo(expressionType, type)) {
-      return false;
+      return;
     }
     _errorReporter.reportErrorForNode(errorCode, expression, arguments);
-    return true;
   }
 
   /**
@@ -2117,7 +2099,7 @@
    * [StaticWarningCode.ASSIGNMENT_TO_FINAL], and
    * [StaticWarningCode.ASSIGNMENT_TO_METHOD].
    */
-  bool _checkForAssignmentToFinal(Expression expression) {
+  void _checkForAssignmentToFinal(Expression expression) {
     // prepare element
     Element element = null;
     AstNode highlightedNode = expression;
@@ -2140,9 +2122,7 @@
       if (element.isConst) {
         _errorReporter.reportErrorForNode(
             StaticWarningCode.ASSIGNMENT_TO_CONST, expression);
-        return true;
-      }
-      if (element.isFinal) {
+      } else if (element.isFinal) {
         if (element is FieldElementImpl &&
             element.setter == null &&
             element.isSynthetic) {
@@ -2150,32 +2130,23 @@
               StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
               highlightedNode,
               [element.name, element.enclosingElement.displayName]);
-          return true;
+          return;
         }
         _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL,
             highlightedNode, [element.name]);
-        return true;
       }
-      return false;
-    }
-    if (element is FunctionElement) {
+    } else if (element is FunctionElement) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.ASSIGNMENT_TO_FUNCTION, expression);
-      return true;
-    }
-    if (element is MethodElement) {
+    } else if (element is MethodElement) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.ASSIGNMENT_TO_METHOD, expression);
-      return true;
-    }
-    if (element is ClassElement ||
+    } else if (element is ClassElement ||
         element is FunctionTypeAliasElement ||
         element is TypeParameterElement) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.ASSIGNMENT_TO_TYPE, expression);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -2186,15 +2157,13 @@
    * [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME], and
    * [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME].
    */
-  bool _checkForBuiltInIdentifierAsName(
+  void _checkForBuiltInIdentifierAsName(
       SimpleIdentifier identifier, ErrorCode errorCode) {
     Token token = identifier.token;
     if (token.type == TokenType.KEYWORD) {
       _errorReporter
           .reportErrorForNode(errorCode, identifier, [identifier.name]);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -2203,7 +2172,7 @@
    *
    * see [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED].
    */
-  bool _checkForCaseBlockNotTerminated(SwitchCase switchCase) {
+  void _checkForCaseBlockNotTerminated(SwitchCase switchCase) {
     NodeList<Statement> statements = switchCase.statements;
     if (statements.isEmpty) {
       // fall-through without statements at all
@@ -2213,7 +2182,7 @@
         NodeList<SwitchMember> members = switchStatement.members;
         int index = members.indexOf(switchCase);
         if (index != -1 && index < members.length - 1) {
-          return false;
+          return;
         }
       }
       // no other switch member after this one
@@ -2223,20 +2192,19 @@
       if (statement is BreakStatement ||
           statement is ContinueStatement ||
           statement is ReturnStatement) {
-        return false;
+        return;
       }
       // terminated with 'throw' expression
       if (statement is ExpressionStatement) {
         Expression expression = statement.expression;
         if (expression is ThrowExpression) {
-          return false;
+          return;
         }
       }
     }
-    // report error
+
     _errorReporter.reportErrorForToken(
         StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, switchCase.keyword);
-    return true;
   }
 
   /**
@@ -2245,17 +2213,15 @@
    *
    * See [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED].
    */
-  bool _checkForCaseBlocksNotTerminated(SwitchStatement statement) {
-    bool foundError = false;
+  void _checkForCaseBlocksNotTerminated(SwitchStatement statement) {
     NodeList<SwitchMember> members = statement.members;
     int lastMember = members.length - 1;
     for (int i = 0; i < lastMember; i++) {
       SwitchMember member = members[i];
-      if (member is SwitchCase && _checkForCaseBlockNotTerminated(member)) {
-        foundError = true;
+      if (member is SwitchCase) {
+        _checkForCaseBlockNotTerminated(member);
       }
     }
-    return foundError;
   }
 
   /**
@@ -2264,7 +2230,7 @@
    *
    * See [StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER].
    */
-  bool _checkForConcreteClassWithAbstractMember(MethodDeclaration method) {
+  void _checkForConcreteClassWithAbstractMember(MethodDeclaration method) {
     if (method.isAbstract &&
         _enclosingClass != null &&
         !_enclosingClass.isAbstract) {
@@ -2286,10 +2252,8 @@
             StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
             nameNode,
             [memberName, _enclosingClass.displayName]);
-        return true;
       }
     }
-    return false;
   }
 
   /**
@@ -2302,7 +2266,7 @@
    * [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD], and
    * [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD].
    */
-  bool _checkForConflictingConstructorNameAndMember(
+  void _checkForConflictingConstructorNameAndMember(
       ConstructorDeclaration constructor,
       ConstructorElement constructorElement) {
     SimpleIdentifier constructorName = constructor.name;
@@ -2324,33 +2288,27 @@
               constructor,
               [name]);
         }
-        return true;
+        return;
       }
     }
     // conflict with class member
     if (constructorName != null &&
         constructorElement != null &&
         !constructorName.isSynthetic) {
-      // fields
-      FieldElement field = classElement.getField(name);
-      if (field != null) {
+      if (classElement.getField(name) != null) {
+        // fields
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
             constructor,
             [name]);
-        return true;
-      }
-      // methods
-      MethodElement method = classElement.getMethod(name);
-      if (method != null) {
+      } else if (classElement.getMethod(name) != null) {
+        // methods
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
             constructor,
             [name]);
-        return true;
       }
     }
-    return false;
   }
 
   /**
@@ -2360,11 +2318,11 @@
    * See [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD], and
    * [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER].
    */
-  bool _checkForConflictingGetterAndMethod() {
+  void _checkForConflictingGetterAndMethod() {
     if (_enclosingClass == null) {
-      return false;
+      return;
     }
-    bool hasProblem = false;
+
     // method declared in the enclosing class vs. inherited getter
     for (MethodElement method in _enclosingClass.methods) {
       String name = method.name;
@@ -2374,8 +2332,7 @@
       if (inherited is! PropertyAccessorElement) {
         continue;
       }
-      // report problem
-      hasProblem = true;
+
       _errorReporter.reportErrorForElement(
           CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method, [
         _enclosingClass.displayName,
@@ -2395,8 +2352,7 @@
       if (inherited is! MethodElement) {
         continue;
       }
-      // report problem
-      hasProblem = true;
+
       _errorReporter.reportErrorForElement(
           CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor, [
         _enclosingClass.displayName,
@@ -2404,8 +2360,6 @@
         name
       ]);
     }
-    // done
-    return hasProblem;
   }
 
   /**
@@ -2416,13 +2370,12 @@
    * See [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER], and
    * [StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER].
    */
-  bool _checkForConflictingInstanceGetterAndSuperclassMember() {
+  void _checkForConflictingInstanceGetterAndSuperclassMember() {
     if (_enclosingClass == null) {
-      return false;
+      return;
     }
     InterfaceType enclosingType = _enclosingClass.type;
     // check every accessor
-    bool hasProblem = false;
     for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
       // we analyze instance accessors here
       if (accessor.isStatic) {
@@ -2459,8 +2412,7 @@
       ClassElement superElementClass =
           superElement.enclosingElement as ClassElement;
       InterfaceType superElementType = superElementClass.type;
-      // report problem
-      hasProblem = true;
+
       if (getter) {
         _errorReporter.reportErrorForElement(
             StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
@@ -2473,8 +2425,6 @@
             [superElementType.displayName]);
       }
     }
-    // done
-    return hasProblem;
   }
 
   /**
@@ -2486,17 +2436,16 @@
    *
    * See [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER].
    */
-  bool _checkForConflictingInstanceMethodSetter(ClassDeclaration declaration) {
+  void _checkForConflictingInstanceMethodSetter(ClassDeclaration declaration) {
     // Reference all of the class members in this class.
     NodeList<ClassMember> classMembers = declaration.members;
     if (classMembers.isEmpty) {
-      return false;
+      return;
     }
     // Create a HashMap to track conflicting members, and then loop through
     // members in the class to construct the HashMap, at the same time,
     // look for violations.  Don't add members if they are part of a conflict,
     // this prevents multiple warnings for one issue.
-    bool foundError = false;
     HashMap<String, ClassMember> memberHashMap =
         new HashMap<String, ClassMember>();
     for (ClassMember classMember in classMembers) {
@@ -2534,14 +2483,12 @@
             }
           }
           if (enclosingElementOfSetter != null) {
-            // report problem
             _errorReporter.reportErrorForNode(
                 StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER, name, [
               _enclosingClass.displayName,
               name.name,
               enclosingElementOfSetter.displayName
             ]);
-            foundError = true;
             addThisMemberToTheMap = false;
           }
         } else if (isSetter) {
@@ -2550,12 +2497,10 @@
           if (conflictingMethod != null &&
               conflictingMethod is MethodDeclaration &&
               !conflictingMethod.isGetter) {
-            // report problem
             _errorReporter.reportErrorForNode(
                 StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2,
                 name,
                 [_enclosingClass.displayName, name.name]);
-            foundError = true;
             addThisMemberToTheMap = false;
           }
         }
@@ -2569,7 +2514,6 @@
         }
       }
     }
-    return foundError;
   }
 
   /**
@@ -2578,41 +2522,40 @@
    *
    * See [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER].
    */
-  bool _checkForConflictingStaticGetterAndInstanceSetter(
+  void _checkForConflictingStaticGetterAndInstanceSetter(
       MethodDeclaration method) {
     if (!method.isStatic) {
-      return false;
+      return;
     }
     // prepare name
     SimpleIdentifier nameNode = method.name;
     if (nameNode == null) {
-      return false;
+      return;
     }
     String name = nameNode.name;
     // prepare enclosing type
     if (_enclosingClass == null) {
-      return false;
+      return;
     }
     InterfaceType enclosingType = _enclosingClass.type;
     // try to find setter
     ExecutableElement setter =
         enclosingType.lookUpSetter(name, _currentLibrary);
     if (setter == null) {
-      return false;
+      return;
     }
     // OK, also static
     if (setter.isStatic) {
-      return false;
+      return;
     }
     // prepare "setter" type to report its name
     ClassElement setterClass = setter.enclosingElement as ClassElement;
     InterfaceType setterType = setterClass.type;
-    // report problem
+
     _errorReporter.reportErrorForNode(
         StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
         nameNode,
         [setterType.displayName]);
-    return true;
   }
 
   /**
@@ -2621,20 +2564,20 @@
    *
    * See [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER].
    */
-  bool _checkForConflictingStaticSetterAndInstanceMember(
+  void _checkForConflictingStaticSetterAndInstanceMember(
       MethodDeclaration method) {
     if (!method.isStatic) {
-      return false;
+      return;
     }
     // prepare name
     SimpleIdentifier nameNode = method.name;
     if (nameNode == null) {
-      return false;
+      return;
     }
     String name = nameNode.name;
     // prepare enclosing type
     if (_enclosingClass == null) {
-      return false;
+      return;
     }
     InterfaceType enclosingType = _enclosingClass.type;
     // try to find member
@@ -2647,21 +2590,20 @@
       member = enclosingType.lookUpSetter(name, _currentLibrary);
     }
     if (member == null) {
-      return false;
+      return;
     }
     // OK, also static
     if (member.isStatic) {
-      return false;
+      return;
     }
     // prepare "member" type to report its name
     ClassElement memberClass = member.enclosingElement as ClassElement;
     InterfaceType memberType = memberClass.type;
-    // report problem
+
     _errorReporter.reportErrorForNode(
         StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
         nameNode,
         [memberType.displayName]);
-    return true;
   }
 
   /**
@@ -2671,9 +2613,8 @@
    * See [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS], and
    * [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER].
    */
-  bool _checkForConflictingTypeVariableErrorCodes(
+  void _checkForConflictingTypeVariableErrorCodes(
       ClassDeclaration declaration) {
-    bool problemReported = false;
     for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
       String name = typeParameter.name;
       // name is same as the name of the enclosing class
@@ -2682,7 +2623,6 @@
             CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
             typeParameter,
             [name]);
-        problemReported = true;
       }
       // check members
       if (_enclosingClass.getMethod(name) != null ||
@@ -2692,10 +2632,8 @@
             CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
             typeParameter,
             [name]);
-        problemReported = true;
       }
     }
-    return problemReported;
   }
 
   /**
@@ -2704,21 +2642,21 @@
    *
    * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER].
    */
-  bool _checkForConstConstructorWithNonConstSuper(
+  void _checkForConstConstructorWithNonConstSuper(
       ConstructorDeclaration constructor) {
     if (!_isEnclosingConstructorConst) {
-      return false;
+      return;
     }
     // OK, const factory, checked elsewhere
     if (constructor.factoryKeyword != null) {
-      return false;
+      return;
     }
     // check for mixins
     if (_enclosingClass.mixins.length != 0) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
           constructor.returnType);
-      return true;
+      return;
     }
     // try to find and check super constructor invocation
     for (ConstructorInitializer initializer in constructor.initializers) {
@@ -2726,37 +2664,34 @@
         SuperConstructorInvocation superInvocation = initializer;
         ConstructorElement element = superInvocation.staticElement;
         if (element == null || element.isConst) {
-          return false;
+          return;
         }
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
             superInvocation,
             [element.enclosingElement.displayName]);
-        return true;
+        return;
       }
     }
     // no explicit super constructor invocation, check default constructor
     InterfaceType supertype = _enclosingClass.supertype;
     if (supertype == null) {
-      return false;
+      return;
     }
     if (supertype.isObject) {
-      return false;
+      return;
     }
     ConstructorElement unnamedConstructor =
         supertype.element.unnamedConstructor;
-    if (unnamedConstructor == null) {
-      return false;
+    if (unnamedConstructor == null || unnamedConstructor.isConst) {
+      return;
     }
-    if (unnamedConstructor.isConst) {
-      return false;
-    }
+
     // default constructor is not 'const', report problem
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
         constructor.returnType,
         [supertype.displayName]);
-    return true;
   }
 
   /**
@@ -2766,22 +2701,21 @@
    *
    * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD].
    */
-  bool _checkForConstConstructorWithNonFinalField(
+  void _checkForConstConstructorWithNonFinalField(
       ConstructorDeclaration constructor,
       ConstructorElement constructorElement) {
     if (!_isEnclosingConstructorConst) {
-      return false;
+      return;
     }
     // check if there is non-final field
     ClassElement classElement = constructorElement.enclosingElement;
     if (!classElement.hasNonFinalField) {
-      return false;
+      return;
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
         constructor);
-    return true;
   }
 
   /**
@@ -2792,16 +2726,14 @@
    *
    * See [CompileTimeErrorCode.CONST_DEFERRED_CLASS].
    */
-  bool _checkForConstDeferredClass(InstanceCreationExpression expression,
+  void _checkForConstDeferredClass(InstanceCreationExpression expression,
       ConstructorName constructorName, TypeName typeName) {
     if (typeName.isDeferred) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_DEFERRED_CLASS,
           constructorName,
           [typeName.name.name]);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -2810,13 +2742,11 @@
    *
    * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION].
    */
-  bool _checkForConstEvalThrowsException(ThrowExpression expression) {
+  void _checkForConstEvalThrowsException(ThrowExpression expression) {
     if (_isEnclosingConstructorConst) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, expression);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -2824,13 +2754,11 @@
    *
    * See [CompileTimeErrorCode.CONST_FORMAL_PARAMETER].
    */
-  bool _checkForConstFormalParameter(NormalFormalParameter parameter) {
+  void _checkForConstFormalParameter(NormalFormalParameter parameter) {
     if (parameter.isConst) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_FORMAL_PARAMETER, parameter);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -2843,7 +2771,7 @@
    * See [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS], and
    * [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS].
    */
-  bool _checkForConstOrNewWithAbstractClass(
+  void _checkForConstOrNewWithAbstractClass(
       InstanceCreationExpression expression,
       TypeName typeName,
       InterfaceType type) {
@@ -2857,10 +2785,8 @@
           _errorReporter.reportErrorForNode(
               StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, typeName);
         }
-        return true;
       }
     }
-    return false;
   }
 
   /**
@@ -2872,14 +2798,12 @@
    *
    * See [CompileTimeErrorCode.INSTANTIATE_ENUM].
    */
-  bool _checkForConstOrNewWithEnum(InstanceCreationExpression expression,
+  void _checkForConstOrNewWithEnum(InstanceCreationExpression expression,
       TypeName typeName, InterfaceType type) {
     if (type.element.isEnum) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.INSTANTIATE_ENUM, typeName);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -2891,14 +2815,12 @@
    *
    * See [CompileTimeErrorCode.CONST_WITH_NON_CONST].
    */
-  bool _checkForConstWithNonConst(InstanceCreationExpression expression) {
+  void _checkForConstWithNonConst(InstanceCreationExpression expression) {
     ConstructorElement constructorElement = expression.staticElement;
     if (constructorElement != null && !constructorElement.isConst) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_WITH_NON_CONST, expression);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -2906,14 +2828,14 @@
    *
    * See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
    */
-  bool _checkForConstWithTypeParameters(TypeName typeName) {
+  void _checkForConstWithTypeParameters(TypeName typeName) {
     // something wrong with AST
     if (typeName == null) {
-      return false;
+      return;
     }
     Identifier name = typeName.name;
     if (name == null) {
-      return false;
+      return;
     }
     // should not be a type parameter
     if (name.staticElement is TypeParameterElement) {
@@ -2923,16 +2845,10 @@
     // check type arguments
     TypeArgumentList typeArguments = typeName.typeArguments;
     if (typeArguments != null) {
-      bool hasError = false;
       for (TypeName argument in typeArguments.arguments) {
-        if (_checkForConstWithTypeParameters(argument)) {
-          hasError = true;
-        }
+        _checkForConstWithTypeParameters(argument);
       }
-      return hasError;
     }
-    // OK
-    return false;
   }
 
   /**
@@ -2947,20 +2863,20 @@
    * See [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR], and
    * [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT].
    */
-  bool _checkForConstWithUndefinedConstructor(
+  void _checkForConstWithUndefinedConstructor(
       InstanceCreationExpression expression,
       ConstructorName constructorName,
       TypeName typeName) {
     // OK if resolved
     if (expression.staticElement != null) {
-      return false;
+      return;
     }
     DartType type = typeName.type;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element != null && element.isEnum) {
         // We have already reported the error.
-        return false;
+        return;
       }
     }
     Identifier className = typeName.name;
@@ -2977,7 +2893,6 @@
           constructorName,
           [className]);
     }
-    return true;
   }
 
   /**
@@ -2986,8 +2901,7 @@
    *
    * See [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS].
    */
-  bool _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias alias) {
-    bool result = false;
+  void _checkForDefaultValueInFunctionTypeAlias(FunctionTypeAlias alias) {
     FormalParameterList formalParameterList = alias.parameters;
     NodeList<FormalParameter> parameters = formalParameterList.parameters;
     for (FormalParameter formalParameter in parameters) {
@@ -2996,11 +2910,9 @@
         if (defaultFormalParameter.defaultValue != null) {
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS, alias);
-          result = true;
         }
       }
     }
-    return result;
   }
 
   /**
@@ -3009,21 +2921,20 @@
    *
    * See [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER].
    */
-  bool _checkForDefaultValueInFunctionTypedParameter(
+  void _checkForDefaultValueInFunctionTypedParameter(
       DefaultFormalParameter parameter) {
     // OK, not in a function typed parameter.
     if (!_isInFunctionTypedFormalParameter) {
-      return false;
+      return;
     }
     // OK, no default value.
     if (parameter.defaultValue == null) {
-      return false;
+      return;
     }
-    // Report problem.
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
         parameter);
-    return true;
   }
 
   /**
@@ -3032,8 +2943,7 @@
    *
    * See [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX].
    */
-  bool _checkForDeferredPrefixCollisions(CompilationUnit unit) {
-    bool foundError = false;
+  void _checkForDeferredPrefixCollisions(CompilationUnit unit) {
     NodeList<Directive> directives = unit.directives;
     int count = directives.length;
     if (count > 0) {
@@ -3060,12 +2970,9 @@
         }
       }
       for (List<ImportDirective> imports in prefixToDirectivesMap.values) {
-        if (_hasDeferredPrefixCollision(imports)) {
-          foundError = true;
-        }
+        _checkDeferredPrefixCollision(imports);
       }
     }
-    return foundError;
   }
 
   /**
@@ -3074,22 +2981,21 @@
    *
    * See [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE].
    */
-  bool _checkForDuplicateDefinitionInheritance() {
+  void _checkForDuplicateDefinitionInheritance() {
     if (_enclosingClass == null) {
-      return false;
+      return;
     }
-    bool hasProblem = false;
+
     for (ExecutableElement member in _enclosingClass.methods) {
-      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
-        hasProblem = true;
+      if (member.isStatic) {
+        _checkForDuplicateDefinitionOfMember(member);
       }
     }
     for (ExecutableElement member in _enclosingClass.accessors) {
-      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
-        hasProblem = true;
+      if (member.isStatic) {
+        _checkForDuplicateDefinitionOfMember(member);
       }
     }
-    return hasProblem;
   }
 
   /**
@@ -3098,21 +3004,21 @@
    *
    * See [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE].
    */
-  bool _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
+  void _checkForDuplicateDefinitionOfMember(ExecutableElement staticMember) {
     // prepare name
     String name = staticMember.name;
     if (name == null) {
-      return false;
+      return;
     }
     // try to find member
     ExecutableElement inheritedMember =
         _inheritanceManager.lookupInheritance(_enclosingClass, name);
     if (inheritedMember == null) {
-      return false;
+      return;
     }
     // OK, also static
     if (inheritedMember.isStatic) {
-      return false;
+      return;
     }
     // determine the display name, use the extended display name if the
     // enclosing class of the inherited member is in a different source
@@ -3123,12 +3029,11 @@
     } else {
       displayName = enclosingElement.getExtendedDisplayName(null);
     }
-    // report problem
+
     _errorReporter.reportErrorForElement(
         CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE,
         staticMember,
         [name, displayName]);
-    return true;
   }
 
   /**
@@ -3137,19 +3042,16 @@
    *
    * See [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS].
    */
-  bool _checkForExpectedOneListTypeArgument(
+  void _checkForExpectedOneListTypeArgument(
       ListLiteral literal, TypeArgumentList typeArguments) {
     // check number of type arguments
     int num = typeArguments.arguments.length;
-    if (num == 1) {
-      return false;
+    if (num != 1) {
+      _errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
+          typeArguments,
+          [num]);
     }
-    // report problem
-    _errorReporter.reportErrorForNode(
-        StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
-        typeArguments,
-        [num]);
-    return true;
   }
 
   /**
@@ -3161,10 +3063,10 @@
    *
    * See [CompileTimeErrorCode.EXPORT_DUPLICATED_LIBRARY_NAME].
    */
-  bool _checkForExportDuplicateLibraryName(ExportDirective directive,
+  void _checkForExportDuplicateLibraryName(ExportDirective directive,
       ExportElement exportElement, LibraryElement exportedLibrary) {
     if (exportedLibrary == null) {
-      return false;
+      return;
     }
     String name = exportedLibrary.name;
     // check if there is other exported library with the same name
@@ -3179,13 +3081,11 @@
             name
           ]);
         }
-        return true;
+        return;
       }
     } else {
       _nameToExportElement[name] = exportedLibrary;
     }
-    // OK
-    return false;
   }
 
   /**
@@ -3196,27 +3096,26 @@
    *
    * See [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY].
    */
-  bool _checkForExportInternalLibrary(
+  void _checkForExportInternalLibrary(
       ExportDirective directive, ExportElement exportElement) {
     if (_isInSystemLibrary) {
-      return false;
+      return;
     }
     // should be private
     DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
     String uri = exportElement.uri;
     SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
     if (sdkLibrary == null) {
-      return false;
+      return;
     }
     if (!sdkLibrary.isInternal) {
-      return false;
+      return;
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
         directive,
         [directive.uri]);
-    return true;
   }
 
   /**
@@ -3224,11 +3123,11 @@
    *
    * See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS].
    */
-  bool _checkForExtendsDeferredClass(ExtendsClause clause) {
+  void _checkForExtendsDeferredClass(ExtendsClause clause) {
     if (clause == null) {
-      return false;
+      return;
     }
-    return _checkForExtendsOrImplementsDeferredClass(
+    _checkForExtendsOrImplementsDeferredClass(
         clause.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
   }
 
@@ -3237,11 +3136,11 @@
    *
    * See [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS].
    */
-  bool _checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias alias) {
+  void _checkForExtendsDeferredClassInTypeAlias(ClassTypeAlias alias) {
     if (alias == null) {
-      return false;
+      return;
     }
-    return _checkForExtendsOrImplementsDeferredClass(
+    _checkForExtendsOrImplementsDeferredClass(
         alias.superclass, CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS);
   }
 
@@ -3360,11 +3259,11 @@
    * See [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE], and
    * [StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE].
    */
-  bool _checkForFieldInitializerNotAssignable(
+  void _checkForFieldInitializerNotAssignable(
       ConstructorFieldInitializer initializer, Element staticElement) {
     // prepare field element
     if (staticElement is! FieldElement) {
-      return false;
+      return;
     }
     FieldElement fieldElement = staticElement as FieldElement;
     // prepare field type
@@ -3372,15 +3271,15 @@
     // prepare expression type
     Expression expression = initializer.expression;
     if (expression == null) {
-      return false;
+      return;
     }
     // test the static type of the expression
     DartType staticType = getStaticType(expression);
     if (staticType == null) {
-      return false;
+      return;
     }
     if (_typeSystem.isAssignableTo(staticType, fieldType)) {
-      return false;
+      return;
     }
     // report problem
     if (_isEnclosingConstructorConst) {
@@ -3396,7 +3295,6 @@
         StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE,
         expression,
         [staticType, fieldType]);
-    return true;
     // TODO(brianwilkerson) Define a hint corresponding to these errors and
     // report it if appropriate.
 //        // test the propagated type of the expression
@@ -3427,7 +3325,7 @@
    *
    * See [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR].
    */
-  bool _checkForFieldInitializingFormalRedirectingConstructor(
+  void _checkForFieldInitializingFormalRedirectingConstructor(
       FieldFormalParameter parameter) {
     ConstructorDeclaration constructor =
         parameter.getAncestor((node) => node is ConstructorDeclaration);
@@ -3435,14 +3333,14 @@
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
           parameter);
-      return true;
+      return;
     }
     // constructor cannot be a factory
     if (constructor.factoryKeyword != null) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR,
           parameter);
-      return true;
+      return;
     }
     // constructor cannot have a redirection
     for (ConstructorInitializer initializer in constructor.initializers) {
@@ -3450,11 +3348,9 @@
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
             parameter);
-        return true;
+        return;
       }
     }
-    // OK
-    return false;
   }
 
   /**
@@ -3464,31 +3360,27 @@
    * See [CompileTimeErrorCode.CONST_NOT_INITIALIZED], and
    * [StaticWarningCode.FINAL_NOT_INITIALIZED].
    */
-  bool _checkForFinalNotInitialized(VariableDeclarationList list) {
-    if (_isInNativeClass) {
-      return false;
+  void _checkForFinalNotInitialized(VariableDeclarationList list) {
+    if (_isInNativeClass || list.isSynthetic) {
+      return;
     }
-    bool foundError = false;
-    if (!list.isSynthetic) {
-      NodeList<VariableDeclaration> variables = list.variables;
-      for (VariableDeclaration variable in variables) {
-        if (variable.initializer == null) {
-          if (list.isConst) {
-            _errorReporter.reportErrorForNode(
-                CompileTimeErrorCode.CONST_NOT_INITIALIZED,
-                variable.name,
-                [variable.name.name]);
-          } else if (list.isFinal) {
-            _errorReporter.reportErrorForNode(
-                StaticWarningCode.FINAL_NOT_INITIALIZED,
-                variable.name,
-                [variable.name.name]);
-          }
-          foundError = true;
+
+    NodeList<VariableDeclaration> variables = list.variables;
+    for (VariableDeclaration variable in variables) {
+      if (variable.initializer == null) {
+        if (list.isConst) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+              variable.name,
+              [variable.name.name]);
+        } else if (list.isFinal) {
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.FINAL_NOT_INITIALIZED,
+              variable.name,
+              [variable.name.name]);
         }
       }
     }
-    return foundError;
   }
 
   /**
@@ -3500,21 +3392,18 @@
    * See [CompileTimeErrorCode.CONST_NOT_INITIALIZED], and
    * [StaticWarningCode.FINAL_NOT_INITIALIZED].
    */
-  bool _checkForFinalNotInitializedInClass(ClassDeclaration declaration) {
+  void _checkForFinalNotInitializedInClass(ClassDeclaration declaration) {
     NodeList<ClassMember> classMembers = declaration.members;
     for (ClassMember classMember in classMembers) {
       if (classMember is ConstructorDeclaration) {
-        return false;
+        return;
       }
     }
-    bool foundError = false;
     for (ClassMember classMember in classMembers) {
-      if (classMember is FieldDeclaration &&
-          _checkForFinalNotInitialized(classMember.fields)) {
-        foundError = true;
+      if (classMember is FieldDeclaration) {
+        _checkForFinalNotInitialized(classMember.fields);
       }
     }
-    return foundError;
   }
 
   /**
@@ -3559,18 +3448,14 @@
    *
    * See [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS].
    */
-  bool _checkForImplementsDeferredClass(ImplementsClause clause) {
+  void _checkForImplementsDeferredClass(ImplementsClause clause) {
     if (clause == null) {
-      return false;
+      return;
     }
-    bool foundError = false;
     for (TypeName type in clause.interfaces) {
-      if (_checkForExtendsOrImplementsDeferredClass(
-          type, CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS)) {
-        foundError = true;
-      }
+      _checkForExtendsOrImplementsDeferredClass(
+          type, CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS);
     }
-    return foundError;
   }
 
   /**
@@ -3601,41 +3486,41 @@
    * [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC].
    * TODO(scheglov) rename thid method
    */
-  bool _checkForImplicitThisReferenceInInitializer(
+  void _checkForImplicitThisReferenceInInitializer(
       SimpleIdentifier identifier) {
     if (!_isInConstructorInitializer &&
         !_isInStaticMethod &&
         !_isInFactory &&
         !_isInInstanceVariableInitializer &&
         !_isInStaticVariableDeclaration) {
-      return false;
+      return;
     }
     // prepare element
     Element element = identifier.staticElement;
     if (!(element is MethodElement || element is PropertyAccessorElement)) {
-      return false;
+      return;
     }
     // static element
     ExecutableElement executableElement = element as ExecutableElement;
     if (executableElement.isStatic) {
-      return false;
+      return;
     }
     // not a class member
     Element enclosingElement = element.enclosingElement;
     if (enclosingElement is! ClassElement) {
-      return false;
+      return;
     }
     // comment
     AstNode parent = identifier.parent;
     if (parent is CommentReference) {
-      return false;
+      return;
     }
     // qualified method invocation
     if (parent is MethodInvocation) {
       MethodInvocation invocation = parent;
       if (identical(invocation.methodName, identifier) &&
           invocation.realTarget != null) {
-        return false;
+        return;
       }
     }
     // qualified property access
@@ -3643,16 +3528,16 @@
       PropertyAccess access = parent;
       if (identical(access.propertyName, identifier) &&
           access.realTarget != null) {
-        return false;
+        return;
       }
     }
     if (parent is PrefixedIdentifier) {
       PrefixedIdentifier prefixed = parent;
       if (identical(prefixed.identifier, identifier)) {
-        return false;
+        return;
       }
     }
-    // report problem
+
     if (_isInStaticMethod) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, identifier);
@@ -3664,7 +3549,6 @@
           CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER,
           identifier);
     }
-    return true;
   }
 
   /**
@@ -3675,33 +3559,28 @@
    *
    * See [CompileTimeErrorCode.IMPORT_DUPLICATED_LIBRARY_NAME].
    */
-  bool _checkForImportDuplicateLibraryName(
+  void _checkForImportDuplicateLibraryName(
       ImportDirective directive, ImportElement importElement) {
     // prepare imported library
     LibraryElement nodeLibrary = importElement.importedLibrary;
     if (nodeLibrary == null) {
-      return false;
+      return;
     }
     String name = nodeLibrary.name;
     // check if there is another imported library with the same name
     LibraryElement prevLibrary = _nameToImportElement[name];
     if (prevLibrary != null) {
-      if (prevLibrary != nodeLibrary) {
-        if (!name.isEmpty) {
-          _errorReporter.reportErrorForNode(
-              StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED, directive, [
-            prevLibrary.definingCompilationUnit.displayName,
-            nodeLibrary.definingCompilationUnit.displayName,
-            name
-          ]);
-        }
-        return true;
+      if (prevLibrary != nodeLibrary && !name.isEmpty) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED, directive, [
+          prevLibrary.definingCompilationUnit.displayName,
+          nodeLibrary.definingCompilationUnit.displayName,
+          name
+        ]);
       }
     } else {
       _nameToImportElement[name] = nodeLibrary;
     }
-    // OK
-    return false;
   }
 
   /**
@@ -3712,27 +3591,23 @@
    *
    * See [CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY].
    */
-  bool _checkForImportInternalLibrary(
+  void _checkForImportInternalLibrary(
       ImportDirective directive, ImportElement importElement) {
     if (_isInSystemLibrary) {
-      return false;
+      return;
     }
     // should be private
     DartSdk sdk = _currentLibrary.context.sourceFactory.dartSdk;
     String uri = importElement.uri;
     SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
-    if (sdkLibrary == null) {
-      return false;
+    if (sdkLibrary == null || !sdkLibrary.isInternal) {
+      return;
     }
-    if (!sdkLibrary.isInternal) {
-      return false;
-    }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
         directive,
         [directive.uri]);
-    return true;
   }
 
   /**
@@ -3741,7 +3616,7 @@
    *
    * See [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE].
    */
-  bool _checkForInconsistentMethodInheritance() {
+  void _checkForInconsistentMethodInheritance() {
     // Ensure that the inheritance manager has a chance to generate all errors
     // we may care about, note that we ensure that the interfaces data since
     // there are no errors.
@@ -3749,12 +3624,68 @@
     HashSet<AnalysisError> errors =
         _inheritanceManager.getErrors(_enclosingClass);
     if (errors == null || errors.isEmpty) {
-      return false;
+      return;
     }
     for (AnalysisError error in errors) {
       _errorReporter.reportError(error);
     }
-    return true;
+    return;
+  }
+
+  /**
+   * Check for a type mis-match between the iterable expression and the
+   * assigned variable in a for-in statement.
+   */
+  void _checkForInIterable(ForEachStatement node) {
+    // Ignore malformed for statements.
+    if (node.identifier == null && node.loopVariable == null) {
+      return;
+    }
+
+    DartType iterableType = getStaticType(node.iterable);
+    if (iterableType.isDynamic) {
+      return;
+    }
+
+    // The type of the loop variable.
+    SimpleIdentifier variable = node.identifier != null
+        ? node.identifier
+        : node.loopVariable.identifier;
+    DartType variableType = getStaticType(variable);
+
+    DartType loopType = node.awaitKeyword != null
+        ? _typeProvider.streamType
+        : _typeProvider.iterableType;
+
+    // Use an explicit string instead of [loopType] to remove the "<E>".
+    String loopTypeName = node.awaitKeyword != null ? "Stream" : "Iterable";
+
+    // The object being iterated has to implement Iterable<T> for some T that
+    // is assignable to the variable's type.
+    // TODO(rnystrom): Move this into mostSpecificTypeArgument()?
+    iterableType = iterableType.resolveToBound(_typeProvider.objectType);
+    DartType bestIterableType =
+        _typeSystem.mostSpecificTypeArgument(iterableType, loopType);
+
+    // Allow it to be a supertype of Iterable<T> (basically just Object) and do
+    // an implicit downcast to Iterable<dynamic>.
+    if (bestIterableType == null) {
+      if (_typeSystem.isSubtypeOf(loopType, iterableType)) {
+        bestIterableType = DynamicTypeImpl.instance;
+      }
+    }
+
+    if (bestIterableType == null) {
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
+          node.iterable,
+          [iterableType, loopTypeName]);
+    } else if (!_typeSystem.isAssignableTo(bestIterableType, variableType)) {
+      _errorReporter.reportTypeErrorForNode(
+          StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
+          node.iterable,
+          [iterableType, loopTypeName, variableType]);
+    }
   }
 
   /**
@@ -3763,36 +3694,35 @@
    *
    * See [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
    */
-  bool _checkForInstanceAccessToStaticMember(
+  void _checkForInstanceAccessToStaticMember(
       ClassElement typeReference, SimpleIdentifier name) {
     // OK, in comment
     if (_isInComment) {
-      return false;
+      return;
     }
     // OK, target is a type
     if (typeReference != null) {
-      return false;
+      return;
     }
     // prepare member Element
     Element element = name.staticElement;
     if (element is! ExecutableElement) {
-      return false;
+      return;
     }
     ExecutableElement executableElement = element as ExecutableElement;
     // OK, top-level element
     if (executableElement.enclosingElement is! ClassElement) {
-      return false;
+      return;
     }
     // OK, instance member
     if (!executableElement.isStatic) {
-      return false;
+      return;
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
         name,
         [name.name]);
-    return true;
   }
 
   /**
@@ -3877,15 +3807,15 @@
    *
    * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
    */
-  bool _checkForIntNotAssignable(Expression argument) {
+  void _checkForIntNotAssignable(Expression argument) {
     if (argument == null) {
-      return false;
+      return;
     }
     ParameterElement staticParameterElement = argument.staticParameterElement;
     DartType staticParameterType =
         staticParameterElement == null ? null : staticParameterElement.type;
-    return _checkForArgumentTypeNotAssignable(argument, staticParameterType,
-        _intType, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+    _checkForArgumentTypeNotAssignable(argument, staticParameterType, _intType,
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
   }
 
   /**
@@ -3893,17 +3823,13 @@
    *
    * See [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
    */
-  bool _checkForInvalidAnnotationFromDeferredLibrary(Annotation annotation) {
+  void _checkForInvalidAnnotationFromDeferredLibrary(Annotation annotation) {
     Identifier nameIdentifier = annotation.name;
-    if (nameIdentifier is PrefixedIdentifier) {
-      if (nameIdentifier.isDeferred) {
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
-            annotation.name);
-        return true;
-      }
+    if (nameIdentifier is PrefixedIdentifier && nameIdentifier.isDeferred) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
+          annotation.name);
     }
-    return false;
   }
 
   /**
@@ -3912,9 +3838,9 @@
    *
    * See [StaticTypeWarningCode.INVALID_ASSIGNMENT].
    */
-  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
+  void _checkForInvalidAssignment(Expression lhs, Expression rhs) {
     if (lhs == null || rhs == null) {
-      return false;
+      return;
     }
     VariableElement leftVariableElement = getVariableElement(lhs);
     DartType leftType = (leftVariableElement == null)
@@ -3926,9 +3852,7 @@
           StaticTypeWarningCode.INVALID_ASSIGNMENT,
           rhs,
           [staticRightType, leftType]);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -3938,10 +3862,10 @@
    *
    * See [StaticTypeWarningCode.INVALID_ASSIGNMENT].
    */
-  bool _checkForInvalidCompoundAssignment(
+  void _checkForInvalidCompoundAssignment(
       AssignmentExpression assignment, Expression lhs, Expression rhs) {
     if (lhs == null) {
-      return false;
+      return;
     }
     VariableElement leftVariableElement = getVariableElement(lhs);
     DartType leftType = (leftVariableElement == null)
@@ -3949,18 +3873,16 @@
         : leftVariableElement.type;
     MethodElement invokedMethod = assignment.staticElement;
     if (invokedMethod == null) {
-      return false;
+      return;
     }
     DartType rightType = invokedMethod.type.returnType;
     if (leftType == null || rightType == null) {
-      return false;
+      return;
     }
     if (!_typeSystem.isAssignableTo(rightType, leftType)) {
       _errorReporter.reportTypeErrorForNode(
           StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -3997,14 +3919,12 @@
    * Check to see whether the given function [body] has a modifier associated
    * with it, and report it as an error if it does.
    */
-  bool _checkForInvalidModifierOnBody(
+  void _checkForInvalidModifierOnBody(
       FunctionBody body, CompileTimeErrorCode errorCode) {
     Token keyword = body.keyword;
     if (keyword != null) {
       _errorReporter.reportErrorForToken(errorCode, keyword, [keyword.lexeme]);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -4012,13 +3932,11 @@
    *
    * See [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS].
    */
-  bool _checkForInvalidReferenceToThis(ThisExpression expression) {
+  void _checkForInvalidReferenceToThis(ThisExpression expression) {
     if (!_isThisInValidContext(expression)) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, expression);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -4027,16 +3945,13 @@
    * [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or
    * [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP].
    */
-  bool _checkForInvalidTypeArgumentInConstTypedLiteral(
+  void _checkForInvalidTypeArgumentInConstTypedLiteral(
       NodeList<TypeName> arguments, ErrorCode errorCode) {
-    bool foundError = false;
     for (TypeName typeName in arguments) {
       if (typeName.type is TypeParameterType) {
         _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
-        foundError = true;
       }
     }
-    return foundError;
   }
 
   /**
@@ -4090,8 +4005,7 @@
     DartType mapType = literal.staticType;
     assert(mapType is InterfaceTypeImpl);
 
-    List<DartType> typeArguments =
-        (mapType as InterfaceTypeImpl).typeArguments;
+    List<DartType> typeArguments = (mapType as InterfaceTypeImpl).typeArguments;
     assert(typeArguments.length == 2);
     DartType keyType = typeArguments[0];
     DartType valueType = typeArguments[1];
@@ -4105,9 +4019,7 @@
         // list element, not the static type.  See dartbug.com/21119.
         _checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType,
             CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE);
-        _checkForArgumentTypeNotAssignableWithExpectedTypes(
-            value,
-            valueType,
+        _checkForArgumentTypeNotAssignableWithExpectedTypes(value, valueType,
             CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
       }
       _checkForArgumentTypeNotAssignableWithExpectedTypes(
@@ -4123,26 +4035,23 @@
    *
    * See [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME].
    */
-  bool _checkForMemberWithClassName() {
+  void _checkForMemberWithClassName() {
     if (_enclosingClass == null) {
-      return false;
+      return;
     }
     String className = _enclosingClass.name;
     if (className == null) {
-      return false;
+      return;
     }
-    bool problemReported = false;
+
     // check accessors
     for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
       if (className == accessor.name) {
         _errorReporter.reportErrorForElement(
             CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor);
-        problemReported = true;
       }
     }
     // don't check methods, they would be constructors
-    // done
-    return problemReported;
   }
 
   /**
@@ -4152,12 +4061,12 @@
    * See [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES], and
    * [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE].
    */
-  bool _checkForMismatchedAccessorTypes(
+  void _checkForMismatchedAccessorTypes(
       Declaration accessorDeclaration, String accessorTextName) {
     ExecutableElement accessorElement =
         accessorDeclaration.element as ExecutableElement;
     if (accessorElement is! PropertyAccessorElement) {
-      return false;
+      return;
     }
     PropertyAccessorElement propertyAccessorElement =
         accessorElement as PropertyAccessorElement;
@@ -4172,7 +4081,7 @@
       if (counterpartAccessor != null &&
           identical(counterpartAccessor.enclosingElement,
               propertyAccessorElement.enclosingElement)) {
-        return false;
+        return;
       }
     }
     if (counterpartAccessor == null) {
@@ -4199,7 +4108,7 @@
         }
       }
       if (counterpartAccessor == null) {
-        return false;
+        return;
       }
     }
     // Default of null == no accessor or no type (dynamic)
@@ -4223,7 +4132,6 @@
             StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
             accessorDeclaration,
             [accessorTextName, setterType, getterType]);
-        return true;
       } else {
         _errorReporter.reportTypeErrorForNode(
             StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,
@@ -4235,7 +4143,6 @@
         ]);
       }
     }
-    return false;
   }
 
   /**
@@ -4243,23 +4150,23 @@
    * an enum type either have a default case or include all of the enum
    * constants.
    */
-  bool _checkForMissingEnumConstantInSwitch(SwitchStatement statement) {
+  void _checkForMissingEnumConstantInSwitch(SwitchStatement statement) {
     // TODO(brianwilkerson) This needs to be checked after constant values have
     // been computed.
     Expression expression = statement.expression;
     DartType expressionType = getStaticType(expression);
     if (expressionType == null) {
-      return false;
+      return;
     }
     Element expressionElement = expressionType.element;
     if (expressionElement is! ClassElement) {
-      return false;
+      return;
     }
     ClassElement classElement = expressionElement as ClassElement;
     if (!classElement.isEnum) {
-      return false;
+      return;
     }
-    List<String> constantNames = new List<String>();
+    List<String> constantNames = <String>[];
     List<FieldElement> fields = classElement.fields;
     int fieldCount = fields.length;
     for (int i = 0; i < fieldCount; i++) {
@@ -4273,18 +4180,17 @@
     for (int i = 0; i < memberCount; i++) {
       SwitchMember member = members[i];
       if (member is SwitchDefault) {
-        return false;
+        return;
       }
       String constantName = _getConstantName((member as SwitchCase).expression);
       if (constantName != null) {
         constantNames.remove(constantName);
       }
     }
-    int nameCount = constantNames.length;
-    if (nameCount == 0) {
-      return false;
+    if (constantNames.isEmpty) {
+      return;
     }
-    for (int i = 0; i < nameCount; i++) {
+    for (int i = 0; i < constantNames.length; i++) {
       int offset = statement.offset;
       int end = statement.rightParenthesis.end;
       _errorReporter.reportErrorForOffset(
@@ -4293,7 +4199,6 @@
           end - offset,
           [constantNames[i]]);
     }
-    return true;
   }
 
   /**
@@ -4302,24 +4207,20 @@
    *
    * See [StaticWarningCode.MIXED_RETURN_TYPES].
    */
-  bool _checkForMixedReturns(BlockFunctionBody body) {
+  void _checkForMixedReturns(BlockFunctionBody body) {
     if (_hasReturnWithoutValue) {
-      return false;
+      return;
     }
-    int withCount = _returnsWith.length;
-    int withoutCount = _returnsWithout.length;
-    if (withCount > 0 && withoutCount > 0) {
-      for (int i = 0; i < withCount; i++) {
-        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES,
-            _returnsWith[i].returnKeyword);
+    if (_returnsWith.isNotEmpty && _returnsWithout.isNotEmpty) {
+      for (ReturnStatement returnWith in _returnsWith) {
+        _errorReporter.reportErrorForToken(
+            StaticWarningCode.MIXED_RETURN_TYPES, returnWith.returnKeyword);
       }
-      for (int i = 0; i < withoutCount; i++) {
-        _errorReporter.reportErrorForToken(StaticWarningCode.MIXED_RETURN_TYPES,
-            _returnsWithout[i].returnKeyword);
+      for (ReturnStatement returnWithout in _returnsWithout) {
+        _errorReporter.reportErrorForToken(
+            StaticWarningCode.MIXED_RETURN_TYPES, returnWithout.returnKeyword);
       }
-      return true;
     }
-    return false;
   }
 
   /**
@@ -4348,7 +4249,7 @@
    * appropriate.
    */
   void _checkForMixinHasNoConstructors(AstNode node) {
-    if ((_enclosingClass as ClassElementImpl).doesMixinLackConstructors) {
+    if (_enclosingClass.doesMixinLackConstructors) {
       ErrorCode errorCode = CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS;
       _errorReporter
           .reportErrorForNode(errorCode, node, [_enclosingClass.supertype]);
@@ -4401,18 +4302,17 @@
    *
    * See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS].
    */
-  bool _checkForMultipleSuperInitializers(ConstructorDeclaration constructor) {
-    int numSuperInitializers = 0;
+  void _checkForMultipleSuperInitializers(ConstructorDeclaration constructor) {
+    bool hasSuperInitializer = false;
     for (ConstructorInitializer initializer in constructor.initializers) {
       if (initializer is SuperConstructorInvocation) {
-        numSuperInitializers++;
-        if (numSuperInitializers > 1) {
+        if (hasSuperInitializer) {
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS, initializer);
         }
+        hasSuperInitializer = true;
       }
     }
-    return numSuperInitializers > 0;
   }
 
   void _checkForMustCallSuper(MethodDeclaration node) {
@@ -4432,13 +4332,11 @@
    *
    * See [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE].
    */
-  bool _checkForNativeFunctionBodyInNonSDKCode(NativeFunctionBody body) {
+  void _checkForNativeFunctionBodyInNonSdkCode(NativeFunctionBody body) {
     if (!_isInSystemLibrary && !_hasExtUri) {
       _errorReporter.reportErrorForNode(
           ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE, body);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -4451,20 +4349,20 @@
    *
    * See [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR].
    */
-  bool _checkForNewWithUndefinedConstructor(
+  void _checkForNewWithUndefinedConstructor(
       InstanceCreationExpression expression,
       ConstructorName constructorName,
       TypeName typeName) {
     // OK if resolved
     if (expression.staticElement != null) {
-      return false;
+      return;
     }
     DartType type = typeName.type;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element != null && element.isEnum) {
         // We have already reported the error.
-        return false;
+        return;
       }
     }
     // prepare class name
@@ -4482,7 +4380,6 @@
           constructorName,
           [className]);
     }
-    return true;
   }
 
   /**
@@ -4492,22 +4389,21 @@
    *
    * See [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT].
    */
-  bool _checkForNoDefaultSuperConstructorImplicit(
+  void _checkForNoDefaultSuperConstructorImplicit(
       ClassDeclaration declaration) {
     // do nothing if mixin errors have already been reported for this class.
-    ClassElementImpl enclosingClass = _enclosingClass;
-    if (enclosingClass.doesMixinLackConstructors) {
-      return false;
+    if (_enclosingClass.doesMixinLackConstructors) {
+      return;
     }
     // do nothing if there is explicit constructor
     List<ConstructorElement> constructors = _enclosingClass.constructors;
     if (!constructors[0].isSynthetic) {
-      return false;
+      return;
     }
     // prepare super
     InterfaceType superType = _enclosingClass.supertype;
     if (superType == null) {
-      return false;
+      return;
     }
     ClassElement superElement = superType.element;
     // try to find default generative super constructor
@@ -4519,20 +4415,19 @@
             CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
             declaration.name,
             [superUnnamedConstructor]);
-        return true;
+        return;
       }
       if (superUnnamedConstructor.isDefaultConstructor &&
           _enclosingClass
               .isSuperConstructorAccessible(superUnnamedConstructor)) {
-        return true;
+        return;
       }
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
         declaration.name,
         [superType.displayName]);
-    return true;
   }
 
   /**
@@ -4547,12 +4442,12 @@
    * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR], and
    * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS].
    */
-  bool _checkForNonAbstractClassInheritsAbstractMember(
+  void _checkForNonAbstractClassInheritsAbstractMember(
       SimpleIdentifier classNameNode) {
     if (_enclosingClass.isAbstract) {
-      return false;
+      return;
     } else if (_hasNoSuchMethod(_enclosingClass)) {
-      return false;
+      return;
     }
     //
     // Store in local sets the set of all method and accessor names
@@ -4633,7 +4528,7 @@
     // class.
     int missingOverridesSize = missingOverrides.length;
     if (missingOverridesSize == 0) {
-      return false;
+      return;
     }
     List<ExecutableElement> missingOverridesArray =
         new List.from(missingOverrides);
@@ -4707,7 +4602,6 @@
     analysisError.setProperty(
         ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
     _errorReporter.reportError(analysisError);
-    return true;
   }
 
   /**
@@ -4716,15 +4610,13 @@
    *
    * See [StaticTypeWarningCode.NON_BOOL_CONDITION].
    */
-  bool _checkForNonBoolCondition(Expression condition) {
+  void _checkForNonBoolCondition(Expression condition) {
     DartType conditionType = getStaticType(condition);
     if (conditionType != null &&
         !_typeSystem.isAssignableTo(conditionType, _boolType)) {
       _errorReporter.reportErrorForNode(
           StaticTypeWarningCode.NON_BOOL_CONDITION, condition);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -4733,14 +4625,13 @@
    *
    * See [StaticTypeWarningCode.NON_BOOL_EXPRESSION].
    */
-  bool _checkForNonBoolExpression(AssertStatement statement) {
+  void _checkForNonBoolExpression(AssertStatement statement) {
     Expression expression = statement.condition;
     DartType type = getStaticType(expression);
     if (type is InterfaceType) {
       if (!_typeSystem.isAssignableTo(type, _boolType)) {
         _errorReporter.reportErrorForNode(
             StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
-        return true;
       }
     } else if (type is FunctionType) {
       FunctionType functionType = type;
@@ -4748,10 +4639,8 @@
           !_typeSystem.isAssignableTo(functionType.returnType, _boolType)) {
         _errorReporter.reportErrorForNode(
             StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
-        return true;
       }
     }
-    return false;
   }
 
   /**
@@ -4759,15 +4648,13 @@
    *
    * See [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION].
    */
-  bool _checkForNonBoolNegationExpression(Expression expression) {
+  void _checkForNonBoolNegationExpression(Expression expression) {
     DartType conditionType = getStaticType(expression);
     if (conditionType != null &&
         !_typeSystem.isAssignableTo(conditionType, _boolType)) {
       _errorReporter.reportErrorForNode(
           StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -4778,29 +4665,28 @@
    *
    * See [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT].
    */
-  bool _checkForNonConstMapAsExpressionStatement(MapLiteral literal) {
+  void _checkForNonConstMapAsExpressionStatement(MapLiteral literal) {
     // "const"
     if (literal.constKeyword != null) {
-      return false;
+      return;
     }
     // has type arguments
     if (literal.typeArguments != null) {
-      return false;
+      return;
     }
     // prepare statement
     Statement statement =
         literal.getAncestor((node) => node is ExpressionStatement);
     if (statement == null) {
-      return false;
+      return;
     }
     // OK, statement does not start with map
     if (!identical(statement.beginToken, literal.beginToken)) {
-      return false;
+      return;
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, literal);
-    return true;
   }
 
   /**
@@ -4809,11 +4695,11 @@
    *
    * See [StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR].
    */
-  bool _checkForNonVoidReturnTypeForOperator(MethodDeclaration declaration) {
+  void _checkForNonVoidReturnTypeForOperator(MethodDeclaration declaration) {
     // check that []= operator
     SimpleIdentifier name = declaration.name;
     if (name.name != "[]=") {
-      return false;
+      return;
     }
     // check return type
     TypeName typeName = declaration.returnType;
@@ -4824,8 +4710,6 @@
             StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, typeName);
       }
     }
-    // no warning
-    return false;
   }
 
   /**
@@ -4834,7 +4718,7 @@
    *
    * See [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER].
    */
-  bool _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
+  void _checkForNonVoidReturnTypeForSetter(TypeName typeName) {
     if (typeName != null) {
       DartType type = typeName.type;
       if (type != null && !type.isVoid) {
@@ -4842,7 +4726,6 @@
             StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, typeName);
       }
     }
-    return false;
   }
 
   /**
@@ -4852,22 +4735,20 @@
    *
    * See [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR].
    */
-  bool _checkForOptionalParameterInOperator(MethodDeclaration declaration) {
+  void _checkForOptionalParameterInOperator(MethodDeclaration declaration) {
     FormalParameterList parameterList = declaration.parameters;
     if (parameterList == null) {
-      return false;
+      return;
     }
-    bool foundError = false;
+
     NodeList<FormalParameter> formalParameters = parameterList.parameters;
     for (FormalParameter formalParameter in formalParameters) {
       if (formalParameter.kind.isOptional) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR,
             formalParameter);
-        foundError = true;
       }
     }
-    return foundError;
   }
 
   /**
@@ -4875,20 +4756,19 @@
    *
    * See [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER].
    */
-  bool _checkForPrivateOptionalParameter(FormalParameter parameter) {
+  void _checkForPrivateOptionalParameter(FormalParameter parameter) {
     // should be named parameter
     if (parameter.kind != ParameterKind.NAMED) {
-      return false;
+      return;
     }
     // name should start with '_'
     SimpleIdentifier name = parameter.identifier;
     if (name.isSynthetic || !StringUtilities.startsWithChar(name.name, 0x5F)) {
-      return false;
+      return;
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER, parameter);
-    return true;
   }
 
   /**
@@ -4898,28 +4778,23 @@
    *
    * See [CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT].
    */
-  bool _checkForRecursiveConstructorRedirect(ConstructorDeclaration declaration,
+  void _checkForRecursiveConstructorRedirect(ConstructorDeclaration declaration,
       ConstructorElement constructorElement) {
     // we check generative constructor here
     if (declaration.factoryKeyword != null) {
-      return false;
+      return;
     }
-    // try to find redirecting constructor invocation and analyzer it for
+    // try to find redirecting constructor invocation and analyze it for
     // recursion
     for (ConstructorInitializer initializer in declaration.initializers) {
       if (initializer is RedirectingConstructorInvocation) {
-        // OK if no cycle
-        if (!_hasRedirectingFactoryConstructorCycle(constructorElement)) {
-          return false;
+        if (_hasRedirectingFactoryConstructorCycle(constructorElement)) {
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer);
         }
-        // report error
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT, initializer);
-        return true;
+        return;
       }
     }
-    // OK, no redirecting constructor invocation
-    return false;
   }
 
   /**
@@ -4955,12 +4830,12 @@
    * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS], and
    * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS].
    */
-  bool _checkForRecursiveInterfaceInheritance(ClassElement element) {
+  void _checkForRecursiveInterfaceInheritance(ClassElement element) {
     if (element == null) {
-      return false;
+      return;
     }
-    return _safeCheckForRecursiveInterfaceInheritance(
-        element, new List<ClassElement>());
+
+    _safeCheckForRecursiveInterfaceInheritance(element, <ClassElement>[]);
   }
 
   /**
@@ -4974,12 +4849,9 @@
    * [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR], and
    * [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR].
    */
-  bool _checkForRedirectingConstructorErrorCodes(
+  void _checkForRedirectingConstructorErrorCodes(
       ConstructorDeclaration declaration) {
-    bool errorReported = false;
-    //
     // Check for default values in the parameters
-    //
     ConstructorName redirectedConstructor = declaration.redirectedConstructor;
     if (redirectedConstructor != null) {
       for (FormalParameter parameter in declaration.parameters.parameters) {
@@ -4989,7 +4861,6 @@
               CompileTimeErrorCode
                   .DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
               parameter.identifier);
-          errorReported = true;
         }
       }
     }
@@ -5001,7 +4872,6 @@
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS,
               initializer);
-          errorReported = true;
         }
         if (declaration.factoryKeyword == null) {
           RedirectingConstructorInvocation invocation = initializer;
@@ -5035,18 +4905,14 @@
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
               initializer);
-          errorReported = true;
         }
         if (initializer is ConstructorFieldInitializer) {
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
               initializer);
-          errorReported = true;
         }
       }
     }
-    // done
-    return errorReported;
   }
 
   /**
@@ -5056,36 +4922,35 @@
    *
    * See [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR].
    */
-  bool _checkForRedirectToNonConstConstructor(
+  void _checkForRedirectToNonConstConstructor(
       ConstructorDeclaration declaration, ConstructorElement element) {
     // prepare redirected constructor
     ConstructorName redirectedConstructorNode =
         declaration.redirectedConstructor;
     if (redirectedConstructorNode == null) {
-      return false;
+      return;
     }
     // prepare element
     if (element == null) {
-      return false;
+      return;
     }
     // OK, it is not 'const'
     if (!element.isConst) {
-      return false;
+      return;
     }
     // prepare redirected constructor
     ConstructorElement redirectedConstructor = element.redirectedConstructor;
     if (redirectedConstructor == null) {
-      return false;
+      return;
     }
     // OK, it is also 'const'
     if (redirectedConstructor.isConst) {
-      return false;
+      return;
     }
-    // report error
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR,
         redirectedConstructorNode);
-    return true;
   }
 
   /**
@@ -5093,13 +4958,11 @@
    *
    * See [CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH].
    */
-  bool _checkForRethrowOutsideCatch(RethrowExpression expression) {
+  void _checkForRethrowOutsideCatch(RethrowExpression expression) {
     if (!_isInCatchClause) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH, expression);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -5108,21 +4971,20 @@
    *
    * See [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR].
    */
-  bool _checkForReturnInGenerativeConstructor(
+  void _checkForReturnInGenerativeConstructor(
       ConstructorDeclaration declaration) {
     // ignore factory
     if (declaration.factoryKeyword != null) {
-      return false;
+      return;
     }
     // block body (with possible return statement) is checked elsewhere
     FunctionBody body = declaration.body;
     if (body is! ExpressionFunctionBody) {
-      return false;
+      return;
     }
-    // report error
+
     _errorReporter.reportErrorForNode(
         CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR, body);
-    return true;
   }
 
   /**
@@ -5134,23 +4996,23 @@
    *
    * See [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
    */
-  bool _checkForReturnOfInvalidType(
+  void _checkForReturnOfInvalidType(
       Expression returnExpression, DartType expectedReturnType) {
     if (_enclosingFunction == null) {
-      return false;
+      return;
     }
     if (_inGenerator) {
       // "return expression;" is disallowed in generators, but this is checked
       // elsewhere.  Bare "return" is always allowed in generators regardless
       // of the return type.  So no need to do any further checking.
-      return false;
+      return;
     }
     DartType staticReturnType = _computeReturnTypeForMethod(returnExpression);
     if (expectedReturnType.isVoid) {
       if (staticReturnType.isVoid ||
           staticReturnType.isDynamic ||
           staticReturnType.isBottom) {
-        return false;
+        return;
       }
       _errorReporter.reportTypeErrorForNode(
           StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
@@ -5158,16 +5020,16 @@
         expectedReturnType,
         _enclosingFunction.displayName
       ]);
-      return true;
+      return;
     }
     if (_typeSystem.isAssignableTo(staticReturnType, expectedReturnType)) {
-      return false;
+      return;
     }
     _errorReporter.reportTypeErrorForNode(
         StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
         returnExpression,
         [staticReturnType, expectedReturnType, _enclosingFunction.displayName]);
-    return true;
+
     // TODO(brianwilkerson) Define a hint corresponding to the warning and
     // report it if appropriate.
 //        Type propagatedReturnType = returnExpression.getPropagatedType();
@@ -5190,30 +5052,29 @@
    *
    * See [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER].
    */
-  bool _checkForStaticAccessToInstanceMember(
+  void _checkForStaticAccessToInstanceMember(
       ClassElement typeReference, SimpleIdentifier name) {
     // OK, in comment
     if (_isInComment) {
-      return false;
+      return;
     }
     // OK, target is not a type
     if (typeReference == null) {
-      return false;
+      return;
     }
     // prepare member Element
     Element element = name.staticElement;
     if (element is! ExecutableElement) {
-      return false;
+      return;
     }
     ExecutableElement memberElement = element as ExecutableElement;
     // OK, static
     if (memberElement.isStatic) {
-      return false;
+      return;
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, name, [name.name]);
-    return true;
   }
 
   /**
@@ -5222,35 +5083,30 @@
    *
    * See [StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE].
    */
-  bool _checkForSwitchExpressionNotAssignable(SwitchStatement statement) {
+  void _checkForSwitchExpressionNotAssignable(SwitchStatement statement) {
     // prepare 'switch' expression type
     Expression expression = statement.expression;
     DartType expressionType = getStaticType(expression);
     if (expressionType == null) {
-      return false;
+      return;
     }
-    // compare with type of the first 'case'
-    NodeList<SwitchMember> members = statement.members;
-    for (SwitchMember switchMember in members) {
-      if (switchMember is! SwitchCase) {
-        continue;
-      }
-      SwitchCase switchCase = switchMember as SwitchCase;
-      // prepare 'case' type
-      Expression caseExpression = switchCase.expression;
-      DartType caseType = getStaticType(caseExpression);
-      // check types
-      if (_typeSystem.isAssignableTo(expressionType, caseType)) {
-        return false;
-      }
-      // report problem
+
+    // compare with type of the first non-default 'case'
+    SwitchCase switchCase = statement.members
+        .firstWhere((member) => member is SwitchCase, orElse: () => null);
+    if (switchCase == null) {
+      return;
+    }
+
+    Expression caseExpression = switchCase.expression;
+    DartType caseType = getStaticType(caseExpression);
+    // check types
+    if (!_typeSystem.isAssignableTo(expressionType, caseType)) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
           expression,
           [expressionType, caseType]);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -5259,15 +5115,12 @@
    *
    * See [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF].
    */
-  bool _checkForTypeAliasCannotReferenceItself_function(
+  void _checkForTypeAliasCannotReferenceItself_function(
       FunctionTypeAlias alias) {
-    FunctionTypeAliasElement element = alias.element;
-    if (!_hasTypedefSelfReference(element)) {
-      return false;
+    if (_hasTypedefSelfReference(alias.element)) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, alias);
     }
-    _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, alias);
-    return true;
   }
 
   /**
@@ -5275,12 +5128,11 @@
    *
    * See [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS].
    */
-  bool _checkForTypeAnnotationDeferredClass(TypeName name) {
+  void _checkForTypeAnnotationDeferredClass(TypeName name) {
     if (name != null && name.isDeferred) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS, name, [name.name]);
     }
-    return false;
   }
 
   /**
@@ -5289,19 +5141,19 @@
    *
    * See [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
    */
-  bool _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
+  void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
     if (typeName.typeArguments == null) {
-      return false;
+      return;
     }
     // prepare Type
     DartType type = typeName.type;
     if (type == null) {
-      return false;
+      return;
     }
     // prepare ClassElement
     Element element = type.element;
     if (element is! ClassElement) {
-      return false;
+      return;
     }
     ClassElement classElement = element as ClassElement;
     // prepare type parameters
@@ -5312,7 +5164,7 @@
     List<DartType> typeArguments = (type as InterfaceType).typeArguments;
     int loopThroughIndex =
         math.min(typeNameArgList.length, boundingElts.length);
-    bool foundError = false;
+
     for (int i = 0; i < loopThroughIndex; i++) {
       TypeName argTypeName = typeNameArgList[i];
       DartType argType = argTypeName.type;
@@ -5331,11 +5183,9 @@
           }
           _errorReporter.reportTypeErrorForNode(
               errorCode, argTypeName, [argType, boundType]);
-          foundError = true;
         }
       }
     }
-    return foundError;
   }
 
   /**
@@ -5344,21 +5194,18 @@
    *
    * See [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC].
    */
-  bool _checkForTypeParameterReferencedByStatic(TypeName name) {
+  void _checkForTypeParameterReferencedByStatic(TypeName name) {
     if (_isInStaticMethod || _isInStaticVariableDeclaration) {
       DartType type = name.type;
-      if (type is TypeParameterType) {
-        // The class's type parameters are not in scope for static methods.
-        // However all other type parameters are legal (e.g. the static method's
-        // type parameters, or a local function's type parameters).
-        if (type.element.enclosingElement is ClassElement) {
-          _errorReporter.reportErrorForNode(
-              StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, name);
-          return true;
-        }
+      // The class's type parameters are not in scope for static methods.
+      // However all other type parameters are legal (e.g. the static method's
+      // type parameters, or a local function's type parameters).
+      if (type is TypeParameterType &&
+          type.element.enclosingElement is ClassElement) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, name);
       }
     }
-    return false;
   }
 
   /**
@@ -5366,23 +5213,22 @@
    *
    * See [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
    */
-  bool _checkForTypeParameterSupertypeOfItsBound(TypeParameter parameter) {
+  void _checkForTypeParameterSupertypeOfItsBound(TypeParameter parameter) {
     TypeParameterElement element = parameter.element;
     // prepare bound
     DartType bound = element.bound;
     if (bound == null) {
-      return false;
+      return;
     }
     // OK, type parameter is not supertype of its bound
     if (!bound.isMoreSpecificThan(element.type)) {
-      return false;
+      return;
     }
-    // report problem
+
     _errorReporter.reportErrorForNode(
         StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
         parameter,
         [element.displayName]);
-    return true;
   }
 
   /**
@@ -5394,40 +5240,36 @@
    * [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR], and
    * [StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT].
    */
-  bool _checkForUndefinedConstructorInInitializerImplicit(
+  void _checkForUndefinedConstructorInInitializerImplicit(
       ConstructorDeclaration constructor) {
     if (_enclosingClass == null) {
-      return false;
+      return;
     }
     // do nothing if mixin errors have already been reported for this class.
-    ClassElementImpl enclosingClass = _enclosingClass;
-    if (enclosingClass.doesMixinLackConstructors) {
-      return false;
+    if (_enclosingClass.doesMixinLackConstructors) {
+      return;
     }
-    //
+
     // Ignore if the constructor is not generative.
-    //
     if (constructor.factoryKeyword != null) {
-      return false;
+      return;
     }
-    //
+
     // Ignore if the constructor has either an implicit super constructor
     // invocation or a redirecting constructor invocation.
-    //
     for (ConstructorInitializer constructorInitializer
         in constructor.initializers) {
       if (constructorInitializer is SuperConstructorInvocation ||
           constructorInitializer is RedirectingConstructorInvocation) {
-        return false;
+        return;
       }
     }
-    //
+
     // Check to see whether the superclass has a non-factory unnamed
     // constructor.
-    //
     InterfaceType superType = _enclosingClass.supertype;
     if (superType == null) {
-      return false;
+      return;
     }
     ClassElement superElement = superType.element;
     ConstructorElement superUnnamedConstructor =
@@ -5438,32 +5280,25 @@
             CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
             constructor.returnType,
             [superUnnamedConstructor]);
-        return true;
-      }
-      if (!superUnnamedConstructor.isDefaultConstructor ||
+      } else if (!superUnnamedConstructor.isDefaultConstructor ||
           !_enclosingClass
               .isSuperConstructorAccessible(superUnnamedConstructor)) {
-        int offset;
-        int length;
-        {
-          Identifier returnType = constructor.returnType;
-          SimpleIdentifier name = constructor.name;
-          offset = returnType.offset;
-          length = (name != null ? name.end : returnType.end) - offset;
-        }
+        Identifier returnType = constructor.returnType;
+        SimpleIdentifier name = constructor.name;
+        int offset = returnType.offset;
+        int length = (name != null ? name.end : returnType.end) - offset;
         _errorReporter.reportErrorForOffset(
             CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
             offset,
             length,
             [superType.displayName]);
       }
-      return false;
+    } else {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+          constructor.returnType,
+          [superElement.name]);
     }
-    _errorReporter.reportErrorForNode(
-        CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
-        constructor.returnType,
-        [superElement.name]);
-    return true;
   }
 
   /**
@@ -5472,28 +5307,27 @@
    *
    * See [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
    */
-  bool _checkForUnqualifiedReferenceToNonLocalStaticMember(
+  void _checkForUnqualifiedReferenceToNonLocalStaticMember(
       SimpleIdentifier name) {
     Element element = name.staticElement;
     if (element == null || element is TypeParameterElement) {
-      return false;
+      return;
     }
     Element enclosingElement = element.enclosingElement;
+    if (identical(enclosingElement, _enclosingClass)) {
+      return;
+    }
     if (enclosingElement is! ClassElement) {
-      return false;
+      return;
     }
     if ((element is MethodElement && !element.isStatic) ||
         (element is PropertyAccessorElement && !element.isStatic)) {
-      return false;
-    }
-    if (identical(enclosingElement, _enclosingClass)) {
-      return false;
+      return;
     }
     _errorReporter.reportErrorForNode(
         StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
         name,
         [name.name]);
-    return true;
   }
 
   void _checkForValidField(FieldFormalParameter parameter) {
@@ -5555,14 +5389,13 @@
    *
    * See [StaticWarningCode.VOID_RETURN_FOR_GETTER].
    */
-  bool _checkForVoidReturnType(MethodDeclaration getter) {
+  void _checkForVoidReturnType(MethodDeclaration getter) {
     TypeName returnType = getter.returnType;
     if (returnType == null || returnType.name.name != "void") {
-      return false;
+      return;
     }
     _errorReporter.reportErrorForNode(
         StaticWarningCode.VOID_RETURN_FOR_GETTER, returnType);
-    return true;
   }
 
   /**
@@ -5574,18 +5407,18 @@
    *
    * See [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR].
    */
-  bool _checkForWrongNumberOfParametersForOperator(
+  void _checkForWrongNumberOfParametersForOperator(
       MethodDeclaration declaration) {
     // prepare number of parameters
     FormalParameterList parameterList = declaration.parameters;
     if (parameterList == null) {
-      return false;
+      return;
     }
     int numParameters = parameterList.parameters.length;
     // prepare operator name
     SimpleIdentifier nameNode = declaration.name;
     if (nameNode == null) {
-      return false;
+      return;
     }
     String name = nameNode.name;
     // check for exact number of parameters
@@ -5617,18 +5450,12 @@
           CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
           nameNode,
           [name, expected, numParameters]);
-      return true;
-    }
-    // check for operator "-"
-    if ("-" == name && numParameters > 1) {
+    } else if ("-" == name && numParameters > 1) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
           nameNode,
           [numParameters]);
-      return true;
     }
-    // OK
-    return false;
   }
 
   /**
@@ -5641,78 +5468,18 @@
    *
    * See [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER].
    */
-  bool _checkForWrongNumberOfParametersForSetter(
+  void _checkForWrongNumberOfParametersForSetter(
       SimpleIdentifier setterName, FormalParameterList parameterList) {
-    if (setterName == null) {
-      return false;
+    if (setterName == null || parameterList == null) {
+      return;
     }
-    if (parameterList == null) {
-      return false;
-    }
+
     NodeList<FormalParameter> parameters = parameterList.parameters;
     if (parameters.length != 1 ||
         parameters[0].kind != ParameterKind.REQUIRED) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
           setterName);
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Check for a type mis-match between the iterable expression and the
-   * assigned variable in a for-in statement.
-   */
-  void _checkForInIterable(ForEachStatement node) {
-    // Ignore malformed for statements.
-    if (node.identifier == null && node.loopVariable == null) {
-      return;
-    }
-
-    DartType iterableType = getStaticType(node.iterable);
-    if (iterableType.isDynamic) {
-      return;
-    }
-
-    // The type of the loop variable.
-    SimpleIdentifier variable = node.identifier != null
-        ? node.identifier
-        : node.loopVariable.identifier;
-    DartType variableType = getStaticType(variable);
-
-    DartType loopType = node.awaitKeyword != null
-        ? _typeProvider.streamType
-        : _typeProvider.iterableType;
-
-    // Use an explicit string instead of [loopType] to remove the "<E>".
-    String loopTypeName = node.awaitKeyword != null ? "Stream" : "Iterable";
-
-    // The object being iterated has to implement Iterable<T> for some T that
-    // is assignable to the variable's type.
-    // TODO(rnystrom): Move this into mostSpecificTypeArgument()?
-    iterableType = iterableType.resolveToBound(_typeProvider.objectType);
-    DartType bestIterableType =
-        _typeSystem.mostSpecificTypeArgument(iterableType, loopType);
-
-    // Allow it to be a supertype of Iterable<T> (basically just Object) and do
-    // an implicit downcast to Iterable<dynamic>.
-    if (bestIterableType == null) {
-      if (_typeSystem.isSubtypeOf(loopType, iterableType)) {
-        bestIterableType = DynamicTypeImpl.instance;
-      }
-    }
-
-    if (bestIterableType == null) {
-      _errorReporter.reportTypeErrorForNode(
-          StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
-          node.iterable,
-          [iterableType, loopTypeName]);
-    } else if (!_typeSystem.isAssignableTo(bestIterableType, variableType)) {
-      _errorReporter.reportTypeErrorForNode(
-          StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
-          node.iterable,
-          [iterableType, loopTypeName, variableType]);
     }
   }
 
@@ -5773,22 +5540,22 @@
    *
    * See [StaticWarningCode.FUNCTION_WITHOUT_CALL].
    */
-  bool _checkImplementsFunctionWithoutCall(ClassDeclaration declaration) {
+  void _checkImplementsFunctionWithoutCall(ClassDeclaration declaration) {
     if (declaration.isAbstract) {
-      return false;
+      return;
     }
     ClassElement classElement = declaration.element;
     if (classElement == null) {
-      return false;
+      return;
     }
     if (!_typeSystem.isSubtypeOf(
         classElement.type, _typeProvider.functionType)) {
-      return false;
+      return;
     }
     // If there is a noSuchMethod method, then don't report the warning,
     // see dartbug.com/16078
     if (_hasNoSuchMethod(classElement)) {
-      return false;
+      return;
     }
     ExecutableElement callMethod = _inheritanceManager.lookupMember(
         classElement, FunctionElement.CALL_METHOD_NAME);
@@ -5797,9 +5564,7 @@
         (callMethod as MethodElement).isAbstract) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.FUNCTION_WITHOUT_CALL, declaration.name);
-      return true;
     }
-    return false;
   }
 
   /**
@@ -5808,30 +5573,26 @@
    *
    * See [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS].
    */
-  bool _checkImplementsSuperClass(ClassDeclaration declaration) {
+  void _checkImplementsSuperClass(ClassDeclaration declaration) {
     // prepare super type
     InterfaceType superType = _enclosingClass.supertype;
     if (superType == null) {
-      return false;
+      return;
     }
     // prepare interfaces
     ImplementsClause implementsClause = declaration.implementsClause;
     if (implementsClause == null) {
-      return false;
+      return;
     }
     // check interfaces
-    bool hasProblem = false;
     for (TypeName interfaceNode in implementsClause.interfaces) {
       if (interfaceNode.type == superType) {
-        hasProblem = true;
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS,
             interfaceNode,
             [superType.displayName]);
       }
     }
-    // done
-    return hasProblem;
   }
 
   DartType _computeReturnTypeForMethod(Expression returnExpression) {
@@ -5947,28 +5708,6 @@
   }
 
   /**
-   * Given a list of [directives] that have the same prefix, generate an error
-   * if there is more than one import and any of those imports is deferred.
-   *
-   * See [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX].
-   */
-  bool _hasDeferredPrefixCollision(List<ImportDirective> directives) {
-    bool foundError = false;
-    int count = directives.length;
-    if (count > 1) {
-      for (int i = 0; i < count; i++) {
-        Token deferredToken = directives[i].deferredKeyword;
-        if (deferredToken != null) {
-          _errorReporter.reportErrorForToken(
-              CompileTimeErrorCode.SHARED_DEFERRED_PREFIX, deferredToken);
-          foundError = true;
-        }
-      }
-    }
-    return foundError;
-  }
-
-  /**
    * Return `true` if the given [classElement] has a noSuchMethod() method
    * distinct from the one declared in class Object, as per the Dart Language
    * Specification (section 10.4).
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index d537f0c..7e5bee8 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -678,9 +678,9 @@
     if (identical(_oldNode, node.exceptionType)) {
       return _parser.parseTypeName();
     } else if (identical(_oldNode, node.exceptionParameter)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.stackTraceParameter)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.body)) {
       return _parser.parseBlock();
     }
@@ -722,7 +722,7 @@
     } else if (node.metadata.contains(_oldNode)) {
       return _parser.parseAnnotation();
     } else if (identical(_oldNode, node.name)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.typeParameters)) {
       return _parser.parseTypeParameterList();
     } else if (identical(_oldNode, node.superclass)) {
@@ -885,7 +885,7 @@
     } else if (node.metadata.contains(_oldNode)) {
       return _parser.parseAnnotation();
     } else if (identical(_oldNode, node.name)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     }
     return _notAChild(node);
   }
@@ -897,7 +897,7 @@
     } else if (node.metadata.contains(_oldNode)) {
       return _parser.parseAnnotation();
     } else if (identical(_oldNode, node.name)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (node.constants.contains(_oldNode)) {
       throw new InsufficientContextException();
     }
@@ -977,7 +977,7 @@
       throw new InsufficientContextException();
       //return parser.parseDeclaredIdentifier();
     } else if (identical(_oldNode, node.identifier)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.body)) {
       return _parser.parseStatement2();
     }
@@ -1015,7 +1015,7 @@
     } else if (identical(_oldNode, node.returnType)) {
       return _parser.parseReturnType();
     } else if (identical(_oldNode, node.name)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.functionExpression)) {
       throw new InsufficientContextException();
     }
@@ -1059,7 +1059,7 @@
     } else if (identical(_oldNode, node.returnType)) {
       return _parser.parseReturnType();
     } else if (identical(_oldNode, node.name)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.typeParameters)) {
       return _parser.parseTypeParameterList();
     } else if (identical(_oldNode, node.parameters)) {
@@ -1077,7 +1077,7 @@
     } else if (identical(_oldNode, node.returnType)) {
       return _parser.parseReturnType();
     } else if (identical(_oldNode, node.identifier)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.parameters)) {
       return _parser.parseFormalParameterList();
     }
@@ -1121,7 +1121,7 @@
     } else if (identical(_oldNode, node.uri)) {
       return _parser.parseStringLiteral();
     } else if (identical(_oldNode, node.prefix)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (node.combinators.contains(_oldNode)) {
       return _parser.parseCombinator();
     }
@@ -1181,7 +1181,8 @@
   @override
   AstNode visitLabel(Label node) {
     if (identical(_oldNode, node.label)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(
+          isDeclaration: node.parent is LabeledStatement);
     }
     return _notAChild(node);
   }
@@ -1189,7 +1190,7 @@
   @override
   AstNode visitLabeledStatement(LabeledStatement node) {
     if (node.labels.contains(_oldNode)) {
-      return _parser.parseLabel();
+      return _parser.parseLabel(isDeclaration: true);
     } else if (identical(_oldNode, node.statement)) {
       return _parser.parseStatement2();
     }
@@ -1260,7 +1261,7 @@
       if (node.operatorKeyword != null) {
         throw new InsufficientContextException();
       }
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.body)) {
       //return parser.parseFunctionBody();
       throw new InsufficientContextException();
@@ -1555,7 +1556,7 @@
     } else if (node.metadata.contains(_oldNode)) {
       return _parser.parseAnnotation();
     } else if (identical(_oldNode, node.name)) {
-      return _parser.parseSimpleIdentifier();
+      return _parser.parseSimpleIdentifier(isDeclaration: true);
     } else if (identical(_oldNode, node.bound)) {
       return _parser.parseTypeName();
     }
@@ -2539,10 +2540,10 @@
             null,
             null,
             null,
-            _createSyntheticIdentifier(),
+            _createSyntheticIdentifier(isDeclaration: true),
             null,
             new FormalParameterList(
-                null, new List<FormalParameter>(), null, null, null),
+                null, <FormalParameter>[], null, null, null),
             new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON)));
       }
       return null;
@@ -2556,11 +2557,11 @@
           modifiers.factoryKeyword,
           parseSimpleIdentifier(),
           getAndAdvance(),
-          parseSimpleIdentifier(),
+          parseSimpleIdentifier(isDeclaration: true),
           parseFormalParameterList());
     } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       TypeName returnType = _parseOptionalTypeNameComment();
-      SimpleIdentifier methodName = parseSimpleIdentifier();
+      SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
       TypeParameterList typeParameters = _parseGenericCommentTypeParameters();
       FormalParameterList parameters = parseFormalParameterList();
       if (_matches(TokenType.COLON) ||
@@ -2571,7 +2572,7 @@
             modifiers.externalKeyword,
             _validateModifiersForConstructor(modifiers),
             modifiers.factoryKeyword,
-            methodName,
+            new SimpleIdentifier(methodName.token, isDeclaration: false),
             null,
             null,
             parameters);
@@ -2663,7 +2664,7 @@
         _unlockErrorListener();
       }
     } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
-      SimpleIdentifier methodName = parseSimpleIdentifier();
+      SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
       TypeParameterList typeParameters = _parseGenericCommentTypeParameters();
       FormalParameterList parameters = parseFormalParameterList();
       if (methodName.name == className) {
@@ -2673,7 +2674,7 @@
             modifiers.externalKeyword,
             _validateModifiersForConstructor(modifiers),
             modifiers.factoryKeyword,
-            methodName,
+            new SimpleIdentifier(methodName.token, isDeclaration: true),
             null,
             null,
             parameters);
@@ -3229,8 +3230,9 @@
    *     label ::=
    *         identifier ':'
    */
-  Label parseLabel() {
-    SimpleIdentifier label = parseSimpleIdentifier();
+  Label parseLabel({bool isDeclaration: false}) {
+    SimpleIdentifier label =
+        parseSimpleIdentifier(isDeclaration: isDeclaration);
     Token colon = _expect(TokenType.COLON);
     return new Label(label, colon);
   }
@@ -3322,7 +3324,7 @@
             commentAndMetadata.comment,
             commentAndMetadata.metadata,
             holder.type,
-            identifier,
+            new SimpleIdentifier(identifier.token, isDeclaration: true),
             typeParameters,
             parameters);
       } else {
@@ -3367,8 +3369,12 @@
           null,
           null);
     }
-    return new SimpleFormalParameter(commentAndMetadata.comment,
-        commentAndMetadata.metadata, holder.keyword, holder.type, identifier);
+    return new SimpleFormalParameter(
+        commentAndMetadata.comment,
+        commentAndMetadata.metadata,
+        holder.keyword,
+        holder.type,
+        new SimpleIdentifier(identifier.token, isDeclaration: true));
   }
 
   /**
@@ -3409,7 +3415,7 @@
    *     identifier ::=
    *         IDENTIFIER
    */
-  SimpleIdentifier parseSimpleIdentifier() {
+  SimpleIdentifier parseSimpleIdentifier({bool isDeclaration: false}) {
     if (_matchesIdentifier()) {
       String lexeme = _currentToken.lexeme;
       if ((_inAsync || _inGenerator) &&
@@ -3417,10 +3423,11 @@
         _reportErrorForCurrentToken(
             ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER);
       }
-      return new SimpleIdentifier(getAndAdvance());
+      return new SimpleIdentifier(getAndAdvance(),
+          isDeclaration: isDeclaration);
     }
     _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
-    return _createSyntheticIdentifier();
+    return _createSyntheticIdentifier(isDeclaration: isDeclaration);
   }
 
   /**
@@ -3442,7 +3449,7 @@
   Statement parseStatement2() {
     List<Label> labels = new List<Label>();
     while (_matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
-      labels.add(parseLabel());
+      labels.add(parseLabel(isDeclaration: true));
     }
     Statement statement = _parseNonLabeledStatement();
     if (labels.isEmpty) {
@@ -3535,7 +3542,7 @@
    */
   TypeParameter parseTypeParameter() {
     CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     if (_matchesKeyword(Keyword.EXTENDS)) {
       Token keyword = getAndAdvance();
       TypeName bound = parseTypeName();
@@ -3705,7 +3712,7 @@
   /**
    * Return a synthetic identifier.
    */
-  SimpleIdentifier _createSyntheticIdentifier() {
+  SimpleIdentifier _createSyntheticIdentifier({bool isDeclaration: false}) {
     Token syntheticToken;
     if (_currentToken.type == TokenType.KEYWORD) {
       // Consider current keyword token as an identifier.
@@ -3718,7 +3725,7 @@
     } else {
       syntheticToken = _createSyntheticToken(TokenType.IDENTIFIER);
     }
-    return new SimpleIdentifier(syntheticToken);
+    return new SimpleIdentifier(syntheticToken, isDeclaration: isDeclaration);
   }
 
   /**
@@ -4746,7 +4753,7 @@
             commentAndMetadata, abstractKeyword, keyword);
       }
     }
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     String className = name.name;
     TypeParameterList typeParameters = null;
     if (_matches(TokenType.LT)) {
@@ -4899,7 +4906,7 @@
    */
   ClassTypeAlias _parseClassTypeAlias(CommentAndMetadata commentAndMetadata,
       Token abstractKeyword, Token classKeyword) {
-    SimpleIdentifier className = parseSimpleIdentifier();
+    SimpleIdentifier className = parseSimpleIdentifier(isDeclaration: true);
     TypeParameterList typeParameters = null;
     if (_matches(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
@@ -5708,7 +5715,7 @@
     CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
     SimpleIdentifier name;
     if (_matchesIdentifier()) {
-      name = parseSimpleIdentifier();
+      name = parseSimpleIdentifier(isDeclaration: true);
     } else {
       name = _createSyntheticIdentifier();
     }
@@ -5729,7 +5736,7 @@
    */
   EnumDeclaration _parseEnumDeclaration(CommentAndMetadata commentAndMetadata) {
     Token keyword = _expectKeyword(Keyword.ENUM);
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     Token leftBracket = null;
     List<EnumConstantDeclaration> constants =
         new List<EnumConstantDeclaration>();
@@ -5992,8 +5999,13 @@
             Token keyword = variableList.keyword;
             TypeName type = variableList.type;
             if (keyword != null || type != null) {
-              loopVariable = new DeclaredIdentifier(commentAndMetadata.comment,
-                  commentAndMetadata.metadata, keyword, type, variable.name);
+              loopVariable = new DeclaredIdentifier(
+                  commentAndMetadata.comment,
+                  commentAndMetadata.metadata,
+                  keyword,
+                  type,
+                  new SimpleIdentifier(variable.name.token,
+                      isDeclaration: true));
             } else {
               if (!commentAndMetadata.metadata.isEmpty) {
                 // TODO(jwren) metadata isn't allowed before the identifier in
@@ -6204,7 +6216,7 @@
         !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       keyword = getAndAdvance();
     }
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     TypeParameterList typeParameters = _parseGenericMethodTypeParameters();
     FormalParameterList parameters = null;
     if (!isGetter) {
@@ -6304,7 +6316,7 @@
     if (hasReturnTypeInTypeAlias) {
       returnType = parseReturnType();
     }
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     TypeParameterList typeParameters = null;
     if (_matches(TokenType.LT)) {
       typeParameters = parseTypeParameterList();
@@ -6406,7 +6418,7 @@
   MethodDeclaration _parseGetter(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, Token staticKeyword, TypeName returnType) {
     Token propertyKeyword = _expectKeyword(Keyword.GET);
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     if (_matches(TokenType.OPEN_PAREN) &&
         _tokenMatches(_peek(), TokenType.CLOSE_PAREN)) {
       _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS);
@@ -6492,7 +6504,7 @@
     }
     if (_matchesKeyword(Keyword.AS)) {
       asToken = getAndAdvance();
-      prefix = parseSimpleIdentifier();
+      prefix = parseSimpleIdentifier(isDeclaration: true);
     } else if (deferredToken != null) {
       _reportErrorForCurrentToken(
           ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT);
@@ -6508,7 +6520,7 @@
         _advance();
         if (_matchesKeyword(Keyword.AS)) {
           asToken = getAndAdvance();
-          prefix = parseSimpleIdentifier();
+          prefix = parseSimpleIdentifier(isDeclaration: true);
         }
       }
     }
@@ -6816,7 +6828,7 @@
       Token externalKeyword,
       Token staticKeyword,
       TypeName returnType) {
-    SimpleIdentifier methodName = parseSimpleIdentifier();
+    SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
     TypeParameterList typeParameters = _parseGenericMethodTypeParameters();
     FormalParameterList parameters;
     if (!_matches(TokenType.OPEN_PAREN) &&
@@ -7179,7 +7191,8 @@
       _reportErrorForCurrentToken(
           ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [_currentToken.lexeme]);
     }
-    SimpleIdentifier name = new SimpleIdentifier(getAndAdvance());
+    SimpleIdentifier name =
+        new SimpleIdentifier(getAndAdvance(), isDeclaration: true);
     if (_matches(TokenType.EQ)) {
       Token previous = _currentToken.previous;
       if ((_tokenMatches(previous, TokenType.EQ_EQ) ||
@@ -7564,7 +7577,7 @@
   MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, Token staticKeyword, TypeName returnType) {
     Token propertyKeyword = _expectKeyword(Keyword.SET);
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     FormalParameterList parameters = parseFormalParameterList();
     _validateFormalParameterList(parameters);
     FunctionBody body = _parseFunctionBody(
@@ -7730,7 +7743,8 @@
         List<Label> labels = new List<Label>();
         while (
             _matchesIdentifier() && _tokenMatches(_peek(), TokenType.COLON)) {
-          SimpleIdentifier identifier = parseSimpleIdentifier();
+          SimpleIdentifier identifier =
+              parseSimpleIdentifier(isDeclaration: true);
           String label = identifier.token.lexeme;
           if (definedLabels.contains(label)) {
             _reportErrorForToken(
@@ -7886,10 +7900,10 @@
       if (_matchesKeyword(Keyword.CATCH)) {
         catchKeyword = getAndAdvance();
         leftParenthesis = _expect(TokenType.OPEN_PAREN);
-        exceptionParameter = parseSimpleIdentifier();
+        exceptionParameter = parseSimpleIdentifier(isDeclaration: true);
         if (_matches(TokenType.COMMA)) {
           comma = getAndAdvance();
-          stackTraceParameter = parseSimpleIdentifier();
+          stackTraceParameter = parseSimpleIdentifier(isDeclaration: true);
         }
         rightParenthesis = _expect(TokenType.CLOSE_PAREN);
       }
@@ -8122,7 +8136,7 @@
     // of a construct like "class C { int @deprecated foo() {} }" (i.e. the
     // user is in the middle of inserting "int bar;" prior to
     // "@deprecated foo() {}").
-    SimpleIdentifier name = parseSimpleIdentifier();
+    SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
     Token equals = null;
     Expression initializer = null;
     if (_matches(TokenType.EQ)) {
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 5a2e2c0..3b21b2f 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -7,5 +7,5 @@
 
 export 'package:analyzer/dart/ast/token.dart';
 export 'package:analyzer/src/dart/ast/token.dart' hide SimpleToken;
-export 'package:analyzer/src/dart/scanner/scanner.dart';
 export 'package:analyzer/src/dart/scanner/reader.dart';
+export 'package:analyzer/src/dart/scanner/scanner.dart';
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 0670b7c..27577b8 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -14,9 +14,10 @@
     show ContentCache, Source, UriKind;
 
 /**
- * A function used to create a new DartSdk
+ * A function used to create a new DartSdk with the given [options]. If the
+ * passed [options] are `null`, then default options are used.
  */
-typedef DartSdk SdkCreator();
+typedef DartSdk SdkCreator(AnalysisOptions options);
 
 /**
  * A Dart SDK installed in a specified location.
@@ -126,9 +127,8 @@
     int encoding = options.encodeCrossContextOptions();
     DartSdk sdk = sdkMap[encoding];
     if (sdk == null) {
-      sdk = sdkCreator();
+      sdk = sdkCreator(options);
       sdkMap[encoding] = sdk;
-      sdk.context.analysisOptions.setCrossContextOptionsFrom(options);
     }
     return sdk;
   }
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index 6f03a84..9bf52bf 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -249,6 +249,11 @@
   Map<String, Source> _uriToSourceMap = new HashMap<String, Source>();
 
   /**
+   * The [AnalysisOptions] to use to create the [context].
+   */
+  AnalysisOptions _analysisOptions;
+
+  /**
    * Initialize a newly created SDK to represent the Dart SDK installed in the
    * [sdkDirectory]. The flag [useDart2jsPaths] is `true` if the dart2js path
    * should be used when it is available
@@ -258,12 +263,31 @@
     _libraryMap = initialLibraryMap(useDart2jsPaths);
   }
 
+  /**
+   * Set the [options] for this SDK analysis context.  Throw [StateError] if the
+   * context has been already created.
+   */
+  void set analysisOptions(AnalysisOptions options) {
+    if (_analysisContext != null) {
+      throw new StateError(
+          'Analysis options cannot be changed after context creation.');
+    }
+    _analysisOptions = options;
+  }
+
   @override
   AnalysisContext get context {
     if (_analysisContext == null) {
-      _analysisContext = new SdkAnalysisContext();
+      _analysisContext = new SdkAnalysisContext(_analysisOptions);
       SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
       _analysisContext.sourceFactory = factory;
+      if (_useSummary) {
+        PackageBundle sdkBundle = getSummarySdkBundle();
+        if (sdkBundle != null) {
+          _analysisContext.resultProvider =
+              new SdkSummaryResultProvider(_analysisContext, sdkBundle);
+        }
+      }
     }
     return _analysisContext;
   }
@@ -393,14 +417,11 @@
    * Specify whether SDK summary should be used.
    */
   void set useSummary(bool use) {
-    _useSummary = use;
-    if (_useSummary) {
-      PackageBundle sdkBundle = _getSummarySdkBundle();
-      if (sdkBundle != null) {
-        _analysisContext.resultProvider =
-            new SdkSummaryResultProvider(_analysisContext, sdkBundle);
-      }
+    if (_analysisContext != null) {
+      throw new StateError(
+          'The "useSummary" flag cannot be changed after context creation.');
     }
+    _useSummary = use;
   }
 
   /**
@@ -512,6 +533,30 @@
   SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri);
 
   /**
+   * Return the [PackageBundle] for this SDK, if it exists, or `null` otherwise.
+   * This method should not be used outside of `analyzer` and `analyzer_cli`
+   * packages.
+   */
+  PackageBundle getSummarySdkBundle() {
+    String rootPath = directory.getAbsolutePath();
+    bool strongMode = _analysisOptions?.strongMode ?? false;
+    String name = strongMode ? 'strong.sum' : 'spec.sum';
+    String path = pathos.join(rootPath, 'lib', '_internal', name);
+    try {
+      File file = new File(path);
+      if (file.existsSync()) {
+        List<int> bytes = file.readAsBytesSync();
+        return new PackageBundle.fromBuffer(bytes);
+      }
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          'Failed to load SDK analysis summary from $path',
+          new CaughtException(exception, stackTrace));
+    }
+    return null;
+  }
+
+  /**
    * Read all of the configuration files to initialize the library maps. The
    * flag [useDart2jsPaths] is `true` if the dart2js path should be used when it
    * is available. Return the initialized library map.
@@ -547,28 +592,6 @@
     return source;
   }
 
-  /**
-   * Return the [PackageBundle] for this SDK, if it exists, or `null` otherwise.
-   */
-  PackageBundle _getSummarySdkBundle() {
-    String rootPath = directory.getAbsolutePath();
-    String name =
-        context.analysisOptions.strongMode ? 'strong.sum' : 'spec.sum';
-    String path = pathos.join(rootPath, 'lib', '_internal', name);
-    try {
-      File file = new File(path);
-      if (file.existsSync()) {
-        List<int> bytes = file.readAsBytesSync();
-        return new PackageBundle.fromBuffer(bytes);
-      }
-    } catch (exception, stackTrace) {
-      AnalysisEngine.instance.logger.logError(
-          'Failed to load SDK analysis summary from $path',
-          new CaughtException(exception, stackTrace));
-    }
-    return null;
-  }
-
   FileBasedSource _mapDartUri(String dartUri) {
     String libraryName;
     String relativePath;
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 092671e..0387905 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -404,11 +404,6 @@
 
   @override
   bool exists() => false;
-
-  @override
-  Uri resolveRelativeUri(Uri relativeUri) {
-    throw new UnsupportedOperationException('$fullName does not exist.');
-  }
 }
 
 /**
@@ -547,21 +542,6 @@
    * @return `true` if this source exists
    */
   bool exists();
-
-  /**
-   * Resolve the relative URI against the URI associated with this source object.
-   *
-   * Note: This method is not intended for public use, it is only visible out of necessity. It is
-   * only intended to be invoked by a [SourceFactory]. Source factories will
-   * only invoke this method if the URI is relative, so implementations of this method are not
-   * required to, and generally do not, verify the argument. The result of invoking this method with
-   * an absolute URI is intentionally left unspecified.
-   *
-   * @param relativeUri the relative URI to be resolved against this source
-   * @return the URI to which given URI was resolved
-   * @throws AnalysisException if the relative URI could not be resolved
-   */
-  Uri resolveRelativeUri(Uri relativeUri);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index 49641c8..811a048 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 
 export 'package:analyzer/src/generated/source.dart';
 
@@ -82,6 +83,44 @@
 }
 
 /**
+ * Instances of the class [ExplicitSourceResolver] map URIs to files on disk
+ * using a fixed mapping provided at construction time.
+ */
+class ExplicitSourceResolver extends UriResolver {
+  final Map<Uri, JavaFile> uriToFileMap;
+  final Map<String, Uri> pathToUriMap;
+
+  /**
+   * Construct an [ExplicitSourceResolver] based on the given [uriToFileMap].
+   */
+  ExplicitSourceResolver(Map<Uri, JavaFile> uriToFileMap)
+      : uriToFileMap = uriToFileMap,
+        pathToUriMap = _computePathToUriMap(uriToFileMap);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    return new FileBasedSource(uriToFileMap[uri], actualUri ?? uri);
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    return pathToUriMap[source.fullName];
+  }
+
+  /**
+   * Build the inverse mapping of [uriToSourceMap].
+   */
+  static Map<String, Uri> _computePathToUriMap(
+      Map<Uri, JavaFile> uriToSourceMap) {
+    Map<String, Uri> pathToUriMap = <String, Uri>{};
+    uriToSourceMap.forEach((Uri uri, JavaFile file) {
+      pathToUriMap[file.getAbsolutePath()] = uri;
+    });
+    return pathToUriMap;
+  }
+}
+
+/**
  * Instances of the class `FileBasedSource` implement a source that represents a file.
  */
 class FileBasedSource extends Source {
@@ -209,32 +248,6 @@
   bool exists() => file.isFile();
 
   @override
-  Uri resolveRelativeUri(Uri containedUri) {
-    try {
-      Uri baseUri = uri;
-      bool isOpaque = uri.isAbsolute && !uri.path.startsWith('/');
-      if (isOpaque) {
-        String scheme = uri.scheme;
-        String part = uri.path;
-        if (scheme == DartUriResolver.DART_SCHEME && part.indexOf('/') < 0) {
-          part = "$part/$part.dart";
-        }
-        baseUri = parseUriWithException("$scheme:/$part");
-      }
-      Uri result = baseUri.resolveUri(containedUri);
-      if (isOpaque) {
-        result = parseUriWithException(
-            "${result.scheme}:${result.path.substring(1)}");
-      }
-      return result;
-    } catch (exception, stackTrace) {
-      throw new AnalysisException(
-          "Could not resolve URI ($containedUri) relative to source ($uri)",
-          new CaughtException(exception, stackTrace));
-    }
-  }
-
-  @override
   String toString() {
     if (file == null) {
       return "<unknown source>";
@@ -433,11 +446,13 @@
       if (resolvedFile.exists()) {
         JavaFile canonicalFile =
             getCanonicalFile(packagesDirectory, pkgName, relPath);
+        if (actualUri != null) {
+          return new FileBasedSource(canonicalFile, actualUri);
+        }
         if (_isSelfReference(packagesDirectory, canonicalFile)) {
           uri = canonicalFile.toURI();
         }
-        return new FileBasedSource(
-            canonicalFile, actualUri != null ? actualUri : uri);
+        return new FileBasedSource(canonicalFile, uri);
       }
     }
     return new FileBasedSource(
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 84f2eb7..9dc5506 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -22,8 +22,6 @@
  * https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
  */
 class StrongTypeSystemImpl extends TypeSystem {
-  final _specTypeSystem = new TypeSystemImpl();
-
   bool anyParameterType(FunctionType ft, bool predicate(DartType t)) {
     return ft.parameters.any((p) => predicate(p.type));
   }
@@ -43,11 +41,162 @@
     return null;
   }
 
+  /// Computes the greatest lower bound of [type1] and [type2].
   @override
-  DartType getLeastUpperBound(
-      TypeProvider typeProvider, DartType type1, DartType type2) {
-    // TODO(leafp): Implement a strong mode version of this.
-    return _specTypeSystem.getLeastUpperBound(typeProvider, type1, type2);
+  DartType getGreatestLowerBound(
+      TypeProvider provider, DartType type1, DartType type2) {
+    // The greatest lower bound relation is reflexive.
+    if (identical(type1, type2)) {
+      return type1;
+    }
+
+    // Treat dynamic as top. The GLB of dynamic and any type is just that type
+    // since dynamic permits all values.
+    if (type1.isDynamic) {
+      return type2;
+    }
+    if (type2.isDynamic) {
+      return type1;
+    }
+
+    // You can't get any lower than bottom.
+    if (type1.isBottom || type2.isBottom) {
+      return provider.bottomType;
+    }
+
+    // Treat void as top-like for GLB. This only comes into play with the
+    // return types of two functions whose GLB is being taken. We allow a
+    // non-void-returning function to subtype a void-returning one, so match
+    // that logic here by treating the non-void arm as the subtype for GLB.
+    if (type1.isVoid) {
+      return type2;
+    }
+    if (type2.isVoid) {
+      return type1;
+    }
+
+    // Function types have structural GLB.
+    if (type1 is FunctionType && type2 is FunctionType) {
+      return _functionGreatestLowerBound(provider, type1, type2);
+    }
+
+    // Otherwise, the GLB of two types is one of them it if it is a subtype of
+    // the other.
+    if (isSubtypeOf(type1, type2)) {
+      return type1;
+    }
+
+    if (isSubtypeOf(type2, type1)) {
+      return type2;
+    }
+
+    // No subtype relation, so no known GLB.
+    return provider.bottomType;
+  }
+
+  /**
+   * This currently does not implement a very complete least upper bound
+   * algorithm, but handles a couple of the very common cases that are
+   * causing pain in real code.  The current algorithm is:
+   * 1. If either of the types is a supertype of the other, return it.
+   *    This is in fact the best result in this case.
+   * 2. If the two types have the same class element, then take the
+   *    pointwise least upper bound of the type arguments.  This is again
+   *    the best result, except that the recursive calls may not return
+   *    the true least uppper bounds.  The result is guaranteed to be a
+   *    well-formed type under the assumption that the input types were
+   *    well-formed (and assuming that the recursive calls return
+   *    well-formed types).
+   * 3. Otherwise return the spec-defined least upper bound.  This will
+   *    be an upper bound, might (or might not) be least, and might
+   *    (or might not) be a well-formed type.
+   *
+   * TODO(leafp): Use matchTypes or something similar here to handle the
+   *  case where one of the types is a superclass (but not supertype) of
+   *  the other, e.g. LUB(Iterable<double>, List<int>) = Iterable<num>
+   * TODO(leafp): Figure out the right final algorithm and implement it.
+   */
+  @override
+  DartType _interfaceLeastUpperBound(
+      TypeProvider provider, InterfaceType type1, InterfaceType type2) {
+    if (isSubtypeOf(type1, type2)) {
+      return type2;
+    }
+    if (isSubtypeOf(type2, type1)) {
+      return type1;
+    }
+    if (type1.element == type2.element) {
+      List<DartType> tArgs1 = type1.typeArguments;
+      List<DartType> tArgs2 = type2.typeArguments;
+
+      assert(tArgs1.length == tArgs2.length);
+      List<DartType> tArgs = new List(tArgs1.length);
+      for (int i = 0; i < tArgs1.length; i++) {
+        tArgs[i] = getLeastUpperBound(provider, tArgs1[i], tArgs2[i]);
+      }
+      InterfaceTypeImpl lub = new InterfaceTypeImpl(type1.element);
+      lub.typeArguments = tArgs;
+      return lub;
+    }
+    return InterfaceTypeImpl.computeLeastUpperBound(type1, type2) ??
+        provider.dynamicType;
+  }
+
+  /**
+   * This currently just implements a simple least upper bound to
+   * handle some common cases.  It also avoids some termination issues
+   * with the naive spec algorithm.  The least upper bound of two types
+   * (at least one of which is a type parameter) is computed here as:
+   * 1. If either type is a supertype of the other, return it.
+   * 2. If the first type is a type parameter, replace it with its bound,
+   *    with recursive occurrences of itself replaced with Object.
+   *    The second part of this should ensure termination.  Informally,
+   *    each type variable instantiation in one of the arguments to the
+   *    least upper bound algorithm now strictly reduces the number
+   *    of bound variables in scope in that argument position.
+   * 3. If the second type is a type parameter, do the symmetric operation
+   *    to #2.
+   *
+   * It's not immediately obvious why this is symmetric in the case that both
+   * of the them are type parameters.  For #1, symmetry holds since subtype
+   * is antisymmetric.  For #2, it's clearly not symmetric if upper bounds of
+   * bottom are allowed.  Ignoring this (for various reasons, not least
+   * of which that there's no way to write it), there's an informal
+   * argument (that might even be right) that you will always either
+   * end up expanding both of them or else returning the same result no matter
+   * which order you expand them in.  A key observation is that
+   * identical(expand(type1), type2) => subtype(type1, type2)
+   * and hence the contra-positive.
+   *
+   * TODO(leafp): Think this through and figure out what's the right
+   * definition.  Be careful about termination.
+   *
+   * I suspect in general a reasonable algorithm is to expand the innermost
+   * type variable first.  Alternatively, you could probably choose to treat
+   * it as just an instance of the interface type upper bound problem, with
+   * the "inheritance" chain extended by the bounds placed on the variables.
+   */
+  @override
+  DartType _typeParameterLeastUpperBound(
+      TypeProvider provider, DartType type1, DartType type2) {
+    if (isSubtypeOf(type1, type2)) {
+      return type2;
+    }
+    if (isSubtypeOf(type2, type1)) {
+      return type1;
+    }
+    if (type1 is TypeParameterType) {
+      type1 = type1
+          .resolveToBound(provider.objectType)
+          .substitute2([provider.objectType], [type1]);
+      return getLeastUpperBound(provider, type1, type2);
+    }
+    // We should only be called when at least one of the types is a
+    // TypeParameterType
+    type2 = type2
+        .resolveToBound(provider.objectType)
+        .substitute2([provider.objectType], [type2]);
+    return getLeastUpperBound(provider, type1, type2);
   }
 
   /**
@@ -222,8 +371,7 @@
     // TODO(leafp): Emit warnings and hints for these in some way.
     // TODO(leafp): Consider adding a flag to disable these?  Or just rely on
     //   --warnings-as-errors?
-    if (isSubtypeOf(toType, fromType) ||
-        _specTypeSystem.isAssignableTo(toType, fromType)) {
+    if (isSubtypeOf(toType, fromType) || toType.isAssignableTo(fromType)) {
       // TODO(leafp): error if type is known to be exact (literal,
       //  instance creation).
       // TODO(leafp): Warn on composite downcast.
@@ -270,6 +418,121 @@
   }
 
   /**
+   * Compute the greatest lower bound of function types [f] and [g].
+   *
+   * The spec rules for GLB on function types, informally, are pretty simple:
+   *
+   * - If a parameter is required in both, it stays required.
+   *
+   * - If a positional parameter is optional or missing in one, it becomes
+   *   optional.
+   *
+   * - Named parameters are unioned together.
+   *
+   * - For any parameter that exists in both functions, use the LUB of them as
+   *   the resulting parameter type.
+   *
+   * - Use the GLB of their return types.
+   */
+  DartType _functionGreatestLowerBound(
+      TypeProvider provider, FunctionType f, FunctionType g) {
+    // Calculate the LUB of each corresponding pair of parameters.
+    List<ParameterElement> parameters = [];
+
+    bool hasPositional = false;
+    bool hasNamed = false;
+    addParameter(
+        String name, DartType fType, DartType gType, ParameterKind kind) {
+      DartType paramType;
+      if (fType != null && gType != null) {
+        // If both functions have this parameter, include both of their types.
+        paramType = getLeastUpperBound(provider, fType, gType);
+      } else {
+        paramType = fType ?? gType;
+      }
+
+      parameters.add(new ParameterElementImpl.synthetic(name, paramType, kind));
+    }
+
+    // TODO(rnystrom): Right now, this assumes f and g do not have any type
+    // parameters. Revisit that in the presence of generic methods.
+    List<DartType> fRequired = f.normalParameterTypes;
+    List<DartType> gRequired = g.normalParameterTypes;
+
+    // We need some parameter names for in the synthesized function type.
+    List<String> fRequiredNames = f.normalParameterNames;
+    List<String> gRequiredNames = g.normalParameterNames;
+
+    // Parameters that are required in both functions are required in the
+    // result.
+    int requiredCount = math.min(fRequired.length, gRequired.length);
+    for (int i = 0; i < requiredCount; i++) {
+      addParameter(fRequiredNames[i], fRequired[i], gRequired[i],
+          ParameterKind.REQUIRED);
+    }
+
+    // Parameters that are optional or missing in either end up optional.
+    List<DartType> fPositional = f.optionalParameterTypes;
+    List<DartType> gPositional = g.optionalParameterTypes;
+    List<String> fPositionalNames = f.optionalParameterNames;
+    List<String> gPositionalNames = g.optionalParameterNames;
+
+    int totalPositional = math.max(fRequired.length + fPositional.length,
+        gRequired.length + gPositional.length);
+    for (int i = requiredCount; i < totalPositional; i++) {
+      // Find the corresponding positional parameters (required or optional) at
+      // this index, if there is one.
+      DartType fType;
+      String fName;
+      if (i < fRequired.length) {
+        fType = fRequired[i];
+        fName = fRequiredNames[i];
+      } else if (i < fRequired.length + fPositional.length) {
+        fType = fPositional[i - fRequired.length];
+        fName = fPositionalNames[i - fRequired.length];
+      }
+
+      DartType gType;
+      String gName;
+      if (i < gRequired.length) {
+        gType = gRequired[i];
+        gName = gRequiredNames[i];
+      } else if (i < gRequired.length + gPositional.length) {
+        gType = gPositional[i - gRequired.length];
+        gName = gPositionalNames[i - gRequired.length];
+      }
+
+      // The loop should not let us go past both f and g's positional params.
+      assert(fType != null || gType != null);
+
+      addParameter(fName ?? gName, fType, gType, ParameterKind.POSITIONAL);
+      hasPositional = true;
+    }
+
+    // Union the named parameters together.
+    Map<String, DartType> fNamed = f.namedParameterTypes;
+    Map<String, DartType> gNamed = g.namedParameterTypes;
+    for (String name in fNamed.keys.toSet()..addAll(gNamed.keys)) {
+      addParameter(name, fNamed[name], gNamed[name], ParameterKind.NAMED);
+      hasNamed = true;
+    }
+
+    // Edge case. Dart does not support functions with both optional positional
+    // and named parameters. If we would synthesize that, give up.
+    if (hasPositional && hasNamed) return provider.bottomType;
+
+    // Calculate the GLB of the return type.
+    DartType returnType =
+        getGreatestLowerBound(provider, f.returnType, g.returnType);
+    return new FunctionElementImpl.synthetic(parameters, returnType).type;
+  }
+
+  @override
+  DartType _functionParameterBound(
+          TypeProvider provider, DartType f, DartType g) =>
+      getGreatestLowerBound(provider, f, g);
+
+  /**
    * Guard against loops in the class hierarchy
    */
   _GuardedSubtypeChecker<DartType> _guard(
@@ -377,7 +640,6 @@
     _GuardedSubtypeChecker<DartType> guardedSubtype = _guard(_isSubtypeOf);
     _GuardedSubtypeChecker<DartType> guardedInferTypeParameter =
         _guard(_inferTypeParameterSubtypeOf);
-
     if (t1 == t2) {
       return true;
     }
@@ -415,6 +677,12 @@
       return guardedInferTypeParameter(t1, t2, visited);
     }
 
+    // Void only appears as the return type of a function, and we handle it
+    // directly in the function subtype rules. We should not get to a point
+    // where we're doing a subtype test on a "bare" void, but just in case we
+    // do, handle it safely.
+    // TODO(rnystrom): Determine how this can ever be reached. If it can't,
+    // remove it.
     if (t1.isVoid || t2.isVoid) {
       return false;
     }
@@ -444,8 +712,8 @@
     return _isFunctionSubtypeOf(t1 as FunctionType, t2 as FunctionType);
   }
 
-  // TODO(leafp): Document the rules in play here
   bool _isTop(DartType t, {bool dynamicIsBottom: false}) {
+    // TODO(leafp): Document the rules in play here
     return (t.isDynamic && !dynamicIsBottom) || t.isObject;
   }
 }
@@ -473,7 +741,75 @@
    * Compute the least upper bound of two types.
    */
   DartType getLeastUpperBound(
-      TypeProvider typeProvider, DartType type1, DartType type2);
+      TypeProvider typeProvider, DartType type1, DartType type2) {
+    // The least upper bound relation is reflexive.
+    if (identical(type1, type2)) {
+      return type1;
+    }
+    // The least upper bound of dynamic and any type T is dynamic.
+    if (type1.isDynamic) {
+      return type1;
+    }
+    if (type2.isDynamic) {
+      return type2;
+    }
+    // The least upper bound of void and any type T != dynamic is void.
+    if (type1.isVoid) {
+      return type1;
+    }
+    if (type2.isVoid) {
+      return type2;
+    }
+    // The least upper bound of bottom and any type T is T.
+    if (type1.isBottom) {
+      return type2;
+    }
+    if (type2.isBottom) {
+      return type1;
+    }
+
+    if (type1 is TypeParameterType || type2 is TypeParameterType) {
+      return _typeParameterLeastUpperBound(typeProvider, type1, type2);
+    }
+
+    // The least upper bound of a function type and an interface type T is the
+    // least upper bound of Function and T.
+    if (type1 is FunctionType && type2 is InterfaceType) {
+      type1 = typeProvider.functionType;
+    }
+    if (type2 is FunctionType && type1 is InterfaceType) {
+      type2 = typeProvider.functionType;
+    }
+
+    // At this point type1 and type2 should both either be interface types or
+    // function types.
+    if (type1 is InterfaceType && type2 is InterfaceType) {
+      return _interfaceLeastUpperBound(typeProvider, type1, type2);
+    }
+
+    if (type1 is FunctionType && type2 is FunctionType) {
+      return _functionLeastUpperBound(typeProvider, type1, type2);
+    }
+
+    // Should never happen. As a defensive measure, return the dynamic type.
+    assert(false);
+    return typeProvider.dynamicType;
+  }
+
+  /**
+   * Given two [InterfaceType]s [type1] and [type2] return their least upper
+   * bound in a type system specific manner.
+   */
+  DartType _interfaceLeastUpperBound(
+      TypeProvider provider, InterfaceType type1, InterfaceType type2);
+
+  /**
+   * Given two [DartType]s [type1] and [type2] at least one of which is a
+   * [TypeParameterType], return their least upper bound in a type system
+   * specific manner.
+   */
+  DartType _typeParameterLeastUpperBound(
+      TypeProvider provider, DartType type1, DartType type2);
 
   /**
    * Given a [DartType] [type], instantiate it with its bounds.
@@ -587,120 +923,6 @@
       TypeParameterTypeImpl.getTypes(typeFormalsAsElements(type));
 
   /**
-   * Create either a strong mode or regular type system based on context.
-   */
-  static TypeSystem create(AnalysisContext context) {
-    return (context.analysisOptions.strongMode)
-        ? new StrongTypeSystemImpl()
-        : new TypeSystemImpl();
-  }
-}
-
-/**
- * Implementation of [TypeSystem] using the rules in the Dart specification.
- */
-class TypeSystemImpl extends TypeSystem {
-  TypeSystemImpl();
-
-  @override
-  bool canPromoteToType(DartType to, DartType from) {
-    // Declared type should not be "dynamic".
-    // Promoted type should not be "dynamic".
-    // Promoted type should be more specific than declared.
-    return !from.isDynamic && !to.isDynamic && to.isMoreSpecificThan(from);
-  }
-
-  @override
-  DartType getLeastUpperBound(
-      TypeProvider typeProvider, DartType type1, DartType type2) {
-    // The least upper bound relation is reflexive.
-    if (identical(type1, type2)) {
-      return type1;
-    }
-    // The least upper bound of dynamic and any type T is dynamic.
-    if (type1.isDynamic) {
-      return type1;
-    }
-    if (type2.isDynamic) {
-      return type2;
-    }
-    // The least upper bound of void and any type T != dynamic is void.
-    if (type1.isVoid) {
-      return type1;
-    }
-    if (type2.isVoid) {
-      return type2;
-    }
-    // The least upper bound of bottom and any type T is T.
-    if (type1.isBottom) {
-      return type2;
-    }
-    if (type2.isBottom) {
-      return type1;
-    }
-
-    // Let U be a type variable with upper bound B.  The least upper bound of U
-    // and a type T is the least upper bound of B and T.
-    type1 = type1.resolveToBound(typeProvider.objectType);
-    type2 = type2.resolveToBound(typeProvider.objectType);
-
-    // The least upper bound of a function type and an interface type T is the
-    // least upper bound of Function and T.
-    if (type1 is FunctionType && type2 is InterfaceType) {
-      type1 = typeProvider.functionType;
-    }
-    if (type2 is FunctionType && type1 is InterfaceType) {
-      type2 = typeProvider.functionType;
-    }
-
-    // At this point type1 and type2 should both either be interface types or
-    // function types.
-    if (type1 is InterfaceType && type2 is InterfaceType) {
-      InterfaceType result =
-          InterfaceTypeImpl.computeLeastUpperBound(type1, type2);
-      if (result == null) {
-        return typeProvider.dynamicType;
-      }
-      return result;
-    } else if (type1 is FunctionType && type2 is FunctionType) {
-      return _functionLeastUpperBound(typeProvider, type1, type2);
-    } else {
-      // Should never happen.  As a defensive measure, return the dynamic type.
-      assert(false);
-      return typeProvider.dynamicType;
-    }
-  }
-
-  /**
-   * Instantiate a parameterized type using `dynamic` for all generic
-   * parameters.  Returns the type unchanged if there are no parameters.
-   */
-  DartType instantiateToBounds(DartType type) {
-    List<DartType> typeFormals = typeFormalsAsTypes(type);
-    int count = typeFormals.length;
-    if (count > 0) {
-      List<DartType> typeArguments =
-          new List<DartType>.filled(count, DynamicTypeImpl.instance);
-      return instantiateType(type, typeArguments);
-    }
-    return type;
-  }
-
-  @override
-  bool isAssignableTo(DartType leftType, DartType rightType) {
-    return leftType.isAssignableTo(rightType);
-  }
-
-  @override
-  bool isMoreSpecificThan(DartType t1, DartType t2) =>
-      t1.isMoreSpecificThan(t2);
-
-  @override
-  bool isSubtypeOf(DartType leftType, DartType rightType) {
-    return leftType.isSubtypeOf(rightType);
-  }
-
-  /**
    * Compute the least upper bound of function types [f] and [g].
    *
    * The spec rules for LUB on function types, informally, are pretty simple
@@ -739,7 +961,7 @@
     for (int i = 0; i < fRequired.length; i++) {
       parameters.add(new ParameterElementImpl.synthetic(
           fRequiredNames[i],
-          getLeastUpperBound(provider, fRequired[i], gRequired[i]),
+          _functionParameterBound(provider, fRequired[i], gRequired[i]),
           ParameterKind.REQUIRED));
     }
 
@@ -752,7 +974,7 @@
     for (int i = 0; i < length; i++) {
       parameters.add(new ParameterElementImpl.synthetic(
           fPositionalNames[i],
-          getLeastUpperBound(provider, fPositional[i], gPositional[i]),
+          _functionParameterBound(provider, fPositional[i], gPositional[i]),
           ParameterKind.POSITIONAL));
     }
 
@@ -761,21 +983,94 @@
     for (String name in fNamed.keys.toSet()..retainAll(gNamed.keys)) {
       parameters.add(new ParameterElementImpl.synthetic(
           name,
-          getLeastUpperBound(provider, fNamed[name], gNamed[name]),
+          _functionParameterBound(provider, fNamed[name], gNamed[name]),
           ParameterKind.NAMED));
     }
 
     // Calculate the LUB of the return type.
     DartType returnType =
         getLeastUpperBound(provider, f.returnType, g.returnType);
+    return new FunctionElementImpl.synthetic(parameters, returnType).type;
+  }
 
-    FunctionElementImpl function = new FunctionElementImpl("", -1);
-    function.synthetic = true;
-    function.returnType = returnType;
-    function.parameters = parameters;
+  /**
+   * Calculates the appropriate upper or lower bound of a pair of parameters
+   * for two function types whose least upper bound is being calculated.
+   *
+   * In spec mode, this uses least upper bound, which... doesn't really make
+   * much sense. Strong mode overrides this to use greatest lower bound.
+   */
+  DartType _functionParameterBound(
+          TypeProvider provider, DartType f, DartType g) =>
+      getLeastUpperBound(provider, f, g);
 
-    function.type = new FunctionTypeImpl(function);
-    return function.type;
+  /**
+   * Create either a strong mode or regular type system based on context.
+   */
+  static TypeSystem create(AnalysisContext context) {
+    return (context.analysisOptions.strongMode)
+        ? new StrongTypeSystemImpl()
+        : new TypeSystemImpl();
+  }
+}
+
+/**
+ * Implementation of [TypeSystem] using the rules in the Dart specification.
+ */
+class TypeSystemImpl extends TypeSystem {
+  TypeSystemImpl();
+
+  @override
+  bool canPromoteToType(DartType to, DartType from) {
+    // Declared type should not be "dynamic".
+    // Promoted type should not be "dynamic".
+    // Promoted type should be more specific than declared.
+    return !from.isDynamic && !to.isDynamic && to.isMoreSpecificThan(from);
+  }
+
+  /**
+   * Instantiate a parameterized type using `dynamic` for all generic
+   * parameters.  Returns the type unchanged if there are no parameters.
+   */
+  DartType instantiateToBounds(DartType type) {
+    List<DartType> typeFormals = typeFormalsAsTypes(type);
+    int count = typeFormals.length;
+    if (count > 0) {
+      List<DartType> typeArguments =
+          new List<DartType>.filled(count, DynamicTypeImpl.instance);
+      return instantiateType(type, typeArguments);
+    }
+    return type;
+  }
+
+  @override
+  bool isAssignableTo(DartType leftType, DartType rightType) {
+    return leftType.isAssignableTo(rightType);
+  }
+
+  @override
+  bool isMoreSpecificThan(DartType t1, DartType t2) =>
+      t1.isMoreSpecificThan(t2);
+
+  @override
+  bool isSubtypeOf(DartType leftType, DartType rightType) {
+    return leftType.isSubtypeOf(rightType);
+  }
+
+  @override
+  DartType _interfaceLeastUpperBound(
+      TypeProvider provider, InterfaceType type1, InterfaceType type2) {
+    InterfaceType result =
+        InterfaceTypeImpl.computeLeastUpperBound(type1, type2);
+    return result ?? provider.dynamicType;
+  }
+
+  @override
+  DartType _typeParameterLeastUpperBound(
+      TypeProvider provider, DartType type1, DartType type2) {
+    type1 = type1.resolveToBound(provider.objectType);
+    type2 = type2.resolveToBound(provider.objectType);
+    return getLeastUpperBound(provider, type1, type2);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index 41b7d7c..2e4abf1 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -8,6 +8,45 @@
 import 'package:analyzer/dart/ast/token.dart' show Token;
 import 'package:analyzer/src/dart/element/element.dart' show ElementImpl;
 import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * Resolve the [containedUri] against [baseUri] using Dart rules.
+ *
+ * This function behaves similarly to [Uri.resolveUri], except that it properly
+ * handles situations like the following:
+ *
+ *     resolveRelativeUri(dart:core, bool.dart) -> dart:core/bool.dart
+ *     resolveRelativeUri(package:a/b.dart, ../c.dart) -> package:a/c.dart
+ */
+Uri resolveRelativeUri(Uri baseUri, Uri containedUri) {
+  if (containedUri.isAbsolute) {
+    return containedUri;
+  }
+  Uri origBaseUri = baseUri;
+  try {
+    bool isOpaque = baseUri.isAbsolute && !baseUri.path.startsWith('/');
+    if (isOpaque) {
+      String scheme = baseUri.scheme;
+      String part = baseUri.path;
+      if (scheme == DartUriResolver.DART_SCHEME && part.indexOf('/') < 0) {
+        part = "$part/$part.dart";
+      }
+      baseUri = parseUriWithException("$scheme:/$part");
+    }
+    Uri result = baseUri.resolveUri(containedUri);
+    if (isOpaque) {
+      result =
+          parseUriWithException("${result.scheme}:${result.path.substring(1)}");
+    }
+    return result;
+  } catch (exception, stackTrace) {
+    throw new AnalysisException(
+        "Could not resolve URI ($containedUri) relative to source ($origBaseUri)",
+        new CaughtException(exception, stackTrace));
+  }
+}
 
 /**
  * If the given [node] has a documentation comment, remember its content
diff --git a/pkg/analyzer/lib/src/plugin/plugin_configuration.dart b/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
index 222e376..2137f11 100644
--- a/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
+++ b/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
@@ -143,8 +143,7 @@
   }
 
   @override
-  void optionsProcessed(
-      AnalysisContext context, Map<String, Object> options) {
+  void optionsProcessed(AnalysisContext context, Map<String, Object> options) {
     _config = new PluginConfig.fromOptions(options);
   }
 }
diff --git a/pkg/analyzer/lib/src/string_source.dart b/pkg/analyzer/lib/src/string_source.dart
index 04eb0a3..ce0c087 100644
--- a/pkg/analyzer/lib/src/string_source.dart
+++ b/pkg/analyzer/lib/src/string_source.dart
@@ -64,8 +64,5 @@
   bool exists() => true;
 
   @override
-  Uri resolveRelativeUri(Uri relativeUri) => uri.resolveUri(relativeUri);
-
-  @override
   String toString() => 'StringSource ($fullName)';
 }
diff --git a/pkg/analyzer/lib/src/summary/base.dart b/pkg/analyzer/lib/src/summary/base.dart
index acdb839..7c3d8ae 100644
--- a/pkg/analyzer/lib/src/summary/base.dart
+++ b/pkg/analyzer/lib/src/summary/base.dart
@@ -23,6 +23,30 @@
 }
 
 /**
+ * Instances of this class represent data that has been read from a summary.
+ */
+abstract class SummaryClass {
+  /**
+   * Translate the data in this class into a JSON map, whose keys are the names
+   * of fields and whose values are the data stored in those fields,
+   * recursively converted into JSON.
+   *
+   * Fields containing their default value are elided.
+   *
+   * Intended for testing and debugging only.
+   */
+  Map<String, Object> toJson();
+
+  /**
+   * Translate the data in this class into a map whose keys are the names of
+   * fields and whose values are the data stored in those fields.
+   *
+   * Intended for testing and debugging only.
+   */
+  Map<String, Object> toMap();
+}
+
+/**
  * Annotation used in the summary IDL to indicate that a summary class can be
  * the top level object in an encoded summary.
  */
@@ -35,27 +59,3 @@
 
   const TopLevel([this.fileIdentifier]);
 }
-
-/**
- * Instances of this class represent data that has been read from a summary.
- */
-abstract class SummaryClass {
-  /**
-   * Translate the data in this class into a map whose keys are the names of
-   * fields and whose values are the data stored in those fields.
-   *
-   * Intended for testing and debugging only.
-   */
-  Map<String, Object> toMap();
-
-  /**
-   * Translate the data in this class into a JSON map, whose keys are the names
-   * of fields and whose values are the data stored in those fields,
-   * recursively converted into JSON.
-   *
-   * Fields containing their default value are elided.
-   *
-   * Intended for testing and debugging only.
-   */
-  Map<String, Object> toJson();
-}
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index e8f16bf..43b5547 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -189,6 +189,12 @@
       _kind = kind,
       _partUris = partUris;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   List<int> toBuffer() {
     fb.Builder fbBuilder = new fb.Builder();
     return fbBuilder.finish(finish(fbBuilder), "CaSS");
@@ -330,6 +336,12 @@
     : _length = length,
       _offset = offset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -540,6 +552,15 @@
       _syntheticReturnType = syntheticReturnType,
       _typeArguments = typeArguments;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _syntheticParams?.forEach((b) => b.flushInformative());
+    _syntheticReturnType?.flushInformative();
+    _typeArguments?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -714,6 +735,12 @@
     : _parts = parts,
       _uri = uri;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -848,6 +875,12 @@
       _name = name,
       _unit = unit;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -942,6 +975,7 @@
 
   List<LinkedDependencyBuilder> _dependencies;
   List<LinkedExportNameBuilder> _exportNames;
+  bool _fallbackMode;
   List<int> _importDependencies;
   int _numPrelinkedDependencies;
   List<LinkedUnitBuilder> _units;
@@ -986,6 +1020,18 @@
   }
 
   @override
+  bool get fallbackMode => _fallbackMode ??= false;
+
+  /**
+   * Indicates whether this library was summarized in "fallback mode".  If
+   * true, all other fields in the data structure have their default values.
+   */
+  void set fallbackMode(bool _value) {
+    assert(!_finished);
+    _fallbackMode = _value;
+  }
+
+  @override
   List<int> get importDependencies => _importDependencies ??= <int>[];
 
   /**
@@ -1026,13 +1072,23 @@
     _units = _value;
   }
 
-  LinkedLibraryBuilder({List<LinkedDependencyBuilder> dependencies, List<LinkedExportNameBuilder> exportNames, List<int> importDependencies, int numPrelinkedDependencies, List<LinkedUnitBuilder> units})
+  LinkedLibraryBuilder({List<LinkedDependencyBuilder> dependencies, List<LinkedExportNameBuilder> exportNames, bool fallbackMode, List<int> importDependencies, int numPrelinkedDependencies, List<LinkedUnitBuilder> units})
     : _dependencies = dependencies,
       _exportNames = exportNames,
+      _fallbackMode = fallbackMode,
       _importDependencies = importDependencies,
       _numPrelinkedDependencies = numPrelinkedDependencies,
       _units = units;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _dependencies?.forEach((b) => b.flushInformative());
+    _exportNames?.forEach((b) => b.flushInformative());
+    _units?.forEach((b) => b.flushInformative());
+  }
+
   List<int> toBuffer() {
     fb.Builder fbBuilder = new fb.Builder();
     return fbBuilder.finish(finish(fbBuilder), "LLib");
@@ -1064,6 +1120,9 @@
     if (offset_exportNames != null) {
       fbBuilder.addOffset(4, offset_exportNames);
     }
+    if (_fallbackMode == true) {
+      fbBuilder.addBool(5, true);
+    }
     if (offset_importDependencies != null) {
       fbBuilder.addOffset(1, offset_importDependencies);
     }
@@ -1096,6 +1155,7 @@
 
   List<idl.LinkedDependency> _dependencies;
   List<idl.LinkedExportName> _exportNames;
+  bool _fallbackMode;
   List<int> _importDependencies;
   int _numPrelinkedDependencies;
   List<idl.LinkedUnit> _units;
@@ -1113,6 +1173,12 @@
   }
 
   @override
+  bool get fallbackMode {
+    _fallbackMode ??= const fb.BoolReader().vTableGet(_bp, 5, false);
+    return _fallbackMode;
+  }
+
+  @override
   List<int> get importDependencies {
     _importDependencies ??= const fb.Uint32ListReader().vTableGet(_bp, 1, const <int>[]);
     return _importDependencies;
@@ -1137,6 +1203,7 @@
     Map<String, Object> _result = <String, Object>{};
     if (dependencies.isNotEmpty) _result["dependencies"] = dependencies.map((_value) => _value.toJson()).toList();
     if (exportNames.isNotEmpty) _result["exportNames"] = exportNames.map((_value) => _value.toJson()).toList();
+    if (fallbackMode != false) _result["fallbackMode"] = fallbackMode;
     if (importDependencies.isNotEmpty) _result["importDependencies"] = importDependencies;
     if (numPrelinkedDependencies != 0) _result["numPrelinkedDependencies"] = numPrelinkedDependencies;
     if (units.isNotEmpty) _result["units"] = units.map((_value) => _value.toJson()).toList();
@@ -1147,6 +1214,7 @@
   Map<String, Object> toMap() => {
     "dependencies": dependencies,
     "exportNames": exportNames,
+    "fallbackMode": fallbackMode,
     "importDependencies": importDependencies,
     "numPrelinkedDependencies": numPrelinkedDependencies,
     "units": units,
@@ -1285,6 +1353,12 @@
       _numTypeParameters = numTypeParameters,
       _unit = unit;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -1463,6 +1537,14 @@
       _references = references,
       _types = types;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _references?.forEach((b) => b.flushInformative());
+    _types?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -1651,6 +1733,14 @@
       _unlinkedUnits = unlinkedUnits,
       _unlinkedUnitUris = unlinkedUnitUris;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _linkedLibraries?.forEach((b) => b.flushInformative());
+    _unlinkedUnits?.forEach((b) => b.flushInformative());
+  }
+
   List<int> toBuffer() {
     fb.Builder fbBuilder = new fb.Builder();
     return fbBuilder.finish(finish(fbBuilder), "PBdl");
@@ -1915,6 +2005,13 @@
       _units = units,
       _unitUnitUris = unitUnitUris;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _units?.forEach((b) => b.flushInformative());
+  }
+
   List<int> toBuffer() {
     fb.Builder fbBuilder = new fb.Builder();
     return fbBuilder.finish(finish(fbBuilder), "Indx");
@@ -2270,6 +2367,12 @@
       _usedNameOffsets = usedNameOffsets,
       _usedNames = usedNames;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -2704,6 +2807,22 @@
       _supertype = supertype,
       _typeParameters = typeParameters;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _codeRange = null;
+    _documentationComment = null;
+    _executables?.forEach((b) => b.flushInformative());
+    _fields?.forEach((b) => b.flushInformative());
+    _interfaces?.forEach((b) => b.flushInformative());
+    _mixins?.forEach((b) => b.flushInformative());
+    _nameOffset = null;
+    _supertype?.flushInformative();
+    _typeParameters?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -3011,6 +3130,14 @@
       _offset = offset,
       _shows = shows;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _end = null;
+    _offset = null;
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -3197,6 +3324,13 @@
       _references = references,
       _strings = strings;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _references?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -3389,6 +3523,14 @@
       _kind = kind,
       _name = name;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _arguments?.forEach((b) => b.flushInformative());
+    _expression?.flushInformative();
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -3537,6 +3679,12 @@
       _offset = offset,
       _text = text;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -3700,6 +3848,17 @@
       _nameOffset = nameOffset,
       _values = values;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _codeRange = null;
+    _documentationComment = null;
+    _nameOffset = null;
+    _values?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -3876,6 +4035,14 @@
       _name = name,
       _nameOffset = nameOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _documentationComment = null;
+    _nameOffset = null;
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -4354,6 +4521,26 @@
       _visibleLength = visibleLength,
       _visibleOffset = visibleOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _codeRange = null;
+    _constantInitializers?.forEach((b) => b.flushInformative());
+    _documentationComment = null;
+    _localFunctions?.forEach((b) => b.flushInformative());
+    _localLabels?.forEach((b) => b.flushInformative());
+    _localVariables?.forEach((b) => b.flushInformative());
+    _nameEnd = null;
+    _nameOffset = null;
+    _parameters?.forEach((b) => b.flushInformative());
+    _periodOffset = null;
+    _redirectedConstructor?.flushInformative();
+    _returnType?.flushInformative();
+    _typeParameters?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -4830,6 +5017,16 @@
       _uriEnd = uriEnd,
       _uriOffset = uriOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _offset = null;
+    _uriEnd = null;
+    _uriOffset = null;
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -4951,6 +5148,13 @@
     : _combinators = combinators,
       _uri = uri;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _combinators?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -5168,6 +5372,18 @@
       _uriEnd = uriEnd,
       _uriOffset = uriOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _combinators?.forEach((b) => b.flushInformative());
+    _offset = null;
+    _prefixOffset = null;
+    _uriEnd = null;
+    _uriOffset = null;
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -5397,6 +5613,13 @@
       _name = name,
       _nameOffset = nameOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _nameOffset = null;
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -5706,6 +5929,20 @@
       _visibleLength = visibleLength,
       _visibleOffset = visibleOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _codeRange = null;
+    _defaultValue?.flushInformative();
+    _defaultValueCode = null;
+    _initializer?.flushInformative();
+    _nameOffset = null;
+    _parameters?.forEach((b) => b.flushInformative());
+    _type?.flushInformative();
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -6004,6 +6241,15 @@
       _uriEnd = uriEnd,
       _uriOffset = uriOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _uriEnd = null;
+    _uriOffset = null;
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -6146,6 +6392,13 @@
       _name = name,
       _numTypeParameters = numTypeParameters;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _members?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -6287,6 +6540,14 @@
       _names = names,
       _parts = parts;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _exports?.forEach((b) => b.flushInformative());
+    _names?.forEach((b) => b.flushInformative());
+  }
+
   List<int> toBuffer() {
     fb.Builder fbBuilder = new fb.Builder();
     return fbBuilder.finish(finish(fbBuilder), "UPNS");
@@ -6422,6 +6683,12 @@
     : _name = name,
       _prefixReference = prefixReference;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -6599,6 +6866,19 @@
       _returnType = returnType,
       _typeParameters = typeParameters;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _codeRange = null;
+    _documentationComment = null;
+    _nameOffset = null;
+    _parameters?.forEach((b) => b.flushInformative());
+    _returnType?.flushInformative();
+    _typeParameters?.forEach((b) => b.flushInformative());
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -6833,6 +7113,16 @@
       _name = name,
       _nameOffset = nameOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _bound?.flushInformative();
+    _codeRange = null;
+    _nameOffset = null;
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
@@ -6954,6 +7244,7 @@
   List<UnlinkedEnumBuilder> _enums;
   List<UnlinkedExecutableBuilder> _executables;
   List<UnlinkedExportNonPublicBuilder> _exports;
+  String _fallbackModePath;
   List<UnlinkedImportBuilder> _imports;
   List<UnlinkedConstBuilder> _libraryAnnotations;
   UnlinkedDocumentationCommentBuilder _libraryDocumentationComment;
@@ -7023,6 +7314,21 @@
   }
 
   @override
+  String get fallbackModePath => _fallbackModePath ??= '';
+
+  /**
+   * If this compilation unit was summarized in fallback mode, the path where
+   * the compilation unit may be found on disk.  Otherwise empty.
+   *
+   * When this field is non-empty, all other fields in the data structure have
+   * their default values.
+   */
+  void set fallbackModePath(String _value) {
+    assert(!_finished);
+    _fallbackModePath = _value;
+  }
+
+  @override
   List<UnlinkedImportBuilder> get imports => _imports ??= <UnlinkedImportBuilder>[];
 
   /**
@@ -7153,12 +7459,13 @@
     _variables = _value;
   }
 
-  UnlinkedUnitBuilder({List<UnlinkedClassBuilder> classes, CodeRangeBuilder codeRange, List<UnlinkedEnumBuilder> enums, List<UnlinkedExecutableBuilder> executables, List<UnlinkedExportNonPublicBuilder> exports, List<UnlinkedImportBuilder> imports, List<UnlinkedConstBuilder> libraryAnnotations, UnlinkedDocumentationCommentBuilder libraryDocumentationComment, String libraryName, int libraryNameLength, int libraryNameOffset, List<UnlinkedPartBuilder> parts, UnlinkedPublicNamespaceBuilder publicNamespace, List<UnlinkedReferenceBuilder> references, List<UnlinkedTypedefBuilder> typedefs, List<UnlinkedVariableBuilder> variables})
+  UnlinkedUnitBuilder({List<UnlinkedClassBuilder> classes, CodeRangeBuilder codeRange, List<UnlinkedEnumBuilder> enums, List<UnlinkedExecutableBuilder> executables, List<UnlinkedExportNonPublicBuilder> exports, String fallbackModePath, List<UnlinkedImportBuilder> imports, List<UnlinkedConstBuilder> libraryAnnotations, UnlinkedDocumentationCommentBuilder libraryDocumentationComment, String libraryName, int libraryNameLength, int libraryNameOffset, List<UnlinkedPartBuilder> parts, UnlinkedPublicNamespaceBuilder publicNamespace, List<UnlinkedReferenceBuilder> references, List<UnlinkedTypedefBuilder> typedefs, List<UnlinkedVariableBuilder> variables})
     : _classes = classes,
       _codeRange = codeRange,
       _enums = enums,
       _executables = executables,
       _exports = exports,
+      _fallbackModePath = fallbackModePath,
       _imports = imports,
       _libraryAnnotations = libraryAnnotations,
       _libraryDocumentationComment = libraryDocumentationComment,
@@ -7171,6 +7478,27 @@
       _typedefs = typedefs,
       _variables = variables;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _classes?.forEach((b) => b.flushInformative());
+    _codeRange = null;
+    _enums?.forEach((b) => b.flushInformative());
+    _executables?.forEach((b) => b.flushInformative());
+    _exports?.forEach((b) => b.flushInformative());
+    _imports?.forEach((b) => b.flushInformative());
+    _libraryAnnotations?.forEach((b) => b.flushInformative());
+    _libraryDocumentationComment = null;
+    _libraryNameLength = null;
+    _libraryNameOffset = null;
+    _parts?.forEach((b) => b.flushInformative());
+    _publicNamespace?.flushInformative();
+    _references?.forEach((b) => b.flushInformative());
+    _typedefs?.forEach((b) => b.flushInformative());
+    _variables?.forEach((b) => b.flushInformative());
+  }
+
   List<int> toBuffer() {
     fb.Builder fbBuilder = new fb.Builder();
     return fbBuilder.finish(finish(fbBuilder), "UUnt");
@@ -7184,6 +7512,7 @@
     fb.Offset offset_enums;
     fb.Offset offset_executables;
     fb.Offset offset_exports;
+    fb.Offset offset_fallbackModePath;
     fb.Offset offset_imports;
     fb.Offset offset_libraryAnnotations;
     fb.Offset offset_libraryDocumentationComment;
@@ -7208,6 +7537,9 @@
     if (!(_exports == null || _exports.isEmpty)) {
       offset_exports = fbBuilder.writeList(_exports.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_fallbackModePath != null) {
+      offset_fallbackModePath = fbBuilder.writeString(_fallbackModePath);
+    }
     if (!(_imports == null || _imports.isEmpty)) {
       offset_imports = fbBuilder.writeList(_imports.map((b) => b.finish(fbBuilder)).toList());
     }
@@ -7251,6 +7583,9 @@
     if (offset_exports != null) {
       fbBuilder.addOffset(13, offset_exports);
     }
+    if (offset_fallbackModePath != null) {
+      fbBuilder.addOffset(16, offset_fallbackModePath);
+    }
     if (offset_imports != null) {
       fbBuilder.addOffset(5, offset_imports);
     }
@@ -7310,6 +7645,7 @@
   List<idl.UnlinkedEnum> _enums;
   List<idl.UnlinkedExecutable> _executables;
   List<idl.UnlinkedExportNonPublic> _exports;
+  String _fallbackModePath;
   List<idl.UnlinkedImport> _imports;
   List<idl.UnlinkedConst> _libraryAnnotations;
   idl.UnlinkedDocumentationComment _libraryDocumentationComment;
@@ -7353,6 +7689,12 @@
   }
 
   @override
+  String get fallbackModePath {
+    _fallbackModePath ??= const fb.StringReader().vTableGet(_bp, 16, '');
+    return _fallbackModePath;
+  }
+
+  @override
   List<idl.UnlinkedImport> get imports {
     _imports ??= const fb.ListReader<idl.UnlinkedImport>(const _UnlinkedImportReader()).vTableGet(_bp, 5, const <idl.UnlinkedImport>[]);
     return _imports;
@@ -7428,6 +7770,7 @@
     if (enums.isNotEmpty) _result["enums"] = enums.map((_value) => _value.toJson()).toList();
     if (executables.isNotEmpty) _result["executables"] = executables.map((_value) => _value.toJson()).toList();
     if (exports.isNotEmpty) _result["exports"] = exports.map((_value) => _value.toJson()).toList();
+    if (fallbackModePath != '') _result["fallbackModePath"] = fallbackModePath;
     if (imports.isNotEmpty) _result["imports"] = imports.map((_value) => _value.toJson()).toList();
     if (libraryAnnotations.isNotEmpty) _result["libraryAnnotations"] = libraryAnnotations.map((_value) => _value.toJson()).toList();
     if (libraryDocumentationComment != null) _result["libraryDocumentationComment"] = libraryDocumentationComment.toJson();
@@ -7449,6 +7792,7 @@
     "enums": enums,
     "executables": executables,
     "exports": exports,
+    "fallbackModePath": fallbackModePath,
     "imports": imports,
     "libraryAnnotations": libraryAnnotations,
     "libraryDocumentationComment": libraryDocumentationComment,
@@ -7688,6 +8032,19 @@
       _visibleLength = visibleLength,
       _visibleOffset = visibleOffset;
 
+  /**
+   * Flush [informative] data recursively.
+   */
+  void flushInformative() {
+    _annotations?.forEach((b) => b.flushInformative());
+    _codeRange = null;
+    _constExpr?.flushInformative();
+    _documentationComment = null;
+    _initializer?.flushInformative();
+    _nameOffset = null;
+    _type?.flushInformative();
+  }
+
   fb.Offset finish(fb.Builder fbBuilder) {
     assert(!_finished);
     _finished = true;
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 9c6cf83..3457613 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -789,6 +789,12 @@
   exportNames:[LinkedExportName] (id: 4);
 
   /**
+   * Indicates whether this library was summarized in "fallback mode".  If
+   * true, all other fields in the data structure have their default values.
+   */
+  fallbackMode:bool (id: 5);
+
+  /**
    * For each import in [UnlinkedUnit.imports], an index into [dependencies]
    * of the library being imported.
    */
@@ -1967,6 +1973,15 @@
   exports:[UnlinkedExportNonPublic] (id: 13);
 
   /**
+   * If this compilation unit was summarized in fallback mode, the path where
+   * the compilation unit may be found on disk.  Otherwise empty.
+   *
+   * When this field is non-empty, all other fields in the data structure have
+   * their default values.
+   */
+  fallbackModePath:string (id: 16);
+
+  /**
    * Import declarations in the compilation unit.
    */
   imports:[UnlinkedImport] (id: 5);
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 4453056..31acca9 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -437,6 +437,13 @@
   List<LinkedExportName> get exportNames;
 
   /**
+   * Indicates whether this library was summarized in "fallback mode".  If
+   * true, all other fields in the data structure have their default values.
+   */
+  @Id(5)
+  bool get fallbackMode;
+
+  /**
    * For each import in [UnlinkedUnit.imports], an index into [dependencies]
    * of the library being imported.
    */
@@ -860,6 +867,7 @@
   /**
    * Code range of the class.
    */
+  @informative
   @Id(13)
   CodeRange get codeRange;
 
@@ -1416,6 +1424,7 @@
   /**
    * Code range of the enum.
    */
+  @informative
   @Id(5)
   CodeRange get codeRange;
 
@@ -1488,6 +1497,7 @@
   /**
    * Code range of the executable.
    */
+  @informative
   @Id(26)
   CodeRange get codeRange;
 
@@ -1877,6 +1887,7 @@
   /**
    * Code range of the parameter.
    */
+  @informative
   @Id(14)
   CodeRange get codeRange;
 
@@ -2133,6 +2144,7 @@
   /**
    * Code range of the typedef.
    */
+  @informative
   @Id(7)
   CodeRange get codeRange;
 
@@ -2196,6 +2208,7 @@
   /**
    * Code range of the type parameter.
    */
+  @informative
   @Id(4)
   CodeRange get codeRange;
 
@@ -2230,6 +2243,7 @@
   /**
    * Code range of the unit.
    */
+  @informative
   @Id(15)
   CodeRange get codeRange;
 
@@ -2253,6 +2267,16 @@
   List<UnlinkedExportNonPublic> get exports;
 
   /**
+   * If this compilation unit was summarized in fallback mode, the path where
+   * the compilation unit may be found on disk.  Otherwise empty.
+   *
+   * When this field is non-empty, all other fields in the data structure have
+   * their default values.
+   */
+  @Id(16)
+  String get fallbackModePath;
+
+  /**
    * Import declarations in the compilation unit.
    */
   @Id(5)
@@ -2344,6 +2368,7 @@
   /**
    * Code range of the variable.
    */
+  @informative
   @Id(14)
   CodeRange get codeRange;
 
diff --git a/pkg/analyzer/lib/src/summary/index_unit.dart b/pkg/analyzer/lib/src/summary/index_unit.dart
index b239d5c..610fba4 100644
--- a/pkg/analyzer/lib/src/summary/index_unit.dart
+++ b/pkg/analyzer/lib/src/summary/index_unit.dart
@@ -13,11 +13,6 @@
 import 'package:analyzer/src/summary/idl.dart';
 
 /**
- * TODO(scheglov) add to the `meta` package.
- */
-const visibleForTesting = const Object();
-
-/**
  * Information about an element referenced in index.
  */
 class ElementInfo {
@@ -90,7 +85,7 @@
 
   /**
    * Assemble a new [PackageIndexBuilder] using the information gathered by
-   * [index].
+   * [indexDeclarations] or [indexUnit].
    */
   PackageIndexBuilder assemble() {
     // sort strings end set IDs
@@ -120,9 +115,19 @@
   }
 
   /**
+   * Index declarations in the given partially resolved [unit].
+   */
+  void indexDeclarations(CompilationUnit unit) {
+    int unitId = _getUnitId(unit.element);
+    _UnitIndexAssembler assembler = new _UnitIndexAssembler(this, unitId);
+    _units.add(assembler);
+    unit.accept(new _IndexDeclarationContributor(assembler));
+  }
+
+  /**
    * Index the given fully resolved [unit].
    */
-  void index(CompilationUnit unit) {
+  void indexUnit(CompilationUnit unit) {
     int unitId = _getUnitId(unit.element);
     _UnitIndexAssembler assembler = new _UnitIndexAssembler(this, unitId);
     _units.add(assembler);
@@ -291,26 +296,8 @@
 /**
  * Visits a resolved AST and adds relationships into [_UnitIndexAssembler].
  */
-class _IndexContributor extends GeneralizingAstVisitor {
-  final _UnitIndexAssembler assembler;
-
-  _IndexContributor(this.assembler);
-
-  /**
-   * Record definition of the given [element].
-   */
-  void recordDefinedElement(Element element) {
-    if (element != null) {
-      String name = element.displayName;
-      int offset = element.nameOffset;
-      Element enclosing = element.enclosingElement;
-      if (enclosing is CompilationUnitElement) {
-        assembler.defineName(name, IndexNameKind.topLevel, offset);
-      } else if (enclosing is ClassElement) {
-        assembler.defineName(name, IndexNameKind.classMember, offset);
-      }
-    }
-  }
+class _IndexContributor extends _IndexDeclarationContributor {
+  _IndexContributor(_UnitIndexAssembler assembler) : super(assembler);
 
   void recordIsAncestorOf(Element descendant) {
     _recordIsAncestorOf(descendant, descendant, false, <ClassElement>[]);
@@ -566,12 +553,13 @@
 
   @override
   visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.bestElement;
     // name in declaration
     if (node.inDeclarationContext()) {
+      Element element = node.staticElement;
       recordDefinedElement(element);
       return;
     }
+    Element element = node.bestElement;
     // record unresolved name reference
     bool isQualified = _isQualified(node);
     if (element == null) {
@@ -704,6 +692,40 @@
 }
 
 /**
+ * Visits a resolved AST and adds relationships into [_UnitIndexAssembler].
+ */
+class _IndexDeclarationContributor extends GeneralizingAstVisitor {
+  final _UnitIndexAssembler assembler;
+
+  _IndexDeclarationContributor(this.assembler);
+
+  /**
+   * Record definition of the given [element].
+   */
+  void recordDefinedElement(Element element) {
+    if (element != null) {
+      String name = element.displayName;
+      int offset = element.nameOffset;
+      Element enclosing = element.enclosingElement;
+      if (enclosing is CompilationUnitElement) {
+        assembler.defineName(name, IndexNameKind.topLevel, offset);
+      } else if (enclosing is ClassElement) {
+        assembler.defineName(name, IndexNameKind.classMember, offset);
+      }
+    }
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      Element element = node.staticElement;
+      recordDefinedElement(element);
+      return;
+    }
+  }
+}
+
+/**
  * Information about a single name relation.  Any [_NameRelationInfo] is always
  * part of a [_UnitIndexAssembler], so [offset] should be understood within the
  * context of the compilation unit pointed to by the [_UnitIndexAssembler].
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
new file mode 100644
index 0000000..279bd78
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -0,0 +1,1612 @@
+// 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.
+
+/**
+ * This library is capable of producing linked summaries from unlinked
+ * ones (or prelinked ones).  It functions by building a miniature
+ * element model to represent the contents of the summaries, and then
+ * scanning the element model to gather linked information and adding
+ * it to the summary data structures.
+ *
+ * The reason we use a miniature element model to do the linking
+ * (rather than resynthesizing the full element model from the
+ * summaries) is that it is expected that we will only need to
+ * traverse a small subset of the element properties in order to link.
+ * Resynthesizing only those properties that we need should save
+ * substantial CPU time.
+ *
+ * The element model implements the same interfaces as the full
+ * element model, so we can re-use code elsewhere in the analysis
+ * engine to do the linking.  However, only a small subset of the
+ * methods and getters defined in the full element model are
+ * implemented here.  To avoid static warnings, each element model
+ * class contains an implementation of `noSuchMethod`.
+ *
+ * The miniature element model follows the following design
+ * principles:
+ *
+ * - With few exceptions, resynthesis is done incrementally on demand,
+ *   so that we don't pay the cost of resynthesizing elements (or
+ *   properties of elements) that aren't referenced from a part of the
+ *   element model that is relevant to linking.
+ *
+ * - Computation of values in the miniature element model is similar
+ *   to the task model, but much lighter weight.  Instead of declaring
+ *   tasks and their relationships using classes, each task is simply
+ *   a method (frequently a getter) that computes a value.  Instead of
+ *   using a general purpose cache, values are cached by the methods
+ *   themselves in private fields (with `null` typically representing
+ *   "not yet cached").
+ *
+ * - No attempt is made to detect cyclic dependencies due to bugs in
+ *   the analyzer.  This saves time because dependency evaluation
+ *   doesn't have to be a separate step from evaluating a value; we
+ *   can simply call the getter.
+ *
+ * - However, for cases where cyclic dependencies may occur in the
+ *   absence of analyzer bugs (e.g. because of errors in the code
+ *   being analyzed, or cycles between top level and static variables
+ *   undergoing type inference), we do precompute dependencies, and we
+ *   use Tarjan's strongly connected components algorithm to detect
+ *   cycles.
+ *
+ * - As much as possible, bookkeeping data is pointed to directly by
+ *   the element objects, rather than being stored in maps.
+ *
+ * - Where possible, we favor method dispatch instead of "is" and "as"
+ *   checks.  E.g. see [ReferenceableElementForLink.asConstructor].
+ */
+
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/prelink.dart';
+
+/**
+ * Link together the build unit consisting of [libraryUris], using
+ * [getDependency] to fetch the [LinkedLibrary] objects from other
+ * build units, and [getUnit] to fetch the [UnlinkedUnit] objects from
+ * both this build unit and other build units.
+ *
+ * A map is returned whose keys are the URIs of the libraries in this
+ * build unit, and whose values are the corresponding
+ * [LinkedLibraryBuilder]s.
+ */
+Map<String, LinkedLibraryBuilder> link(Set<String> libraryUris,
+    GetDependencyCallback getDependency, GetUnitCallback getUnit) {
+  Map<String, LinkedLibraryBuilder> linkedLibraries =
+      <String, LinkedLibraryBuilder>{};
+  for (String absoluteUri in libraryUris) {
+    Uri uri = Uri.parse(absoluteUri);
+    UnlinkedUnit getRelativeUnit(String relativeUri) =>
+        getUnit(resolveRelativeUri(uri, Uri.parse(relativeUri)).toString());
+    linkedLibraries[absoluteUri] = prelink(
+        getUnit(absoluteUri),
+        getRelativeUnit,
+        (String relativeUri) => getRelativeUnit(relativeUri)?.publicNamespace);
+  }
+  relink(linkedLibraries, getDependency, getUnit);
+  return linkedLibraries;
+}
+
+/**
+ * Given [libraries] (a map from URI to [LinkedLibraryBuilder]
+ * containing correct prelinked information), rebuild linked
+ * information, using [getDependency] to fetch the [LinkedLibrary]
+ * objects from other build units, and [getUnit] to fetch the
+ * [UnlinkedUnit] objects from both this build unit and other build
+ * units.
+ */
+void relink(Map<String, LinkedLibraryBuilder> libraries,
+    GetDependencyCallback getDependency, GetUnitCallback getUnit) {
+  new _Linker(libraries, getDependency, getUnit).link();
+}
+
+/**
+ * Type of the callback used by [link] and [relink] to request
+ * [LinkedLibrary] objects from other build units.
+ */
+typedef LinkedLibrary GetDependencyCallback(String absoluteUri);
+
+/**
+ * Type of the callback used by [link] and [relink] to request
+ * [UnlinkedUnit] objects.
+ */
+typedef UnlinkedUnit GetUnitCallback(String absoluteUri);
+
+/**
+ * Element representing a class or enum resynthesized from a summary
+ * during linking.
+ */
+abstract class ClassElementForLink
+    implements ClassElement, ReferenceableElementForLink {
+  Map<String, ReferenceableElementForLink> _containedNames;
+
+  @override
+  ConstructorElementForLink get asConstructor => unnamedConstructor;
+
+  @override
+  ConstVariableNode get asConstVariable {
+    // When a class name is used as a constant variable, it doesn't depend on
+    // anything, so it is not necessary to include it in the constant
+    // dependency graph.
+    return null;
+  }
+
+  @override
+  List<ConstructorElementForLink> get constructors;
+
+  @override
+  List<FieldElementForLink> get fields;
+
+  /**
+   * Indicates whether this is the core class `Object`.
+   */
+  bool get isObject;
+
+  @override
+  String get name;
+
+  @override
+  ConstructorElementForLink get unnamedConstructor;
+
+  @override
+  ReferenceableElementForLink getContainedName(String name) {
+    if (_containedNames == null) {
+      _containedNames = <String, ReferenceableElementForLink>{};
+      // TODO(paulberry): what's the correct way to handle name conflicts?
+      for (ConstructorElementForLink constructor in constructors) {
+        _containedNames[constructor.name] = constructor;
+      }
+      for (FieldElementForLink field in fields) {
+        // TODO(paulberry): do we need to handle nonstatic fields for
+        // consistent behavior with erroneous code?
+        if (field.isStatic) {
+          _containedNames[field.name] = field;
+        }
+      }
+      // TODO(paulberry): add methods.
+    }
+    return _containedNames.putIfAbsent(
+        name, () => UndefinedElementForLink.instance);
+  }
+
+  /**
+   * Perform type inference and cycle detection on this class and
+   * store the resulting information in the enclosing elements.
+   */
+  void link(LinkedUnitBuilder linkedUnit);
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * Element representing a class resynthesized from a summary during
+ * linking.
+ */
+class ClassElementForLink_Class extends ClassElementForLink
+    implements TypeParameterContext {
+  /**
+   * The unlinked representation of the class in the summary.
+   */
+  final UnlinkedClass _unlinkedClass;
+
+  @override
+  final CompilationUnitElementForLink enclosingElement;
+
+  List<ConstructorElementForLink> _constructors;
+  ConstructorElementForLink _unnamedConstructor;
+  bool _unnamedConstructorComputed = false;
+  List<FieldElementForLink_ClassField> _fields;
+  InterfaceType _supertype;
+  InterfaceType _type;
+  List<TypeParameterType> _typeParameterTypes;
+
+  ClassElementForLink_Class(this.enclosingElement, this._unlinkedClass);
+
+  @override
+  List<ConstructorElementForLink> get constructors {
+    if (_constructors == null) {
+      _constructors = <ConstructorElementForLink>[];
+      for (UnlinkedExecutable unlinkedExecutable
+          in _unlinkedClass.executables) {
+        if (unlinkedExecutable.kind == UnlinkedExecutableKind.constructor) {
+          _constructors
+              .add(new ConstructorElementForLink(this, unlinkedExecutable));
+        }
+      }
+    }
+    return _constructors;
+  }
+
+  @override
+  String get displayName => _unlinkedClass.name;
+
+  @override
+  List<FieldElementForLink_ClassField> get fields {
+    if (_fields == null) {
+      _fields = <FieldElementForLink_ClassField>[];
+      for (UnlinkedVariable field in _unlinkedClass.fields) {
+        _fields.add(new FieldElementForLink_ClassField(this, field));
+      }
+    }
+    return _fields;
+  }
+
+  @override
+  bool get isObject => _unlinkedClass.hasNoSupertype;
+
+  @override
+  String get name => _unlinkedClass.name;
+
+  @override
+  InterfaceType get supertype {
+    if (isObject) {
+      return null;
+    }
+    return _supertype ??= _computeSupertype();
+  }
+
+  /**
+   * Get a list of [TypeParameterType] objects corresponding to the
+   * class's type parameters.
+   */
+  List<TypeParameterType> get typeParameterTypes {
+    if (_typeParameterTypes == null) {
+      _typeParameterTypes = _unlinkedClass.typeParameters
+          .map((UnlinkedTypeParam p) =>
+              new TypeParameterTypeImpl(new TypeParameterElementForLink(p)))
+          .toList();
+    }
+    return _typeParameterTypes;
+  }
+
+  @override
+  ConstructorElementForLink get unnamedConstructor {
+    if (!_unnamedConstructorComputed) {
+      for (ConstructorElementForLink constructor in constructors) {
+        if (constructor.name.isEmpty) {
+          _unnamedConstructor = constructor;
+          break;
+        }
+      }
+      _unnamedConstructorComputed = true;
+    }
+    return _unnamedConstructor;
+  }
+
+  @override
+  DartType buildType(
+      DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
+    int numTypeParameters = _unlinkedClass.typeParameters.length;
+    if (numTypeParameters != 0) {
+      return new InterfaceTypeImpl(this);
+    } else {
+      if (_type == null) {
+        List<DartType> typeArguments = new List<DartType>(numTypeParameters);
+        for (int i = 0; i < numTypeParameters; i++) {
+          typeArguments[i] = getTypeArgument(i);
+        }
+        _type = new InterfaceTypeImpl.elementWithNameAndArgs(
+            this, name, typeArguments);
+      }
+      return _type;
+    }
+  }
+
+  @override
+  TypeParameterType getTypeParameterType(int index) {
+    List<TypeParameterType> types = typeParameterTypes;
+    return types[types.length - index];
+  }
+
+  @override
+  void link(LinkedUnitBuilder linkedUnit) {
+    for (ConstructorElementForLink constructorElement in constructors) {
+      constructorElement.link(linkedUnit);
+    }
+  }
+
+  InterfaceType _computeSupertype() {
+    if (_unlinkedClass.supertype != null) {
+      DartType supertype =
+          enclosingElement._resolveTypeRef(_unlinkedClass.supertype, this);
+      if (supertype is InterfaceType) {
+        return supertype;
+      }
+      // In the event that the supertype isn't an interface type (which may
+      // happen in the event of erroneous code) just fall through and pretend
+      // the supertype is `Object`.
+    }
+    return enclosingElement.enclosingElement._linker.objectType;
+  }
+}
+
+/**
+ * Element representing an enum resynthesized from a summary during
+ * linking.
+ */
+class ClassElementForLink_Enum extends ClassElementForLink {
+  /**
+   * The unlinked representation of the enum in the summary.
+   */
+  final UnlinkedEnum _unlinkedEnum;
+
+  InterfaceType _type;
+  List<FieldElementForLink_EnumField> _fields;
+
+  ClassElementForLink_Enum(this._unlinkedEnum);
+
+  @override
+  List<ConstructorElementForLink> get constructors => const [];
+
+  @override
+  String get displayName => _unlinkedEnum.name;
+
+  @override
+  List<FieldElementForLink_EnumField> get fields {
+    if (_fields == null) {
+      _fields = <FieldElementForLink_EnumField>[];
+      _fields.add(new FieldElementForLink_EnumField(null));
+      for (UnlinkedEnumValue value in _unlinkedEnum.values) {
+        _fields.add(new FieldElementForLink_EnumField(value));
+      }
+    }
+    return _fields;
+  }
+
+  @override
+  bool get isObject => false;
+
+  @override
+  String get name => _unlinkedEnum.name;
+
+  @override
+  ConstructorElementForLink get unnamedConstructor => null;
+
+  @override
+  DartType buildType(DartType getTypeArgument(int i),
+          List<int> implicitFunctionTypeIndices) =>
+      _type ??= new InterfaceTypeImpl(this);
+
+  @override
+  void link(LinkedUnitBuilder linkedUnit) {}
+}
+
+/**
+ * Element representing a compilation unit resynthesized from a
+ * summary during linking.
+ */
+abstract class CompilationUnitElementForLink implements CompilationUnitElement {
+  /**
+   * The unlinked representation of the compilation unit in the
+   * summary.
+   */
+  final UnlinkedUnit _unlinkedUnit;
+
+  /**
+   * For each entry in [UnlinkedUnit.references], the element referred
+   * to by the reference, or `null` if it hasn't been located yet.
+   */
+  final List<ReferenceableElementForLink> _references;
+
+  List<ClassElementForLink_Class> _types;
+  Map<String, ReferenceableElementForLink> _containedNames;
+  List<TopLevelVariableElementForLink> _topLevelVariables;
+  List<ClassElementForLink_Enum> _enums;
+
+  @override
+  final LibraryElementForLink enclosingElement;
+
+  CompilationUnitElementForLink(
+      this.enclosingElement, UnlinkedUnit unlinkedUnit)
+      : _references = new List<ReferenceableElementForLink>(
+            unlinkedUnit.references.length),
+        _unlinkedUnit = unlinkedUnit;
+
+  @override
+  List<ClassElementForLink_Enum> get enums {
+    if (_enums == null) {
+      _enums = <ClassElementForLink_Enum>[];
+      for (UnlinkedEnum unlinkedEnum in _unlinkedUnit.enums) {
+        _enums.add(new ClassElementForLink_Enum(unlinkedEnum));
+      }
+    }
+    return _enums;
+  }
+
+  /**
+   * Indicates whether this compilation element is part of the build unit
+   * currently being linked.
+   */
+  bool get isInBuildUnit;
+
+  @override
+  List<TopLevelVariableElementForLink> get topLevelVariables {
+    if (_topLevelVariables == null) {
+      _topLevelVariables = <TopLevelVariableElementForLink>[];
+      for (UnlinkedVariable unlinkedVariable in _unlinkedUnit.variables) {
+        _topLevelVariables
+            .add(new TopLevelVariableElementForLink(this, unlinkedVariable));
+      }
+    }
+    return _topLevelVariables;
+  }
+
+  @override
+  List<ClassElementForLink_Class> get types {
+    if (_types == null) {
+      _types = <ClassElementForLink_Class>[];
+      for (UnlinkedClass unlinkedClass in _unlinkedUnit.classes) {
+        _types.add(new ClassElementForLink_Class(this, unlinkedClass));
+      }
+    }
+    return _types;
+  }
+
+  /**
+   * The linked representation of the compilation unit in the summary.
+   */
+  LinkedUnit get _linkedUnit;
+
+  /**
+   * Search the unit for a top level element with the given [name].
+   * If no name is found, return the singleton instance of
+   * [UndefinedElementForLink].
+   */
+  ReferenceableElementForLink getContainedName(name) {
+    if (_containedNames == null) {
+      _containedNames = <String, ReferenceableElementForLink>{};
+      // TODO(paulberry): what's the correct way to handle name conflicts?
+      for (ClassElementForLink_Class type in types) {
+        _containedNames[type.name] = type;
+      }
+      for (ClassElementForLink_Enum enm in enums) {
+        _containedNames[enm.name] = enm;
+      }
+      for (TopLevelVariableElementForLink variable in topLevelVariables) {
+        _containedNames[variable.name] = variable;
+      }
+      // TODO(paulberry): fill in other top level entities (typedefs
+      // and executables).
+    }
+    return _containedNames.putIfAbsent(
+        name, () => UndefinedElementForLink.instance);
+  }
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  /**
+   * Return the element referred to by the given [index] in
+   * [UnlinkedUnit.references].  If the reference is unresolved,
+   * return [UndefinedElementForLink.instance].
+   */
+  ReferenceableElementForLink _resolveRef(int index) {
+    if (_references[index] == null) {
+      UnlinkedReference unlinkedReference = _unlinkedUnit.references[index];
+      LinkedReference linkedReference = _linkedUnit.references[index];
+      String name = unlinkedReference.name;
+      int containingReference = unlinkedReference.prefixReference;
+      if (containingReference != 0 &&
+          _linkedUnit.references[containingReference].kind !=
+              ReferenceKind.prefix) {
+        _references[index] =
+            _resolveRef(containingReference).getContainedName(name);
+      } else if (linkedReference.dependency == 0) {
+        _references[index] = enclosingElement.getContainedName(name);
+      } else {
+        LibraryElementForLink dependency =
+            enclosingElement._getDependency(linkedReference.dependency);
+        _references[index] = dependency.getContainedName(name);
+      }
+    }
+    return _references[index];
+  }
+
+  /**
+   * Resolve an [EntityRef] into a type.  If the reference is
+   * unresolved, return [DynamicTypeImpl.instance].
+   *
+   * TODO(paulberry): or should we have a class representing an
+   * unresolved type, for consistency with the full element model?
+   */
+  DartType _resolveTypeRef(
+      EntityRef type, TypeParameterContext typeParameterContext,
+      {bool defaultVoid: false}) {
+    if (type == null) {
+      if (defaultVoid) {
+        return VoidTypeImpl.instance;
+      } else {
+        return DynamicTypeImpl.instance;
+      }
+    }
+    if (type.paramReference != 0) {
+      return typeParameterContext.getTypeParameterType(type.paramReference);
+    } else if (type.syntheticReturnType != null) {
+      // TODO(paulberry): implement.
+      throw new UnimplementedError();
+    } else {
+      DartType getTypeArgument(int i) {
+        if (i < type.typeArguments.length) {
+          return _resolveTypeRef(type.typeArguments[i], typeParameterContext);
+        } else {
+          return DynamicTypeImpl.instance;
+        }
+      }
+      ReferenceableElementForLink element = _resolveRef(type.reference);
+      return element.buildType(
+          getTypeArgument, type.implicitFunctionTypeIndices);
+    }
+  }
+}
+
+/**
+ * Element representing a compilation unit which is part of the build
+ * unit being linked.
+ */
+class CompilationUnitElementInBuildUnit extends CompilationUnitElementForLink {
+  @override
+  final LinkedUnitBuilder _linkedUnit;
+
+  CompilationUnitElementInBuildUnit(LibraryElementInBuildUnit libraryElement,
+      UnlinkedUnit unlinkedUnit, this._linkedUnit)
+      : super(libraryElement, unlinkedUnit);
+
+  @override
+  bool get isInBuildUnit => true;
+
+  /**
+   * Perform type inference and const cycle detection on this
+   * compilation unit.
+   */
+  void link() {
+    for (ClassElementForLink classElement in types) {
+      classElement.link(_linkedUnit);
+    }
+  }
+
+  /**
+   * Throw away any information produced by a previous call to [link].
+   */
+  void unlink() {
+    _linkedUnit.constCycles.clear();
+    _linkedUnit.references.length = _unlinkedUnit.references.length;
+    _linkedUnit.types.clear();
+  }
+}
+
+/**
+ * Element representing a compilation unit which is depended upon
+ * (either directly or indirectly) by the build unit being linked.
+ */
+class CompilationUnitElementInDependency extends CompilationUnitElementForLink {
+  @override
+  final LinkedUnit _linkedUnit;
+
+  CompilationUnitElementInDependency(LibraryElementInDependency libraryElement,
+      UnlinkedUnit unlinkedUnit, this._linkedUnit)
+      : super(libraryElement, unlinkedUnit);
+
+  @override
+  bool get isInBuildUnit => false;
+}
+
+/**
+ * Instance of [ConstNode] representing a constant constructor.
+ */
+class ConstConstructorNode extends ConstNode {
+  /**
+   * The [ConstructorElement] to which this node refers.
+   */
+  final ConstructorElementForLink constructorElement;
+
+  /**
+   * Once this node has been evaluated, indicates whether the
+   * constructor is free of constant evaluation cycles.
+   */
+  bool isCycleFree = false;
+
+  ConstConstructorNode(this.constructorElement);
+
+  @override
+  List<ConstNode> computeDependencies() {
+    List<ConstNode> dependencies = <ConstNode>[];
+    void safeAddDependency(ConstNode target) {
+      if (target != null) {
+        dependencies.add(target);
+      }
+    }
+    UnlinkedExecutable unlinkedExecutable =
+        constructorElement._unlinkedExecutable;
+    ClassElementForLink_Class enclosingClass =
+        constructorElement.enclosingElement;
+    ConstructorElementForLink redirectedConstructor =
+        _getFactoryRedirectedConstructor();
+    if (redirectedConstructor != null) {
+      if (redirectedConstructor._constNode != null) {
+        safeAddDependency(redirectedConstructor._constNode);
+      }
+    } else if (unlinkedExecutable.isFactory) {
+      // Factory constructor, but getConstRedirectedConstructor returned
+      // null.  This can happen if we're visiting one of the special external
+      // const factory constructors in the SDK, or if the code contains
+      // errors (such as delegating to a non-const constructor, or delegating
+      // to a constructor that can't be resolved).  In any of these cases,
+      // we'll evaluate calls to this constructor without having to refer to
+      // any other constants.  So we don't need to report any dependencies.
+    } else {
+      ClassElementForLink superClass = enclosingClass.supertype?.element;
+      bool defaultSuperInvocationNeeded = true;
+      for (UnlinkedConstructorInitializer constructorInitializer
+          in constructorElement._unlinkedExecutable.constantInitializers) {
+        if (constructorInitializer.kind ==
+            UnlinkedConstructorInitializerKind.superInvocation) {
+          defaultSuperInvocationNeeded = false;
+          if (superClass != null && !superClass.isObject) {
+            ConstructorElementForLink constructor = superClass
+                .getContainedName(constructorInitializer.name)
+                .asConstructor;
+            safeAddDependency(constructor?._constNode);
+          }
+        } else if (constructorInitializer.kind ==
+            UnlinkedConstructorInitializerKind.thisInvocation) {
+          defaultSuperInvocationNeeded = false;
+          ConstructorElementForLink constructor = constructorElement
+              .enclosingElement
+              .getContainedName(constructorInitializer.name)
+              .asConstructor;
+          safeAddDependency(constructor?._constNode);
+        }
+        CompilationUnitElementForLink compilationUnit =
+            constructorElement.enclosingElement.enclosingElement;
+        collectDependencies(
+            dependencies, constructorInitializer.expression, compilationUnit);
+        for (UnlinkedConst unlinkedConst in constructorInitializer.arguments) {
+          collectDependencies(dependencies, unlinkedConst, compilationUnit);
+        }
+      }
+
+      if (defaultSuperInvocationNeeded) {
+        // No explicit superconstructor invocation found, so we need to
+        // manually insert a reference to the implicit superconstructor.
+        if (superClass != null && !superClass.isObject) {
+          ConstructorElementForLink unnamedConstructor =
+              superClass.unnamedConstructor;
+          safeAddDependency(unnamedConstructor?._constNode);
+        }
+      }
+      for (FieldElementForLink field in enclosingClass.fields) {
+        // Note: non-static const isn't allowed but we handle it anyway so
+        // that we won't be confused by incorrect code.
+        if ((field.isFinal || field.isConst) && !field.isStatic) {
+          safeAddDependency(field.asConstVariable);
+        }
+      }
+      for (ParameterElementForLink parameterElement
+          in constructorElement.parameters) {
+        safeAddDependency(parameterElement._constNode);
+      }
+    }
+    return dependencies;
+  }
+
+  /**
+   * If [constructorElement] redirects to another constructor via a factory
+   * redirect, return the constructor it redirects to.
+   */
+  ConstructorElementForLink _getFactoryRedirectedConstructor() {
+    EntityRef redirectedConstructor =
+        constructorElement._unlinkedExecutable.redirectedConstructor;
+    if (redirectedConstructor != null) {
+      return constructorElement.enclosingElement.enclosingElement
+          ._resolveRef(redirectedConstructor.reference)
+          .asConstructor;
+    } else {
+      return null;
+    }
+  }
+}
+
+/**
+ * Specialization of [DependencyWalker] for detecting constant
+ * evaluation cycles.
+ */
+class ConstDependencyWalker extends DependencyWalker<ConstNode> {
+  @override
+  void evaluate(ConstNode v) {
+    if (v is ConstConstructorNode) {
+      v.isCycleFree = true;
+    }
+    v.isEvaluated = true;
+  }
+
+  @override
+  void evaluateScc(List<ConstNode> scc) {
+    for (ConstNode v in scc) {
+      if (v is ConstConstructorNode) {
+        v.isCycleFree = false;
+      }
+      v.isEvaluated = true;
+    }
+  }
+}
+
+/**
+ * Specialization of [Node] used to construct the constant evaluation
+ * dependency graph.
+ */
+abstract class ConstNode extends Node<ConstNode> {
+  @override
+  bool isEvaluated = false;
+
+  /**
+   * Collect the dependencies in [unlinkedConst] (which should be
+   * interpreted relative to [compilationUnit]) and store them in
+   * [dependencies].
+   */
+  void collectDependencies(
+      List<ConstNode> dependencies,
+      UnlinkedConst unlinkedConst,
+      CompilationUnitElementForLink compilationUnit) {
+    if (unlinkedConst == null) {
+      return;
+    }
+    int refPtr = 0;
+    for (UnlinkedConstOperation operation in unlinkedConst.operations) {
+      switch (operation) {
+        case UnlinkedConstOperation.pushReference:
+          EntityRef ref = unlinkedConst.references[refPtr++];
+          ConstVariableNode variable =
+              compilationUnit._resolveRef(ref.reference).asConstVariable;
+          if (variable != null) {
+            dependencies.add(variable);
+          }
+          break;
+        case UnlinkedConstOperation.makeTypedList:
+          refPtr++;
+          break;
+        case UnlinkedConstOperation.makeTypedMap:
+          refPtr += 2;
+          break;
+        case UnlinkedConstOperation.invokeConstructor:
+          EntityRef ref = unlinkedConst.references[refPtr++];
+          ConstructorElementForLink element =
+              compilationUnit._resolveRef(ref.reference).asConstructor;
+          if (element?._constNode != null) {
+            dependencies.add(element._constNode);
+          }
+          break;
+        default:
+          break;
+      }
+    }
+    assert(refPtr == unlinkedConst.references.length);
+  }
+}
+
+/**
+ * Instance of [ConstNode] representing a parameter with a default
+ * value.
+ */
+class ConstParameterNode extends ConstNode {
+  /**
+   * The [ParameterElement] to which this node refers.
+   */
+  final ParameterElementForLink parameterElement;
+
+  ConstParameterNode(this.parameterElement);
+
+  @override
+  List<ConstNode> computeDependencies() {
+    List<ConstNode> dependencies = <ConstNode>[];
+    collectDependencies(
+        dependencies,
+        parameterElement._unlinkedParam.defaultValue,
+        parameterElement.compilationUnit);
+    return dependencies;
+  }
+}
+
+/**
+ * Element representing a constructor resynthesized from a summary
+ * during linking.
+ */
+class ConstructorElementForLink
+    implements ConstructorElement, ReferenceableElementForLink {
+  /**
+   * The unlinked representation of the constructor in the summary.
+   */
+  final UnlinkedExecutable _unlinkedExecutable;
+
+  /**
+   * If this is a `const` constructor and the enclosing library is
+   * part of the build unit being linked, the constructor's node in
+   * the constant evaluation dependency graph.  Otherwise `null`.
+   */
+  ConstConstructorNode _constNode;
+
+  @override
+  final ClassElementForLink_Class enclosingElement;
+
+  List<ParameterElementForLink> _parameters;
+
+  ConstructorElementForLink(this.enclosingElement, this._unlinkedExecutable) {
+    if (enclosingElement.enclosingElement.isInBuildUnit &&
+        _unlinkedExecutable.constCycleSlot != 0) {
+      _constNode = new ConstConstructorNode(this);
+    }
+  }
+
+  @override
+  ConstructorElementForLink get asConstructor => this;
+
+  @override
+  ConstVariableNode get asConstVariable => null;
+
+  @override
+  bool get isCycleFree {
+    if (!_constNode.isEvaluated) {
+      new ConstDependencyWalker().walk(_constNode);
+    }
+    return _constNode.isCycleFree;
+  }
+
+  @override
+  String get name => _unlinkedExecutable.name;
+
+  @override
+  List<ParameterElementForLink> get parameters {
+    if (_parameters == null) {
+      _parameters = <ParameterElementForLink>[];
+      for (UnlinkedParam unlinkedParam in _unlinkedExecutable.parameters) {
+        _parameters.add(new ParameterElementForLink(
+            unlinkedParam, enclosingElement.enclosingElement));
+      }
+    }
+    return _parameters;
+  }
+
+  @override
+  DartType buildType(DartType getTypeArgument(int i),
+          List<int> implicitFunctionTypeIndices) =>
+      DynamicTypeImpl.instance;
+
+  @override
+  ReferenceableElementForLink getContainedName(String name) =>
+      UndefinedElementForLink.instance;
+
+  /**
+   * Perform const cycle detection on this constructor.
+   */
+  void link(LinkedUnitBuilder linkedUnit) {
+    if (_constNode != null && !isCycleFree) {
+      linkedUnit.constCycles.add(_unlinkedExecutable.constCycleSlot);
+    }
+  }
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * Instance of [ConstNode] representing a constant field or constant
+ * top level variable.
+ */
+class ConstVariableNode extends ConstNode {
+  /**
+   * The [FieldElement] or [TopLevelVariableElement] to which this
+   * node refers.
+   */
+  final VariableElementForLink variableElement;
+
+  ConstVariableNode(this.variableElement);
+
+  @override
+  List<ConstNode> computeDependencies() {
+    List<ConstNode> dependencies = <ConstNode>[];
+    collectDependencies(
+        dependencies,
+        variableElement.unlinkedVariable.constExpr,
+        variableElement.compilationUnit);
+    return dependencies;
+  }
+}
+
+/**
+ * An instance of [DependencyWalker] contains the core algorithms for
+ * walking a dependency graph and evaluating nodes in a safe order.
+ */
+abstract class DependencyWalker<NodeType extends Node<NodeType>> {
+  /**
+   * Called by [walk] to evaluate a single non-cyclical node, after
+   * all that node's dependencies have been evaluated.
+   */
+  void evaluate(NodeType v);
+
+  /**
+   * Called by [walk] to evaluate a strongly connected component
+   * containing one or more nodes.  All dependencies of the strongly
+   * connected component have been evaluated.
+   */
+  void evaluateScc(List<NodeType> scc);
+
+  /**
+   * Walk the dependency graph starting at [startingPoint], finding
+   * strongly connected components and evaluating them in a safe order
+   * by calling [evaluate] and [evaluateScc].
+   *
+   * This is an implementation of Tarjan's strongly connected
+   * components algorithm
+   * (https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm).
+   */
+  void walk(NodeType startingPoint) {
+    // TODO(paulberry): consider rewriting in a non-recursive way so
+    // that long dependency chains don't cause stack overflow.
+
+    // TODO(paulberry): in the event that an exception occurs during
+    // the walk, restore the state of the [Node] data structures so
+    // that further evaluation will be safe.
+
+    // The index which will be assigned to the next node that is
+    // freshly visited.
+    int index = 1;
+
+    // Stack of nodes which have been seen so far and whose strongly
+    // connected component is still being determined.  Nodes are only
+    // popped off the stack when they are evaluated, so sometimes the
+    // stack contains nodes that were visited after the current node.
+    List<NodeType> stack = <NodeType>[];
+
+    void strongConnect(NodeType node) {
+      bool hasTrivialCycle = false;
+
+      // Assign the current node an index and add it to the stack.  We
+      // haven't seen any of its dependencies yet, so set its lowLink
+      // to its index, indicating that so far it is the only node in
+      // its strongly connected component.
+      node.index = node.lowLink = index++;
+      stack.add(node);
+
+      // Consider the node's dependencies one at a time.
+      for (NodeType dependency in node.dependencies) {
+        // If the dependency has already been evaluated, it can't be
+        // part of this node's strongly connected component, so we can
+        // skip it.
+        if (dependency.isEvaluated) {
+          continue;
+        }
+        if (identical(node, dependency)) {
+          // If a node includes itself as a dependency, there is no need to
+          // explore the dependency further.
+          hasTrivialCycle = true;
+        } else if (dependency.index == 0) {
+          // The dependency hasn't been seen yet, so recurse on it.
+          strongConnect(dependency);
+          // If the dependency's lowLink refers to a node that was
+          // visited before the current node, that means that the
+          // current node, the dependency, and the node referred to by
+          // the dependency's lowLink are all part of the same
+          // strongly connected component, so we need to update the
+          // current node's lowLink accordingly.
+          if (dependency.lowLink < node.lowLink) {
+            node.lowLink = dependency.lowLink;
+          }
+        } else {
+          // The dependency has already been seen, so it is part of
+          // the current node's strongly connected component.  If it
+          // was visited earlier than the current node's lowLink, then
+          // it is a new addition to the current node's strongly
+          // connected component, so we need to update the current
+          // node's lowLink accordingly.
+          if (dependency.index < node.lowLink) {
+            node.lowLink = dependency.index;
+          }
+        }
+      }
+
+      // If the current node's lowLink is the same as its index, then
+      // we have finished visiting a strongly connected component, so
+      // pop the stack and evaluate it before moving on.
+      if (node.lowLink == node.index) {
+        // The strongly connected component has only one node.  If there is a
+        // cycle, it's a trivial one.
+        if (identical(stack.last, node)) {
+          stack.removeLast();
+          if (hasTrivialCycle) {
+            evaluateScc(<NodeType>[node]);
+          } else {
+            evaluate(node);
+          }
+        } else {
+          // There are multiple nodes in the strongly connected
+          // component.
+          List<NodeType> scc = <NodeType>[];
+          while (true) {
+            NodeType otherNode = stack.removeLast();
+            scc.add(otherNode);
+            if (identical(otherNode, node)) {
+              break;
+            }
+          }
+          evaluateScc(scc);
+        }
+      }
+    }
+
+    // Kick off the algorithm starting with the starting point.
+    strongConnect(startingPoint);
+  }
+}
+
+/**
+ * Element representing a field resynthesized from a summary during
+ * linking.
+ */
+abstract class FieldElementForLink
+    implements FieldElement, ReferenceableElementForLink {}
+
+/**
+ * Specialization of [FieldElementForLink] for class fields.
+ */
+class FieldElementForLink_ClassField extends VariableElementForLink
+    implements FieldElementForLink {
+  @override
+  final ClassElementForLink_Class enclosingElement;
+
+  FieldElementForLink_ClassField(ClassElementForLink_Class enclosingElement,
+      UnlinkedVariable unlinkedVariable)
+      : enclosingElement = enclosingElement,
+        super(unlinkedVariable, enclosingElement.enclosingElement);
+
+  @override
+  bool get isStatic => unlinkedVariable.isStatic;
+}
+
+/**
+ * Specialization of [FieldElementForLink] for enum fields.
+ */
+class FieldElementForLink_EnumField extends FieldElementForLink
+    implements FieldElement {
+  /**
+   * The unlinked representation of the field in the summary, or `null` if this
+   * is an enum's `values` field.
+   */
+  final UnlinkedEnumValue unlinkedEnumValue;
+
+  FieldElementForLink_EnumField(this.unlinkedEnumValue);
+
+  @override
+  ConstructorElementForLink get asConstructor => null;
+
+  @override
+  ConstVariableNode get asConstVariable {
+    // Even though enum fields are constants, there is no need to include them
+    // in the const dependency graph because they can't participate in a
+    // circularity.
+    return null;
+  }
+
+  @override
+  bool get isStatic => true;
+
+  @override
+  String get name =>
+      unlinkedEnumValue == null ? 'values' : unlinkedEnumValue.name;
+
+  @override
+  DartType buildType(DartType getTypeArgument(int i),
+          List<int> implicitFunctionTypeIndices) =>
+      DynamicTypeImpl.instance;
+
+  @override
+  ReferenceableElementForLink getContainedName(String name) =>
+      UndefinedElementForLink.instance;
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * Element representing a library resynthesied from a summary during
+ * linking.  The type parameter, [UnitElement], represents the type
+ * that will be used for the compilation unit elements.
+ */
+abstract class LibraryElementForLink<
+        UnitElement extends CompilationUnitElementForLink>
+    implements LibraryElement {
+  /**
+   * Pointer back to the linker.
+   */
+  final _Linker _linker;
+
+  /**
+   * The absolute URI of this library.
+   */
+  final Uri _absoluteUri;
+
+  List<UnitElement> _units;
+  final Map<String, ReferenceableElementForLink> _containedNames =
+      <String, ReferenceableElementForLink>{};
+  final List<LibraryElementForLink> _dependencies = <LibraryElementForLink>[];
+
+  LibraryElementForLink(this._linker, this._absoluteUri) {
+    _dependencies.length = _linkedLibrary.dependencies.length;
+  }
+
+  @override
+  List<UnitElement> get units {
+    if (_units == null) {
+      UnlinkedUnit definingUnit = _linker.getUnit(_absoluteUri.toString());
+      _units = <UnitElement>[_makeUnitElement(definingUnit, 0)];
+      int numParts = definingUnit.parts.length;
+      for (int i = 0; i < numParts; i++) {
+        // TODO(paulberry): make sure we handle the case where Uri.parse fails.
+        // TODO(paulberry): make sure we handle the case where
+        // resolveRelativeUri fails.
+        UnlinkedUnit partUnit = _linker.getUnit(resolveRelativeUri(
+                _absoluteUri, Uri.parse(definingUnit.publicNamespace.parts[i]))
+            .toString());
+        _units.add(
+            _makeUnitElement(partUnit ?? new UnlinkedUnitBuilder(), i + 1));
+      }
+    }
+    return _units;
+  }
+
+  /**
+   * The linked representation of the library in the summary.
+   */
+  LinkedLibrary get _linkedLibrary;
+
+  /**
+   * Search all the units for a top level element with the given
+   * [name].  If no name is found, return the singleton instance of
+   * [UndefinedElementForLink].
+   */
+  ReferenceableElementForLink getContainedName(name) =>
+      _containedNames.putIfAbsent(name, () {
+        for (UnitElement unit in units) {
+          ReferenceableElementForLink element = unit.getContainedName(name);
+          if (!identical(element, UndefinedElementForLink.instance)) {
+            return element;
+          }
+        }
+        return UndefinedElementForLink.instance;
+      });
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  /**
+   * Return the [LibraryElement] corresponding to the given dependency [index].
+   */
+  LibraryElementForLink _getDependency(int index) {
+    return _dependencies[index] ??= _linker.getLibrary(resolveRelativeUri(
+        _absoluteUri, Uri.parse(_linkedLibrary.dependencies[index].uri)));
+  }
+
+  /**
+   * Create a [UnitElement] for one of the library's compilation
+   * units.
+   */
+  UnitElement _makeUnitElement(UnlinkedUnit unlinkedUnit, int i);
+}
+
+/**
+ * Element representing a library which is part of the build unit
+ * being linked.
+ */
+class LibraryElementInBuildUnit
+    extends LibraryElementForLink<CompilationUnitElementInBuildUnit> {
+  @override
+  final LinkedLibraryBuilder _linkedLibrary;
+
+  LibraryElementInBuildUnit(
+      _Linker linker, Uri absoluteUri, this._linkedLibrary)
+      : super(linker, absoluteUri);
+
+  /**
+   * Perform type inference and const cycle detection on this library.
+   */
+  void link() {
+    for (CompilationUnitElementInBuildUnit unit in units) {
+      unit.link();
+    }
+  }
+
+  /**
+   * Throw away any information produced by a previous call to [link].
+   */
+  void unlink() {
+    _linkedLibrary.dependencies.length =
+        _linkedLibrary.numPrelinkedDependencies;
+    for (CompilationUnitElementInBuildUnit unit in units) {
+      unit.link();
+    }
+  }
+
+  @override
+  CompilationUnitElementInBuildUnit _makeUnitElement(
+          UnlinkedUnit unlinkedUnit, int i) =>
+      new CompilationUnitElementInBuildUnit(
+          this, unlinkedUnit, _linkedLibrary.units[i]);
+}
+
+/**
+ * Element representing a library which is depended upon (either
+ * directly or indirectly) by the build unit being linked.
+ */
+class LibraryElementInDependency
+    extends LibraryElementForLink<CompilationUnitElementInDependency> {
+  @override
+  final LinkedLibrary _linkedLibrary;
+
+  LibraryElementInDependency(
+      _Linker linker, Uri absoluteUri, this._linkedLibrary)
+      : super(linker, absoluteUri);
+
+  @override
+  CompilationUnitElementInDependency _makeUnitElement(
+          UnlinkedUnit unlinkedUnit, int i) =>
+      new CompilationUnitElementInDependency(
+          this, unlinkedUnit, _linkedLibrary.units[i]);
+}
+
+/**
+ * Instances of [Node] represent nodes in a dependency graph.  The
+ * type parameter, [NodeType], is the derived type (this affords some
+ * extra type safety by making it difficult to accidentally construct
+ * bridges between unrelated dependency graphs).
+ */
+abstract class Node<NodeType> {
+  /**
+   * Index used by Tarjan's strongly connected components algorithm.
+   * Zero means the node has not been visited yet; a nonzero value
+   * counts the order in which the node was visited.
+   */
+  int index = 0;
+
+  /**
+   * Low link used by Tarjan's strongly connected components
+   * algorithm.  This represents the smallest [index] of all the nodes
+   * in the strongly connected component to which this node belongs.
+   */
+  int lowLink = 0;
+
+  List<NodeType> _dependencies;
+
+  /**
+   * Retrieve the dependencies of this node.
+   */
+  List<NodeType> get dependencies => _dependencies ??= computeDependencies();
+
+  /**
+   * Indicates whether this node has been evaluated yet.
+   */
+  bool get isEvaluated;
+
+  /**
+   * Compute the dependencies of this node.
+   */
+  List<NodeType> computeDependencies();
+}
+
+/**
+ * Element used for references that result from trying to access a nonstatic
+ * member of an element that is not a container (e.g. accessing the "length"
+ * property of a constant).
+ */
+class NonstaticMemberElementForLink implements ReferenceableElementForLink {
+  /**
+   * If the thing from which a member was accessed is a constant, the
+   * associated [ConstNode].  Otherwise `null`.
+   */
+  final ConstVariableNode _constNode;
+
+  NonstaticMemberElementForLink(this._constNode);
+
+  @override
+  ConstructorElementForLink get asConstructor => null;
+
+  @override
+  ConstVariableNode get asConstVariable => _constNode;
+
+  @override
+  DartType buildType(DartType getTypeArgument(int i),
+          List<int> implicitFunctionTypeIndices) =>
+      DynamicTypeImpl.instance;
+
+  @override
+  ReferenceableElementForLink getContainedName(String name) => this;
+}
+
+/**
+ * Element representing a function or method parameter resynthesized
+ * from a summary during linking.
+ */
+class ParameterElementForLink implements ParameterElement {
+  /**
+   * The unlinked representation of the parameter in the summary.
+   */
+  final UnlinkedParam _unlinkedParam;
+
+  /**
+   * If this parameter has a default value and the enclosing library
+   * is part of the build unit being linked, the parameter's node in
+   * the constant evaluation dependency graph.  Otherwise `null`.
+   */
+  ConstNode _constNode;
+
+  /**
+   * The compilation unit in which this parameter appears.
+   */
+  final CompilationUnitElementForLink compilationUnit;
+
+  ParameterElementForLink(this._unlinkedParam, this.compilationUnit) {
+    if (_unlinkedParam.defaultValue != null) {
+      _constNode = new ConstParameterNode(this);
+    }
+  }
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * Abstract base class representing an element which can be the target
+ * of a reference.
+ */
+abstract class ReferenceableElementForLink {
+  /**
+   * If this element can be used in a constructor invocation context,
+   * return the associated constructor (which may be `this` or some
+   * other element).  Otherwise return `null`.
+   */
+  ConstructorElementForLink get asConstructor;
+
+  /**
+   * If this element can be used in a getter context to refer to a
+   * constant variable, return the [ConstVariableNode] for the
+   * constant value.  Otherwise return `null`.
+   */
+  ConstVariableNode get asConstVariable;
+
+  /**
+   * Return the type indicated by this element when it is used in a
+   * type instantiation context.  If this element can't legally be
+   * instantiated as a type, return the dynamic type.
+   */
+  DartType buildType(
+      DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices);
+
+  /**
+   * If this element contains other named elements, return the
+   * contained element having the given [name].  If this element can't
+   * contain other named elements, or it doesn't contain an element
+   * with the given name, return the singleton of
+   * [UndefinedElementForLink].
+   */
+  ReferenceableElementForLink getContainedName(String name);
+}
+
+/**
+ * Element representing a top level variable resynthesized from a
+ * summary during linking.
+ */
+class TopLevelVariableElementForLink extends VariableElementForLink
+    implements TopLevelVariableElement {
+  TopLevelVariableElementForLink(CompilationUnitElement enclosingElement,
+      UnlinkedVariable unlinkedVariable)
+      : super(unlinkedVariable, enclosingElement);
+
+  @override
+  bool get isStatic => true;
+}
+
+/**
+ * Interface representing elements which can serve as the context within which
+ * type parameter indices are interpreted.
+ */
+abstract class TypeParameterContext {
+  /**
+   * Convert the given [index] into a type parameter type.
+   */
+  TypeParameterType getTypeParameterType(int index);
+}
+
+/**
+ * Element representing a type parameter resynthesized from a summary during
+ * linking.
+ */
+class TypeParameterElementForLink implements TypeParameterElement {
+  /**
+   * The unlinked representation of the type parameter in the summary.
+   */
+  final UnlinkedTypeParam _unlinkedTypeParam;
+
+  TypeParameterElementForLink(this._unlinkedTypeParam);
+
+  @override
+  String get name => _unlinkedTypeParam.name;
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * Singleton element used for unresolved references.
+ */
+class UndefinedElementForLink implements ReferenceableElementForLink {
+  static const UndefinedElementForLink instance =
+      const UndefinedElementForLink._();
+
+  const UndefinedElementForLink._();
+
+  @override
+  ConstructorElementForLink get asConstructor => null;
+
+  @override
+  ConstVariableNode get asConstVariable => null;
+
+  @override
+  DartType buildType(DartType getTypeArgument(int i),
+          List<int> implicitFunctionTypeIndices) =>
+      DynamicTypeImpl.instance;
+
+  @override
+  ReferenceableElementForLink getContainedName(String name) => this;
+}
+
+/**
+ * Element representing a top level variable resynthesized from a
+ * summary during linking.
+ */
+class VariableElementForLink
+    implements VariableElement, ReferenceableElementForLink {
+  /**
+   * The unlinked representation of the variable in the summary.
+   */
+  final UnlinkedVariable unlinkedVariable;
+
+  /**
+   * If this variable is declared `const` and the enclosing library is
+   * part of the build unit being linked, the variable's node in the
+   * constant evaluation dependency graph.  Otherwise `null`.
+   */
+  ConstNode _constNode;
+
+  /**
+   * The compilation unit in which this variable appears.
+   */
+  final CompilationUnitElementForLink compilationUnit;
+
+  VariableElementForLink(this.unlinkedVariable, this.compilationUnit) {
+    if (compilationUnit.isInBuildUnit && unlinkedVariable.constExpr != null) {
+      _constNode = new ConstVariableNode(this);
+    }
+  }
+
+  @override
+  ConstructorElementForLink get asConstructor => null;
+
+  @override
+  ConstVariableNode get asConstVariable => _constNode;
+
+  @override
+  bool get isConst => unlinkedVariable.isConst;
+
+  @override
+  bool get isFinal => unlinkedVariable.isFinal;
+
+  @override
+  bool get isStatic;
+
+  @override
+  String get name => unlinkedVariable.name;
+
+  @override
+  DartType buildType(DartType getTypeArgument(int i),
+          List<int> implicitFunctionTypeIndices) =>
+      DynamicTypeImpl.instance;
+
+  ReferenceableElementForLink getContainedName(String name) {
+    return new NonstaticMemberElementForLink(_constNode);
+  }
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
+ * Instances of [_Linker] contain the necessary information to link
+ * together a single build unit.
+ */
+class _Linker {
+  /**
+   * Callback to ask the client for a [LinkedLibrary] for a
+   * dependency.
+   */
+  final GetDependencyCallback getDependency;
+
+  /**
+   * Callback to ask the client for an [UnlinkedUnit].
+   */
+  final GetUnitCallback getUnit;
+
+  /**
+   * Map containing all library elements accessed during linking,
+   * whether they are part of the build unit being linked or whether
+   * they are dependencies.
+   */
+  final Map<Uri, LibraryElementForLink> _libraries =
+      <Uri, LibraryElementForLink>{};
+
+  /**
+   * List of library elements for the libraries in the build unit
+   * being linked.
+   */
+  final List<LibraryElementInBuildUnit> _librariesInBuildUnit =
+      <LibraryElementInBuildUnit>[];
+
+  InterfaceType _objectType;
+  LibraryElementForLink _coreLibrary;
+
+  _Linker(Map<String, LinkedLibraryBuilder> linkedLibraries, this.getDependency,
+      this.getUnit) {
+    // Create elements for the libraries to be linked.  The rest of
+    // the element model will be created on demand.
+    linkedLibraries
+        .forEach((String absoluteUri, LinkedLibraryBuilder linkedLibrary) {
+      Uri uri = Uri.parse(absoluteUri);
+      _librariesInBuildUnit.add(_libraries[uri] =
+          new LibraryElementInBuildUnit(this, uri, linkedLibrary));
+    });
+  }
+
+  /**
+   * Get the library element for `dart:core`.
+   */
+  LibraryElementForLink get coreLibrary =>
+      _coreLibrary ??= getLibrary(Uri.parse('dart:core'));
+
+  /**
+   * Get the `InterfaceType` for the type `Object`.
+   */
+  InterfaceType get objectType => _objectType ??= coreLibrary
+      .getContainedName('Object')
+      .buildType((int i) => DynamicTypeImpl.instance, const []);
+
+  /**
+   * Get the library element for the library having the given [uri].
+   */
+  LibraryElementForLink getLibrary(Uri uri) => _libraries.putIfAbsent(
+      uri,
+      () => new LibraryElementInDependency(
+          this, uri, getDependency(uri.toString())));
+
+  /**
+   * Perform type inference and const cycle detection on all libraries
+   * in the build unit being linked.
+   */
+  void link() {
+    for (LibraryElementInBuildUnit library in _librariesInBuildUnit) {
+      library.link();
+    }
+    // TODO(paulberry): set dependencies.
+  }
+
+  /**
+   * Throw away any information produced by a previous call to [link].
+   */
+  void unlink() {
+    for (LibraryElementInBuildUnit library in _librariesInBuildUnit) {
+      library.unlink();
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index a58bfd3..59c1951 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -4,8 +4,10 @@
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
@@ -15,32 +17,15 @@
 import 'package:path/path.dart' as pathos;
 
 /**
- * If [uri] has the `package` scheme in form of `package:pkg/file.dart`,
- * return the `pkg` name.  Otherwise return `null`.
- */
-String _getPackageName(Uri uri) {
-  if (uri.scheme != 'package') {
-    return null;
-  }
-  String path = uri.path;
-  int index = path.indexOf('/');
-  if (index == -1) {
-    return null;
-  }
-  return path.substring(0, index);
-}
-
-/**
  * The [ResultProvider] that provides results from input package summaries.
  */
 class InputPackagesResultProvider extends ResultProvider {
   final InternalAnalysisContext _context;
-  final Map<String, String> _packageSummaryInputs;
 
   _FileBasedSummaryResynthesizer _resynthesizer;
   SummaryResultProvider _sdkProvider;
 
-  InputPackagesResultProvider(this._context, this._packageSummaryInputs) {
+  InputPackagesResultProvider(this._context, SummaryDataStore dataStore) {
     InternalAnalysisContext sdkContext = _context.sourceFactory.dartSdk.context;
     _sdkProvider = sdkContext.resultProvider;
     // Set the type provider to prevent the context from computing it.
@@ -52,7 +37,7 @@
         _context.typeProvider,
         _context.sourceFactory,
         _context.analysisOptions.strongMode,
-        _packageSummaryInputs.values.toList());
+        dataStore);
   }
 
   @override
@@ -65,12 +50,11 @@
     if (target is Source) {
       Uri uri = target.uri;
       // We know how to server results to input packages.
-      String sourcePackageName = _getPackageName(uri);
-      if (!_packageSummaryInputs.containsKey(sourcePackageName)) {
+      String uriString = uri.toString();
+      if (!_resynthesizer.hasLibrarySummary(uriString)) {
         return false;
       }
       // Provide known results.
-      String uriString = uri.toString();
       if (result == LIBRARY_ELEMENT1 ||
           result == LIBRARY_ELEMENT2 ||
           result == LIBRARY_ELEMENT3 ||
@@ -91,11 +75,11 @@
         entry.setValue(result, true, TargetedResult.EMPTY_LIST);
         return true;
       } else if (result == SOURCE_KIND) {
-        if (_resynthesizer.linkedMap.containsKey(uriString)) {
+        if (_resynthesizer._dataStore.linkedMap.containsKey(uriString)) {
           entry.setValue(result, SourceKind.LIBRARY, TargetedResult.EMPTY_LIST);
           return true;
         }
-        if (_resynthesizer.unlinkedMap.containsKey(uriString)) {
+        if (_resynthesizer._dataStore.unlinkedMap.containsKey(uriString)) {
           entry.setValue(result, SourceKind.PART, TargetedResult.EMPTY_LIST);
           return true;
         }
@@ -107,80 +91,45 @@
 }
 
 /**
- * The [UriResolver] that knows about sources that are parts of packages which
- * are served from their summaries.
+ * The [UriResolver] that knows about sources that are served from their
+ * summaries.
  */
 class InSummaryPackageUriResolver extends UriResolver {
-  final Map<String, String> _packageSummaryInputs;
+  final SummaryDataStore _dataStore;
 
-  InSummaryPackageUriResolver(this._packageSummaryInputs);
+  InSummaryPackageUriResolver(this._dataStore);
 
   @override
   Source resolveAbsolute(Uri uri, [Uri actualUri]) {
     actualUri ??= uri;
-    String packageName = _getPackageName(actualUri);
-    if (_packageSummaryInputs.containsKey(packageName)) {
-      return new _InSummarySource(actualUri);
+    UnlinkedUnit unit = _dataStore.unlinkedMap[uri.toString()];
+    if (unit != null) {
+      String summaryPath = _dataStore.uriToSummaryPath[uri.toString()];
+      if (unit.fallbackModePath.isNotEmpty) {
+        return new _InSummaryFallbackSource(
+            new JavaFile(unit.fallbackModePath), actualUri, summaryPath);
+      } else {
+        return new InSummarySource(actualUri, summaryPath);
+      }
     }
     return null;
   }
 }
 
 /**
- * A concrete resynthesizer that serves summaries from given file paths.
- */
-class _FileBasedSummaryResynthesizer extends SummaryResynthesizer {
-  final Map<String, UnlinkedUnit> unlinkedMap = <String, UnlinkedUnit>{};
-  final Map<String, LinkedLibrary> linkedMap = <String, LinkedLibrary>{};
-
-  _FileBasedSummaryResynthesizer(
-      SummaryResynthesizer parent,
-      AnalysisContext context,
-      TypeProvider typeProvider,
-      SourceFactory sourceFactory,
-      bool strongMode,
-      List<String> summaryPaths)
-      : super(parent, context, typeProvider, sourceFactory, strongMode) {
-    summaryPaths.forEach(_fillMaps);
-  }
-
-  @override
-  LinkedLibrary getLinkedSummary(String uri) {
-    return linkedMap[uri];
-  }
-
-  @override
-  UnlinkedUnit getUnlinkedSummary(String uri) {
-    return unlinkedMap[uri];
-  }
-
-  @override
-  bool hasLibrarySummary(String uri) {
-    return linkedMap.containsKey(uri);
-  }
-
-  void _fillMaps(String path) {
-    io.File file = new io.File(path);
-    List<int> buffer = file.readAsBytesSync();
-    PackageBundle bundle = new PackageBundle.fromBuffer(buffer);
-    for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) {
-      unlinkedMap[bundle.unlinkedUnitUris[i]] = bundle.unlinkedUnits[i];
-    }
-    for (int i = 0; i < bundle.linkedLibraryUris.length; i++) {
-      linkedMap[bundle.linkedLibraryUris[i]] = bundle.linkedLibraries[i];
-    }
-  }
-}
-
-/**
  * A placeholder of a source that is part of a package whose analysis results
  * are served from its summary.  This source uses its URI as [fullName] and has
  * empty contents.
  */
-class _InSummarySource extends Source {
+class InSummarySource extends Source {
   final Uri uri;
 
-  _InSummarySource(this.uri);
+  /**
+   * The summary file where this source was defined.
+   */
+  final String summaryPath;
+
+  InSummarySource(this.uri, this.summaryPath);
 
   @override
   TimestampedData<String> get contents => new TimestampedData<String>(0, '');
@@ -208,17 +157,106 @@
 
   @override
   bool operator ==(Object object) =>
-      object is _InSummarySource && object.uri == uri;
+      object is InSummarySource && object.uri == uri;
 
   @override
   bool exists() => true;
 
   @override
-  Uri resolveRelativeUri(Uri relativeUri) {
-    Uri baseUri = uri;
-    return baseUri.resolveUri(relativeUri);
+  String toString() => uri.toString();
+}
+
+/**
+ * A [SummaryDataStore] is a container for the data extracted from a set of
+ * summary package bundles.  It contains maps which can be used to find linked
+ * and unlinked summaries by URI.
+ */
+class SummaryDataStore {
+  /**
+   * Map from the URI of a compilation unit to the unlinked summary of that
+   * compilation unit.
+   */
+  final Map<String, UnlinkedUnit> unlinkedMap = <String, UnlinkedUnit>{};
+
+  /**
+   * Map from the URI of a library to the linked summary of that library.
+   */
+  final Map<String, LinkedLibrary> linkedMap = <String, LinkedLibrary>{};
+
+  /**
+   * Map from the URI of a library to the summary path that contained it.
+   */
+  final Map<String, String> uriToSummaryPath = <String, String>{};
+
+  SummaryDataStore(Iterable<String> summaryPaths) {
+    summaryPaths.forEach(_fillMaps);
+  }
+
+  /**
+   * Add the given [bundle] loaded from the file with the given [path].
+   */
+  void addBundle(String path, PackageBundle bundle) {
+    for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) {
+      String uri = bundle.unlinkedUnitUris[i];
+      uriToSummaryPath[uri] = path;
+      unlinkedMap[uri] = bundle.unlinkedUnits[i];
+    }
+    for (int i = 0; i < bundle.linkedLibraryUris.length; i++) {
+      String uri = bundle.linkedLibraryUris[i];
+      linkedMap[uri] = bundle.linkedLibraries[i];
+    }
+  }
+
+  void _fillMaps(String path) {
+    io.File file = new io.File(path);
+    List<int> buffer = file.readAsBytesSync();
+    PackageBundle bundle = new PackageBundle.fromBuffer(buffer);
+    addBundle(path, bundle);
+  }
+}
+
+/**
+ * A concrete resynthesizer that serves summaries from given file paths.
+ */
+class _FileBasedSummaryResynthesizer extends SummaryResynthesizer {
+  final SummaryDataStore _dataStore;
+
+  _FileBasedSummaryResynthesizer(
+      SummaryResynthesizer parent,
+      AnalysisContext context,
+      TypeProvider typeProvider,
+      SourceFactory sourceFactory,
+      bool strongMode,
+      this._dataStore)
+      : super(parent, context, typeProvider, sourceFactory, strongMode);
+
+  @override
+  LinkedLibrary getLinkedSummary(String uri) {
+    return _dataStore.linkedMap[uri];
   }
 
   @override
-  String toString() => uri.toString();
+  UnlinkedUnit getUnlinkedSummary(String uri) {
+    return _dataStore.unlinkedMap[uri];
+  }
+
+  @override
+  bool hasLibrarySummary(String uri) {
+    LinkedLibrary linkedLibrary = _dataStore.linkedMap[uri];
+    return linkedLibrary != null && !linkedLibrary.fallbackMode;
+  }
+}
+
+/**
+ * A source that is part of a package whose summary was generated in fallback
+ * mode.  This source behaves identically to a [FileBasedSource] except that it
+ * also provides [summaryPath].
+ */
+class _InSummaryFallbackSource extends FileBasedSource
+    implements InSummarySource {
+  @override
+  final String summaryPath;
+
+  _InSummaryFallbackSource(JavaFile file, Uri uri, this.summaryPath)
+      : super(file, uri);
 }
diff --git a/pkg/analyzer/lib/src/summary/prelink.dart b/pkg/analyzer/lib/src/summary/prelink.dart
index 688abe5..6b92f99 100644
--- a/pkg/analyzer/lib/src/summary/prelink.dart
+++ b/pkg/analyzer/lib/src/summary/prelink.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/name_filter.dart';
@@ -284,8 +285,16 @@
       });
     }
     for (UnlinkedEnum enm in unit.enums) {
-      privateNamespace.putIfAbsent(enm.name,
-          () => new _Meaning(unitNum, ReferenceKind.classOrEnum, 0, 0));
+      privateNamespace.putIfAbsent(enm.name, () {
+        Map<String, _Meaning> namespace = <String, _Meaning>{};
+        enm.values.forEach((UnlinkedEnumValue value) {
+          namespace[value.name] =
+              new _Meaning(unitNum, ReferenceKind.propertyAccessor, 0, 0);
+        });
+        namespace['values'] =
+            new _Meaning(unitNum, ReferenceKind.propertyAccessor, 0, 0);
+        return new _ClassMeaning(unitNum, 0, 0, namespace);
+      });
     }
     for (UnlinkedExecutable executable in unit.executables) {
       privateNamespace.putIfAbsent(
@@ -507,7 +516,8 @@
     if (sourceUri == null) {
       return relativeUri;
     } else {
-      return Uri.parse(sourceUri).resolve(relativeUri).toString();
+      return resolveRelativeUri(Uri.parse(sourceUri), Uri.parse(relativeUri))
+          .toString();
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/summary/public_namespace_computer.dart b/pkg/analyzer/lib/src/summary/public_namespace_computer.dart
index 3273c9f..5cb6e8e5 100644
--- a/pkg/analyzer/lib/src/summary/public_namespace_computer.dart
+++ b/pkg/analyzer/lib/src/summary/public_namespace_computer.dart
@@ -116,7 +116,23 @@
 
   @override
   visitEnumDeclaration(EnumDeclaration node) {
-    addNameIfPublic(node.name.name, ReferenceKind.classOrEnum, 0);
+    UnlinkedPublicNameBuilder enm =
+        addNameIfPublic(node.name.name, ReferenceKind.classOrEnum, 0);
+    if (enm != null) {
+      enm.members.add(new UnlinkedPublicNameBuilder(
+          name: 'values',
+          kind: ReferenceKind.propertyAccessor,
+          numTypeParameters: 0));
+      for (EnumConstantDeclaration enumConstant in node.constants) {
+        String name = enumConstant.name.name;
+        if (isPublic(name)) {
+          enm.members.add(new UnlinkedPublicNameBuilder(
+              name: name,
+              kind: ReferenceKind.propertyAccessor,
+              numTypeParameters: 0));
+        }
+      }
+    }
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 59117e1..de36f0a 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -272,7 +272,7 @@
  * Builder of [Expression]s from [UnlinkedConst]s.
  */
 class _ConstExprBuilder {
-  final _LibraryResynthesizer resynthesizer;
+  final _UnitResynthesizer resynthesizer;
   final UnlinkedConst uc;
 
   int intPtr = 0;
@@ -480,22 +480,17 @@
   }
 
   TypeName _buildTypeAst(DartType type) {
-    if (type is DynamicTypeImpl) {
-      TypeName node = AstFactory.typeName4('dynamic');
-      node.type = type;
-      (node.name as SimpleIdentifier).staticElement = type.element;
-      return node;
-    } else if (type is InterfaceType) {
+    List<TypeName> argumentNodes;
+    if (type is ParameterizedType) {
       List<DartType> typeArguments = type.typeArguments;
-      List<TypeName> argumentNodes = typeArguments.every((a) => a.isDynamic)
+      argumentNodes = typeArguments.every((a) => a.isDynamic)
           ? null
           : typeArguments.map(_buildTypeAst).toList();
-      TypeName node = AstFactory.typeName4(type.name, argumentNodes);
-      node.type = type;
-      (node.name as SimpleIdentifier).staticElement = type.element;
-      return node;
     }
-    throw new StateError('Unsupported type $type');
+    TypeName node = AstFactory.typeName4(type.name, argumentNodes);
+    node.type = type;
+    (node.name as SimpleIdentifier).staticElement = type.element;
+    return node;
   }
 
   InterpolationElement _newInterpolationElement(Expression expr) {
@@ -645,6 +640,59 @@
 }
 
 /**
+ * A class element that has been resynthesized from a summary.  The actual
+ * element won't be constructed until it is requested.  But properties
+ * [context],  [displayName], [enclosingElement] and [name] can be used without
+ * creating the actual element.  This allows to put these elements into
+ * namespaces without creating actual elements until they are really needed.
+ */
+class _DeferredClassElement extends ClassElementHandle {
+  final _UnitResynthesizer unitResynthesizer;
+  final CompilationUnitElement unitElement;
+  final UnlinkedClass serializedClass;
+
+  ClassElementImpl _actualElement;
+
+  @override
+  final String name;
+
+  factory _DeferredClassElement(_UnitResynthesizer unitResynthesizer,
+      CompilationUnitElement unitElement, UnlinkedClass serializedClass) {
+    String name = serializedClass.name;
+    List<String> components =
+        unitResynthesizer.unit.location.components.toList();
+    components.add(name);
+    ElementLocationImpl location = new ElementLocationImpl.con3(components);
+    return new _DeferredClassElement._(
+        unitResynthesizer, unitElement, serializedClass, name, location);
+  }
+
+  _DeferredClassElement._(this.unitResynthesizer, this.unitElement,
+      this.serializedClass, this.name, ElementLocation location)
+      : super(null, location);
+
+  @override
+  ClassElementImpl get actualElement {
+    if (_actualElement == null) {
+      _actualElement = unitResynthesizer.buildClassImpl(serializedClass);
+      _actualElement.enclosingElement = unitElement;
+    }
+    return _actualElement;
+  }
+
+  @override
+  AnalysisContext get context => unitElement.context;
+
+  @override
+  String get displayName => name;
+
+  @override
+  CompilationUnitElement get enclosingElement {
+    return unitElement;
+  }
+}
+
+/**
  * The constructor element that has been resynthesized from a summary.  The
  * actual element won't be constructed until it is requested.  But properties
  * [displayName], [enclosingElement] and [name] can be used without creating
@@ -690,7 +738,7 @@
 }
 
 /**
- * Local function element representing the intializer for a variable that has
+ * Local function element representing the initializer for a variable that has
  * been resynthesized from a summary.  The actual element won't be constructed
  * until it is requested.  But properties [context] and [enclosingElement] can
  * be used without creating the actual element.
@@ -822,47 +870,6 @@
   List<ClassElementImpl> delayedObjectSubclasses = <ClassElementImpl>[];
 
   /**
-   * [ElementHolder] into which resynthesized elements should be placed.  This
-   * object is recreated afresh for each unit in the library, and is used to
-   * populate the [CompilationUnitElement].
-   */
-  ElementHolder unitHolder;
-
-  /**
-   * The [LinkedUnit] from which elements are currently being resynthesized.
-   */
-  LinkedUnit linkedUnit;
-
-  /**
-   * The [UnlinkedUnit] from which elements are currently being resynthesized.
-   */
-  UnlinkedUnit unlinkedUnit;
-
-  /**
-   * Map from slot id to the corresponding [EntityRef] object for linked types
-   * (i.e. propagated and inferred types).
-   */
-  Map<int, EntityRef> linkedTypeMap;
-
-  /**
-   * Set of slot ids corresponding to const constructors that are part of
-   * cycles.
-   */
-  Set<int> constCycles;
-
-  /**
-   * The [CompilationUnitElementImpl] for the compilation unit currently being
-   * resynthesized.
-   */
-  CompilationUnitElementImpl currentCompilationUnit;
-
-  /**
-   * The [ConstructorElementImpl] for the constructor currently being
-   * resynthesized.
-   */
-  ConstructorElementImpl currentConstructor;
-
-  /**
    * Map of compilation unit elements that have been resynthesized so far.  The
    * key is the URI of the compilation unit.
    */
@@ -877,6 +884,532 @@
   final Map<String, Map<String, Element>> resynthesizedElements =
       <String, Map<String, Element>>{};
 
+  _LibraryResynthesizer(this.summaryResynthesizer, this.linkedLibrary,
+      this.unlinkedUnits, this.librarySource) {
+    isCoreLibrary = librarySource.uri.toString() == 'dart:core';
+  }
+
+  /**
+   * Resynthesize a [NamespaceCombinator].
+   */
+  NamespaceCombinator buildCombinator(UnlinkedCombinator serializedCombinator) {
+    if (serializedCombinator.shows.isNotEmpty) {
+      ShowElementCombinatorImpl combinator = new ShowElementCombinatorImpl();
+      // Note: we call toList() so that we don't retain a reference to the
+      // deserialized data structure.
+      combinator.shownNames = serializedCombinator.shows.toList();
+      combinator.offset = serializedCombinator.offset;
+      combinator.end = serializedCombinator.end;
+      return combinator;
+    } else {
+      HideElementCombinatorImpl combinator = new HideElementCombinatorImpl();
+      // Note: we call toList() so that we don't retain a reference to the
+      // deserialized data structure.
+      combinator.hiddenNames = serializedCombinator.hides.toList();
+      return combinator;
+    }
+  }
+
+  /**
+   * Resynthesize an [ExportElement],
+   */
+  ExportElement buildExport(
+      _UnitResynthesizer definingUnitResynthesizer,
+      UnlinkedExportPublic serializedExportPublic,
+      UnlinkedExportNonPublic serializedExportNonPublic) {
+    ExportElementImpl exportElement =
+        new ExportElementImpl(serializedExportNonPublic.offset);
+    String exportedLibraryUri = summaryResynthesizer.sourceFactory
+        .resolveUri(librarySource, serializedExportPublic.uri)
+        .uri
+        .toString();
+    exportElement.exportedLibrary = new LibraryElementHandle(
+        summaryResynthesizer,
+        new ElementLocationImpl.con3(<String>[exportedLibraryUri]));
+    exportElement.uri = serializedExportPublic.uri;
+    exportElement.combinators =
+        serializedExportPublic.combinators.map(buildCombinator).toList();
+    exportElement.uriOffset = serializedExportNonPublic.uriOffset;
+    exportElement.uriEnd = serializedExportNonPublic.uriEnd;
+    definingUnitResynthesizer.buildAnnotations(
+        exportElement, serializedExportNonPublic.annotations);
+    return exportElement;
+  }
+
+  /**
+   * Build an [ElementHandle] referring to the entity referred to by the given
+   * [exportName].
+   */
+  ElementHandle buildExportName(LinkedExportName exportName) {
+    String name = exportName.name;
+    if (exportName.kind == ReferenceKind.topLevelPropertyAccessor &&
+        !name.endsWith('=')) {
+      name += '?';
+    }
+    ElementLocationImpl location = new ElementLocationImpl.con3(
+        getReferencedLocationComponents(
+            exportName.dependency, exportName.unit, name));
+    switch (exportName.kind) {
+      case ReferenceKind.classOrEnum:
+        return new ClassElementHandle(summaryResynthesizer, location);
+      case ReferenceKind.typedef:
+        return new FunctionTypeAliasElementHandle(
+            summaryResynthesizer, location);
+      case ReferenceKind.topLevelFunction:
+        return new FunctionElementHandle(summaryResynthesizer, location);
+      case ReferenceKind.topLevelPropertyAccessor:
+        return new PropertyAccessorElementHandle(
+            summaryResynthesizer, location);
+      case ReferenceKind.constructor:
+      case ReferenceKind.function:
+      case ReferenceKind.propertyAccessor:
+      case ReferenceKind.method:
+      case ReferenceKind.length:
+      case ReferenceKind.prefix:
+      case ReferenceKind.unresolved:
+      case ReferenceKind.variable:
+        // Should never happen.  Exported names never refer to import prefixes,
+        // and they always refer to defined top-level entities.
+        throw new StateError('Unexpected export name kind: ${exportName.kind}');
+    }
+  }
+
+  /**
+   * Build the export namespace for the library by aggregating together its
+   * [publicNamespace] and [exportNames].
+   */
+  Namespace buildExportNamespace(
+      Namespace publicNamespace, List<LinkedExportName> exportNames) {
+    HashMap<String, Element> definedNames = new HashMap<String, Element>();
+    // Start by populating all the public names from [publicNamespace].
+    publicNamespace.definedNames.forEach((String name, Element element) {
+      definedNames[name] = element;
+    });
+    // Add all the names from [exportNames].
+    for (LinkedExportName exportName in exportNames) {
+      definedNames.putIfAbsent(
+          exportName.name, () => buildExportName(exportName));
+    }
+    return new Namespace(definedNames);
+  }
+
+  /**
+   * Resynthesize an [ImportElement].
+   */
+  ImportElement buildImport(_UnitResynthesizer definingUnitResynthesizer,
+      UnlinkedImport serializedImport, int dependency) {
+    bool isSynthetic = serializedImport.isImplicit;
+    ImportElementImpl importElement =
+        new ImportElementImpl(isSynthetic ? -1 : serializedImport.offset);
+    String absoluteUri = summaryResynthesizer.sourceFactory
+        .resolveUri(librarySource, linkedLibrary.dependencies[dependency].uri)
+        .uri
+        .toString();
+    importElement.importedLibrary = new LibraryElementHandle(
+        summaryResynthesizer,
+        new ElementLocationImpl.con3(<String>[absoluteUri]));
+    if (isSynthetic) {
+      importElement.synthetic = true;
+    } else {
+      importElement.uri = serializedImport.uri;
+      importElement.uriOffset = serializedImport.uriOffset;
+      importElement.uriEnd = serializedImport.uriEnd;
+      importElement.deferred = serializedImport.isDeferred;
+      definingUnitResynthesizer.buildAnnotations(
+          importElement, serializedImport.annotations);
+    }
+    importElement.prefixOffset = serializedImport.prefixOffset;
+    if (serializedImport.prefixReference != 0) {
+      UnlinkedReference serializedPrefix =
+          unlinkedUnits[0].references[serializedImport.prefixReference];
+      importElement.prefix = new PrefixElementImpl(
+          serializedPrefix.name, serializedImport.prefixOffset);
+    }
+    importElement.combinators =
+        serializedImport.combinators.map(buildCombinator).toList();
+    return importElement;
+  }
+
+  /**
+   * Main entry point.  Resynthesize the [LibraryElement] and return it.
+   */
+  LibraryElement buildLibrary() {
+    CompilationUnitElementImpl definingUnit =
+        new CompilationUnitElementImpl(librarySource.shortName);
+    _UnitResynthesizer definingUnitResynthesizer =
+        createUnitResynthesizer(definingUnit, 0);
+    // Create LibraryElementImpl.
+    bool hasName = unlinkedUnits[0].libraryName.isNotEmpty;
+    LibraryElementImpl library = new LibraryElementImpl(
+        summaryResynthesizer.context,
+        unlinkedUnits[0].libraryName,
+        hasName ? unlinkedUnits[0].libraryNameOffset : -1,
+        unlinkedUnits[0].libraryNameLength);
+    definingUnitResynthesizer.buildDocumentation(
+        library, unlinkedUnits[0].libraryDocumentationComment);
+    definingUnitResynthesizer.buildAnnotations(
+        library, unlinkedUnits[0].libraryAnnotations);
+    library.definingCompilationUnit = definingUnit;
+    definingUnit.source = librarySource;
+    definingUnit.librarySource = librarySource;
+    // Create parts.
+    List<CompilationUnitElement> partUnits = <CompilationUnitElement>[];
+    UnlinkedUnit unlinkedDefiningUnit = unlinkedUnits[0];
+    assert(unlinkedDefiningUnit.publicNamespace.parts.length + 1 ==
+        linkedLibrary.units.length);
+    for (int i = 1; i < linkedLibrary.units.length; i++) {
+      CompilationUnitElementImpl part = buildPart(
+          definingUnitResynthesizer,
+          unlinkedDefiningUnit.publicNamespace.parts[i - 1],
+          unlinkedDefiningUnit.parts[i - 1],
+          i);
+      partUnits.add(part);
+    }
+    library.parts = partUnits;
+    // Create imports.
+    List<ImportElement> imports = <ImportElement>[];
+    for (int i = 0; i < unlinkedDefiningUnit.imports.length; i++) {
+      imports.add(buildImport(
+          definingUnitResynthesizer,
+          unlinkedDefiningUnit.imports[i],
+          linkedLibrary.importDependencies[i]));
+    }
+    library.imports = imports;
+    // Create exports.
+    List<ExportElement> exports = <ExportElement>[];
+    assert(unlinkedDefiningUnit.exports.length ==
+        unlinkedDefiningUnit.publicNamespace.exports.length);
+    for (int i = 0; i < unlinkedDefiningUnit.exports.length; i++) {
+      exports.add(buildExport(
+          definingUnitResynthesizer,
+          unlinkedDefiningUnit.publicNamespace.exports[i],
+          unlinkedDefiningUnit.exports[i]));
+    }
+    library.exports = exports;
+    // Populate units.
+    populateUnit(definingUnitResynthesizer);
+    for (int i = 0; i < partUnits.length; i++) {
+      _UnitResynthesizer partResynthesizer =
+          createUnitResynthesizer(partUnits[i], i + 1);
+      populateUnit(partResynthesizer);
+    }
+    BuildLibraryElementUtils.patchTopLevelAccessors(library);
+    // Update delayed Object class references.
+    if (isCoreLibrary) {
+      ClassElement objectElement = library.getType('Object');
+      assert(objectElement != null);
+      for (ClassElementImpl classElement in delayedObjectSubclasses) {
+        classElement.supertype = objectElement.type;
+      }
+    }
+    // Compute namespaces.
+    library.publicNamespace =
+        new NamespaceBuilder().createPublicNamespaceForLibrary(library);
+    library.exportNamespace = buildExportNamespace(
+        library.publicNamespace, linkedLibrary.exportNames);
+    // Find the entry point.  Note: we can't use element.isEntryPoint because
+    // that will trigger resynthesis of exported libraries.
+    Element entryPoint =
+        library.exportNamespace.get(FunctionElement.MAIN_FUNCTION_NAME);
+    if (entryPoint is FunctionElement) {
+      library.entryPoint = entryPoint;
+    }
+    // Create the synthetic element for `loadLibrary`.
+    // Until the client received dart:core and dart:async, we cannot do this,
+    // because the TypeProvider is not fully initialized. So, it is up to the
+    // Dart SDK client to initialize TypeProvider and finish the dart:core and
+    // dart:async libraries creation.
+    if (library.name != 'dart.core' && library.name != 'dart.async') {
+      library.createLoadLibraryFunction(summaryResynthesizer.typeProvider);
+    }
+    // Done.
+    return library;
+  }
+
+  /**
+   * Create, but do not populate, the [CompilationUnitElement] for a part other
+   * than the defining compilation unit.
+   */
+  CompilationUnitElementImpl buildPart(
+      _UnitResynthesizer definingUnitResynthesizer,
+      String uri,
+      UnlinkedPart partDecl,
+      int unitNum) {
+    Source unitSource =
+        summaryResynthesizer.sourceFactory.resolveUri(librarySource, uri);
+    CompilationUnitElementImpl partUnit =
+        new CompilationUnitElementImpl(unitSource.shortName);
+    partUnit.uriOffset = partDecl.uriOffset;
+    partUnit.uriEnd = partDecl.uriEnd;
+    partUnit.source = unitSource;
+    partUnit.librarySource = librarySource;
+    partUnit.uri = uri;
+    definingUnitResynthesizer.buildAnnotations(partUnit, partDecl.annotations);
+    return partUnit;
+  }
+
+  /**
+   * Set up data structures for deserializing a compilation unit.
+   */
+  _UnitResynthesizer createUnitResynthesizer(
+      CompilationUnitElementImpl unit, int unitNum) {
+    LinkedUnit linkedUnit = linkedLibrary.units[unitNum];
+    UnlinkedUnit unlinkedUnit = unlinkedUnits[unitNum];
+    return new _UnitResynthesizer(this, unlinkedUnit, linkedUnit, unit);
+  }
+
+  /**
+   * Build the components of an [ElementLocationImpl] for the entity in the
+   * given [unit] of the dependency located at [dependencyIndex], and having
+   * the given [name].
+   */
+  List<String> getReferencedLocationComponents(
+      int dependencyIndex, int unit, String name) {
+    if (dependencyIndex == 0) {
+      String referencedLibraryUri = librarySource.uri.toString();
+      String partUri;
+      if (unit != 0) {
+        String uri = unlinkedUnits[0].publicNamespace.parts[unit - 1];
+        Source partSource =
+            summaryResynthesizer.sourceFactory.resolveUri(librarySource, uri);
+        partUri = partSource.uri.toString();
+      } else {
+        partUri = referencedLibraryUri;
+      }
+      return <String>[referencedLibraryUri, partUri, name];
+    }
+    LinkedDependency dependency = linkedLibrary.dependencies[dependencyIndex];
+    Source referencedLibrarySource = summaryResynthesizer.sourceFactory
+        .resolveUri(librarySource, dependency.uri);
+    String referencedLibraryUri = referencedLibrarySource.uri.toString();
+    String partUri;
+    if (unit != 0) {
+      String uri = dependency.parts[unit - 1];
+      Source partSource = summaryResynthesizer.sourceFactory
+          .resolveUri(referencedLibrarySource, uri);
+      partUri = partSource.uri.toString();
+    } else {
+      partUri = referencedLibraryUri;
+    }
+    return <String>[referencedLibraryUri, partUri, name];
+  }
+
+  /**
+   * Populate a [CompilationUnitElement] by deserializing all the elements
+   * contained in it.
+   */
+  void populateUnit(_UnitResynthesizer unitResynthesized) {
+    // TODO(scheglov)
+    unitResynthesized.populateUnit();
+    String absoluteUri = unitResynthesized.unit.source.uri.toString();
+    resynthesizedUnits[absoluteUri] = unitResynthesized.unit;
+    resynthesizedElements[absoluteUri] = unitResynthesized.elementMap;
+  }
+}
+
+/**
+ * Data structure used during resynthesis to record all the information that is
+ * known about how to resynthesize a single entry in [LinkedUnit.references]
+ * (and its associated entry in [UnlinkedUnit.references], if it exists).
+ */
+class _ReferenceInfo {
+  /**
+   * The enclosing [_ReferenceInfo], or `null` for top-level elements.
+   */
+  final _ReferenceInfo enclosing;
+
+  /**
+   * The name of the entity referred to by this reference.
+   */
+  final String name;
+
+  /**
+   * The element referred to by this reference, or `null` if there is no
+   * associated element (e.g. because it is a reference to an undefined
+   * entity).
+   */
+  final Element element;
+
+  /**
+   * If this reference refers to a non-generic type, the type it refers to.
+   * Otherwise `null`.
+   */
+  DartType type;
+
+  /**
+   * The number of type parameters accepted by the entity referred to by this
+   * reference, or zero if it doesn't accept any type parameters.
+   */
+  final int numTypeParameters;
+
+  /**
+   * Create a new [_ReferenceInfo] object referring to an element called [name]
+   * via the element handle [element], and having [numTypeParameters] type
+   * parameters.
+   *
+   * For the special types `dynamic` and `void`, [specialType] should point to
+   * the type itself.  Otherwise, pass `null` and the type will be computed
+   * when appropriate.
+   */
+  _ReferenceInfo(this.enclosing, this.name, this.element, DartType specialType,
+      this.numTypeParameters) {
+    if (specialType != null) {
+      type = specialType;
+    } else {
+      type = _buildType((_) => DynamicTypeImpl.instance, const []);
+    }
+  }
+
+  /**
+   * Build a [DartType] corresponding to the result of applying some type
+   * arguments to the entity referred to by this [_ReferenceInfo].  The type
+   * arguments are retrieved by calling [getTypeArgument].
+   *
+   * If [implicitFunctionTypeIndices] is not empty, a [DartType] should be
+   * created which refers to a function type implicitly defined by one of the
+   * element's parameters.  [implicitFunctionTypeIndices] is interpreted as in
+   * [EntityRef.implicitFunctionTypeIndices].
+   *
+   * If the entity referred to by this [_ReferenceInfo] is not a type, `null`
+   * is returned.
+   */
+  DartType buildType(
+      DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
+    DartType result =
+        (numTypeParameters == 0 && implicitFunctionTypeIndices.isEmpty)
+            ? type
+            : _buildType(getTypeArgument, implicitFunctionTypeIndices);
+    if (result == null) {
+      // TODO(paulberry): figure out how to handle this case (which should
+      // only occur in the event of erroneous code).
+      throw new UnimplementedError();
+    }
+    return result;
+  }
+
+  /**
+   * If this reference refers to a type, build a [DartType] which instantiates
+   * it with type arguments returned by [getTypeArgument].  Otherwise return
+   * `null`.
+   *
+   * If [implicitFunctionTypeIndices] is not null, a [DartType] should be
+   * created which refers to a function type implicitly defined by one of the
+   * element's parameters.  [implicitFunctionTypeIndices] is interpreted as in
+   * [EntityRef.implicitFunctionTypeIndices].
+   */
+  DartType _buildType(
+      DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
+    ElementHandle element = this.element; // To allow type promotion
+    if (element is ClassElementHandle) {
+      return new InterfaceTypeImpl.elementWithNameAndArgs(element, name,
+          _buildTypeArguments(numTypeParameters, getTypeArgument));
+    } else if (element is FunctionTypeAliasElementHandle) {
+      return new FunctionTypeImpl.elementWithNameAndArgs(
+          element,
+          name,
+          _buildTypeArguments(numTypeParameters, getTypeArgument),
+          numTypeParameters != 0);
+    } else if (element is FunctionTypedElement) {
+      int numTypeArguments;
+      FunctionTypedElementComputer computer;
+      if (implicitFunctionTypeIndices.isNotEmpty) {
+        numTypeArguments = numTypeParameters;
+        computer = () {
+          FunctionTypedElement element = this.element;
+          for (int index in implicitFunctionTypeIndices) {
+            element = element.parameters[index].type.element;
+          }
+          return element;
+        };
+      } 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 == null ? 0 : enclosing.numTypeParameters;
+        computer = () => this.element;
+      }
+      // TODO(paulberry): Is it a bug that we have to pass `false` for
+      // isInstantiated?
+      return new DeferredFunctionTypeImpl(computer, null,
+          _buildTypeArguments(numTypeArguments, getTypeArgument), false);
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Build a list of type arguments having length [numTypeArguments] where each
+   * type argument is obtained by calling [getTypeArgument].
+   */
+  List<DartType> _buildTypeArguments(
+      int numTypeArguments, DartType getTypeArgument(int i)) {
+    List<DartType> typeArguments = const <DartType>[];
+    if (numTypeArguments != 0) {
+      typeArguments = <DartType>[];
+      for (int i = 0; i < numTypeArguments; i++) {
+        typeArguments.add(getTypeArgument(i));
+      }
+    }
+    return typeArguments;
+  }
+}
+
+/**
+ * An instance of [_UnitResynthesizer] is responsible for resynthesizing the
+ * elements in a single unit from that unit's summary.
+ */
+class _UnitResynthesizer {
+  /**
+   * The [_LibraryResynthesizer] which is being used to obtain summaries.
+   */
+  final _LibraryResynthesizer libraryResynthesizer;
+
+  /**
+   * The [UnlinkedUnit] from which elements are currently being resynthesized.
+   */
+  final UnlinkedUnit unlinkedUnit;
+
+  /**
+   * The [LinkedUnit] from which elements are currently being resynthesized.
+   */
+  final LinkedUnit linkedUnit;
+
+  /**
+   * The [CompilationUnitElementImpl] for the compilation unit currently being
+   * resynthesized.
+   */
+  final CompilationUnitElementImpl unit;
+
+  /**
+   * [ElementHolder] into which resynthesized elements should be placed.  This
+   * object is recreated afresh for each unit in the library, and is used to
+   * populate the [CompilationUnitElement].
+   */
+  final ElementHolder unitHolder = new ElementHolder();
+
+  /**
+   * Map of top-level elements that have been resynthesized so far.  The key is
+   * the name of the top level element.
+   */
+  Map<String, Element> elementMap = <String, Element>{};
+
+  /**
+   * Map from slot id to the corresponding [EntityRef] object for linked types
+   * (i.e. propagated and inferred types).
+   */
+  final Map<int, EntityRef> linkedTypeMap = <int, EntityRef>{};
+
+  /**
+   * Set of slot ids corresponding to const constructors that are part of
+   * cycles.
+   */
+  Set<int> constCycles;
+
+  /**
+   * The [ConstructorElementImpl] for the constructor currently being
+   * resynthesized.
+   */
+  ConstructorElementImpl currentConstructor;
+
   /**
    * Type parameters for the generic class, typedef, or executable currently
    * being resynthesized, if any.  This is a list of lists; if multiple
@@ -910,11 +1443,20 @@
    */
   List<_ReferenceInfo> referenceInfos;
 
-  _LibraryResynthesizer(this.summaryResynthesizer, this.linkedLibrary,
-      this.unlinkedUnits, this.librarySource) {
-    isCoreLibrary = librarySource.uri.toString() == 'dart:core';
+  _UnitResynthesizer(this.libraryResynthesizer, this.unlinkedUnit,
+      this.linkedUnit, this.unit) {
+    for (EntityRef t in linkedUnit.types) {
+      linkedTypeMap[t.slot] = t;
+    }
+    constCycles = linkedUnit.constCycles.toSet();
+    populateReferenceInfos();
   }
 
+  SummaryResynthesizer get summaryResynthesizer =>
+      libraryResynthesizer.summaryResynthesizer;
+
+  TypeProvider get typeProvider => summaryResynthesizer.typeProvider;
+
   /**
    * Build the annotations for the given [element].
    */
@@ -923,7 +1465,7 @@
     if (serializedAnnotations.isNotEmpty) {
       element.metadata = serializedAnnotations.map((UnlinkedConst a) {
         ElementAnnotationImpl elementAnnotation =
-            new ElementAnnotationImpl(this.currentCompilationUnit);
+            new ElementAnnotationImpl(this.unit);
         Expression constExpr = _buildConstExpression(a);
         if (constExpr is Identifier) {
           elementAnnotation.element = constExpr.staticElement;
@@ -953,6 +1495,23 @@
    * Resynthesize a [ClassElement] and place it in [unitHolder].
    */
   void buildClass(UnlinkedClass serializedClass) {
+    ClassElement classElement;
+    if (libraryResynthesizer.isCoreLibrary &&
+        serializedClass.supertype == null) {
+      classElement = buildClassImpl(serializedClass);
+      if (!serializedClass.hasNoSupertype) {
+        libraryResynthesizer.delayedObjectSubclasses.add(classElement);
+      }
+    } else {
+      classElement = new _DeferredClassElement(this, unit, serializedClass);
+    }
+    unitHolder.addType(classElement);
+  }
+
+  /**
+   * Resynthesize a [ClassElementImpl].
+   */
+  ClassElementImpl buildClassImpl(UnlinkedClass serializedClass) {
     ClassElementImpl classElement =
         new ClassElementImpl(serializedClass.name, serializedClass.nameOffset);
     classElement.hasBeenInferred = summaryResynthesizer.strongMode;
@@ -963,12 +1522,8 @@
     InterfaceTypeImpl correspondingType = new InterfaceTypeImpl(classElement);
     if (serializedClass.supertype != null) {
       classElement.supertype = buildType(serializedClass.supertype);
-    } else if (!serializedClass.hasNoSupertype) {
-      if (isCoreLibrary) {
-        delayedObjectSubclasses.add(classElement);
-      } else {
-        classElement.supertype = summaryResynthesizer.typeProvider.objectType;
-      }
+    } else if (!libraryResynthesizer.isCoreLibrary) {
+      classElement.supertype = typeProvider.objectType;
     }
     classElement.interfaces =
         serializedClass.interfaces.map(buildType).toList();
@@ -1022,11 +1577,11 @@
     buildAnnotations(classElement, serializedClass.annotations);
     buildCodeRange(classElement, serializedClass.codeRange);
     resolveConstructorInitializers(classElement);
-    unitHolder.addType(classElement);
     currentTypeParameters.removeLast();
     assert(currentTypeParameters.isEmpty);
     fields = null;
     constructors = null;
+    return classElement;
   }
 
   void buildCodeRange(ElementImpl element, CodeRange codeRange) {
@@ -1116,8 +1671,7 @@
         currentConstructor.redirectedConstructor = _createConstructorElement(
             _createConstructorDefiningType(info, typeArguments), info);
       } else {
-        List<String> locationComponents =
-            currentCompilationUnit.location.components.toList();
+        List<String> locationComponents = unit.location.components.toList();
         locationComponents.add(classType.name);
         locationComponents.add(serializedExecutable.redirectedConstructorName);
         currentConstructor.redirectedConstructor =
@@ -1149,13 +1703,13 @@
    * associated fields and implicit accessors.
    */
   void buildEnum(UnlinkedEnum serializedEnum) {
-    assert(!isCoreLibrary);
+    assert(!libraryResynthesizer.isCoreLibrary);
     ClassElementImpl classElement =
         new ClassElementImpl(serializedEnum.name, serializedEnum.nameOffset);
     classElement.enum2 = true;
     InterfaceType enumType = new InterfaceTypeImpl(classElement);
     classElement.type = enumType;
-    classElement.supertype = summaryResynthesizer.typeProvider.objectType;
+    classElement.supertype = typeProvider.objectType;
     buildDocumentation(classElement, serializedEnum.documentationComment);
     buildAnnotations(classElement, serializedEnum.annotations);
     buildCodeRange(classElement, serializedEnum.codeRange);
@@ -1164,7 +1718,7 @@
     FieldElementImpl indexField = new FieldElementImpl('index', -1);
     indexField.final2 = true;
     indexField.synthetic = true;
-    indexField.type = summaryResynthesizer.typeProvider.intType;
+    indexField.type = typeProvider.intType;
     memberHolder.addField(indexField);
     buildImplicitAccessors(indexField, memberHolder);
     // Build the 'values' field.
@@ -1172,8 +1726,7 @@
     valuesField.synthetic = true;
     valuesField.const3 = true;
     valuesField.static = true;
-    valuesField.type = summaryResynthesizer.typeProvider.listType
-        .instantiate(<DartType>[enumType]);
+    valuesField.type = typeProvider.listType.instantiate(<DartType>[enumType]);
     memberHolder.addField(valuesField);
     buildImplicitAccessors(valuesField, memberHolder);
     // Build fields for all enum constants.
@@ -1189,8 +1742,7 @@
       field.type = enumType;
       // Create a value for the constant.
       Map<String, DartObjectImpl> fieldMap = <String, DartObjectImpl>{
-        fieldName: new DartObjectImpl(
-            summaryResynthesizer.typeProvider.intType, new IntState(i))
+        fieldName: new DartObjectImpl(typeProvider.intType, new IntState(i))
       };
       DartObjectImpl value =
           new DartObjectImpl(enumType, new GenericState(fieldMap));
@@ -1325,86 +1877,6 @@
   }
 
   /**
-   * Resynthesize an [ExportElement],
-   */
-  ExportElement buildExport(UnlinkedExportPublic serializedExportPublic,
-      UnlinkedExportNonPublic serializedExportNonPublic) {
-    ExportElementImpl exportElement =
-        new ExportElementImpl(serializedExportNonPublic.offset);
-    String exportedLibraryUri = summaryResynthesizer.sourceFactory
-        .resolveUri(librarySource, serializedExportPublic.uri)
-        .uri
-        .toString();
-    exportElement.exportedLibrary = new LibraryElementHandle(
-        summaryResynthesizer,
-        new ElementLocationImpl.con3(<String>[exportedLibraryUri]));
-    exportElement.uri = serializedExportPublic.uri;
-    exportElement.combinators =
-        serializedExportPublic.combinators.map(buildCombinator).toList();
-    exportElement.uriOffset = serializedExportNonPublic.uriOffset;
-    exportElement.uriEnd = serializedExportNonPublic.uriEnd;
-    buildAnnotations(exportElement, serializedExportNonPublic.annotations);
-    return exportElement;
-  }
-
-  /**
-   * Build an [ElementHandle] referring to the entity referred to by the given
-   * [exportName].
-   */
-  ElementHandle buildExportName(LinkedExportName exportName) {
-    String name = exportName.name;
-    if (exportName.kind == ReferenceKind.topLevelPropertyAccessor &&
-        !name.endsWith('=')) {
-      name += '?';
-    }
-    ElementLocationImpl location = new ElementLocationImpl.con3(
-        getReferencedLocationComponents(
-            exportName.dependency, exportName.unit, name));
-    switch (exportName.kind) {
-      case ReferenceKind.classOrEnum:
-        return new ClassElementHandle(summaryResynthesizer, location);
-      case ReferenceKind.typedef:
-        return new FunctionTypeAliasElementHandle(
-            summaryResynthesizer, location);
-      case ReferenceKind.topLevelFunction:
-        return new FunctionElementHandle(summaryResynthesizer, location);
-      case ReferenceKind.topLevelPropertyAccessor:
-        return new PropertyAccessorElementHandle(
-            summaryResynthesizer, location);
-      case ReferenceKind.constructor:
-      case ReferenceKind.function:
-      case ReferenceKind.propertyAccessor:
-      case ReferenceKind.method:
-      case ReferenceKind.length:
-      case ReferenceKind.prefix:
-      case ReferenceKind.unresolved:
-      case ReferenceKind.variable:
-        // Should never happen.  Exported names never refer to import prefixes,
-        // and they always refer to defined top-level entities.
-        throw new StateError('Unexpected export name kind: ${exportName.kind}');
-    }
-  }
-
-  /**
-   * Build the export namespace for the library by aggregating together its
-   * [publicNamespace] and [exportNames].
-   */
-  Namespace buildExportNamespace(
-      Namespace publicNamespace, List<LinkedExportName> exportNames) {
-    HashMap<String, Element> definedNames = new HashMap<String, Element>();
-    // Start by populating all the public names from [publicNamespace].
-    publicNamespace.definedNames.forEach((String name, Element element) {
-      definedNames[name] = element;
-    });
-    // Add all the names from [exportNames].
-    for (LinkedExportName exportName in exportNames) {
-      definedNames.putIfAbsent(
-          exportName.name, () => buildExportName(exportName));
-    }
-    return new Namespace(definedNames);
-  }
-
-  /**
    * Build the implicit getter and setter associated with [element], and place
    * them in [holder].
    */
@@ -1485,125 +1957,6 @@
   }
 
   /**
-   * Resynthesize an [ImportElement].
-   */
-  ImportElement buildImport(UnlinkedImport serializedImport, int dependency) {
-    bool isSynthetic = serializedImport.isImplicit;
-    ImportElementImpl importElement =
-        new ImportElementImpl(isSynthetic ? -1 : serializedImport.offset);
-    String absoluteUri = summaryResynthesizer.sourceFactory
-        .resolveUri(librarySource, linkedLibrary.dependencies[dependency].uri)
-        .uri
-        .toString();
-    importElement.importedLibrary = new LibraryElementHandle(
-        summaryResynthesizer,
-        new ElementLocationImpl.con3(<String>[absoluteUri]));
-    if (isSynthetic) {
-      importElement.synthetic = true;
-    } else {
-      importElement.uri = serializedImport.uri;
-      importElement.uriOffset = serializedImport.uriOffset;
-      importElement.uriEnd = serializedImport.uriEnd;
-      importElement.deferred = serializedImport.isDeferred;
-      buildAnnotations(importElement, serializedImport.annotations);
-    }
-    importElement.prefixOffset = serializedImport.prefixOffset;
-    if (serializedImport.prefixReference != 0) {
-      UnlinkedReference serializedPrefix =
-          unlinkedUnits[0].references[serializedImport.prefixReference];
-      importElement.prefix = new PrefixElementImpl(
-          serializedPrefix.name, serializedImport.prefixOffset);
-    }
-    importElement.combinators =
-        serializedImport.combinators.map(buildCombinator).toList();
-    return importElement;
-  }
-
-  /**
-   * Main entry point.  Resynthesize the [LibraryElement] and return it.
-   */
-  LibraryElement buildLibrary() {
-    CompilationUnitElementImpl definingCompilationUnit =
-        new CompilationUnitElementImpl(librarySource.shortName);
-    prepareUnit(definingCompilationUnit, 0);
-    bool hasName = unlinkedUnits[0].libraryName.isNotEmpty;
-    LibraryElementImpl library = new LibraryElementImpl(
-        summaryResynthesizer.context,
-        unlinkedUnits[0].libraryName,
-        hasName ? unlinkedUnits[0].libraryNameOffset : -1,
-        unlinkedUnits[0].libraryNameLength);
-    buildDocumentation(library, unlinkedUnits[0].libraryDocumentationComment);
-    buildAnnotations(library, unlinkedUnits[0].libraryAnnotations);
-    library.definingCompilationUnit = definingCompilationUnit;
-    definingCompilationUnit.source = librarySource;
-    definingCompilationUnit.librarySource = librarySource;
-    List<CompilationUnitElement> parts = <CompilationUnitElement>[];
-    UnlinkedUnit unlinkedDefiningUnit = unlinkedUnits[0];
-    assert(unlinkedDefiningUnit.publicNamespace.parts.length + 1 ==
-        linkedLibrary.units.length);
-    for (int i = 1; i < linkedLibrary.units.length; i++) {
-      CompilationUnitElementImpl part = buildPart(
-          unlinkedDefiningUnit.publicNamespace.parts[i - 1],
-          unlinkedDefiningUnit.parts[i - 1],
-          unlinkedUnits[i]);
-      parts.add(part);
-    }
-    library.parts = parts;
-    List<ImportElement> imports = <ImportElement>[];
-    for (int i = 0; i < unlinkedDefiningUnit.imports.length; i++) {
-      imports.add(buildImport(unlinkedDefiningUnit.imports[i],
-          linkedLibrary.importDependencies[i]));
-    }
-    library.imports = imports;
-    List<ExportElement> exports = <ExportElement>[];
-    assert(unlinkedDefiningUnit.exports.length ==
-        unlinkedDefiningUnit.publicNamespace.exports.length);
-    for (int i = 0; i < unlinkedDefiningUnit.exports.length; i++) {
-      exports.add(buildExport(unlinkedDefiningUnit.publicNamespace.exports[i],
-          unlinkedDefiningUnit.exports[i]));
-    }
-    library.exports = exports;
-    populateUnit(definingCompilationUnit, 0);
-    finishUnit();
-    for (int i = 0; i < parts.length; i++) {
-      prepareUnit(parts[i], i + 1);
-      populateUnit(parts[i], i + 1);
-      finishUnit();
-    }
-    BuildLibraryElementUtils.patchTopLevelAccessors(library);
-    // Update delayed Object class references.
-    if (isCoreLibrary) {
-      ClassElement objectElement = library.getType('Object');
-      assert(objectElement != null);
-      for (ClassElementImpl classElement in delayedObjectSubclasses) {
-        classElement.supertype = objectElement.type;
-      }
-    }
-    // Compute namespaces.
-    library.publicNamespace =
-        new NamespaceBuilder().createPublicNamespaceForLibrary(library);
-    library.exportNamespace = buildExportNamespace(
-        library.publicNamespace, linkedLibrary.exportNames);
-    // Find the entry point.  Note: we can't use element.isEntryPoint because
-    // that will trigger resynthesis of exported libraries.
-    Element entryPoint =
-        library.exportNamespace.get(FunctionElement.MAIN_FUNCTION_NAME);
-    if (entryPoint is FunctionElement) {
-      library.entryPoint = entryPoint;
-    }
-    // Create the synthetic element for `loadLibrary`.
-    // Until the client received dart:core and dart:async, we cannot do this,
-    // because the TypeProvider is not fully initialized. So, it is up to the
-    // Dart SDK client to initialize TypeProvider and finish the dart:core and
-    // dart:async libraries creation.
-    if (library.name != 'dart.core' && library.name != 'dart.async') {
-      library.createLoadLibraryFunction(summaryResynthesizer.typeProvider);
-    }
-    // Done.
-    return library;
-  }
-
-  /**
    * Build the appropriate [DartType] object corresponding to a slot id in the
    * [LinkedUnit.types] table.
    */
@@ -1732,8 +2085,8 @@
       if (serializedParameter.isInitializingFormal &&
           serializedParameter.type == null) {
         // The type is inherited from the matching field.
-        parameterElement.type = fields[serializedParameter.name]?.type ??
-            summaryResynthesizer.typeProvider.dynamicType;
+        parameterElement.type =
+            fields[serializedParameter.name]?.type ?? DynamicTypeImpl.instance;
       } else {
         parameterElement.type =
             buildLinkedType(serializedParameter.inferredTypeSlot) ??
@@ -1761,25 +2114,6 @@
   }
 
   /**
-   * Create, but do not populate, the [CompilationUnitElement] for a part other
-   * than the defining compilation unit.
-   */
-  CompilationUnitElementImpl buildPart(
-      String uri, UnlinkedPart partDecl, UnlinkedUnit serializedPart) {
-    Source unitSource =
-        summaryResynthesizer.sourceFactory.resolveUri(librarySource, uri);
-    CompilationUnitElementImpl partUnit =
-        new CompilationUnitElementImpl(unitSource.shortName);
-    partUnit.uriOffset = partDecl.uriOffset;
-    partUnit.uriEnd = partDecl.uriEnd;
-    partUnit.source = unitSource;
-    partUnit.librarySource = librarySource;
-    partUnit.uri = uri;
-    buildAnnotations(partUnit, partDecl.annotations);
-    return partUnit;
-  }
-
-  /**
    * Handle the parts that are common to top level variables and fields.
    */
   void buildPropertyIntroducingElementCommonParts(
@@ -1801,7 +2135,7 @@
       if (defaultVoid) {
         return VoidTypeImpl.instance;
       } else {
-        return summaryResynthesizer.typeProvider.dynamicType;
+        return DynamicTypeImpl.instance;
       }
     }
     if (type.paramReference != 0) {
@@ -1822,7 +2156,7 @@
         if (i < type.typeArguments.length) {
           return buildType(type.typeArguments[i]);
         } else {
-          return summaryResynthesizer.typeProvider.dynamicType;
+          return DynamicTypeImpl.instance;
         }
       }
       _ReferenceInfo referenceInfo = referenceInfos[type.reference];
@@ -1975,20 +2309,6 @@
   }
 
   /**
-   * Tear down data structures used during deserialization of a compilation
-   * unit.
-   */
-  void finishUnit() {
-    unitHolder = null;
-    linkedUnit = null;
-    unlinkedUnit = null;
-    linkedTypeMap = null;
-    constCycles = null;
-    referenceInfos = null;
-    currentCompilationUnit = null;
-  }
-
-  /**
    * Return a list of type arguments corresponding to [currentTypeParameters],
    * skipping the innermost [skipLevels] nesting levels.
    *
@@ -2008,42 +2328,6 @@
   }
 
   /**
-   * Build the components of an [ElementLocationImpl] for the entity in the
-   * given [unit] of the dependency located at [dependencyIndex], and having
-   * the given [name].
-   */
-  List<String> getReferencedLocationComponents(
-      int dependencyIndex, int unit, String name) {
-    if (dependencyIndex == 0) {
-      String referencedLibraryUri = librarySource.uri.toString();
-      String partUri;
-      if (unit != 0) {
-        String uri = unlinkedUnits[0].publicNamespace.parts[unit - 1];
-        Source partSource =
-            summaryResynthesizer.sourceFactory.resolveUri(librarySource, uri);
-        partUri = partSource.uri.toString();
-      } else {
-        partUri = referencedLibraryUri;
-      }
-      return <String>[referencedLibraryUri, partUri, name];
-    }
-    LinkedDependency dependency = linkedLibrary.dependencies[dependencyIndex];
-    Source referencedLibrarySource = summaryResynthesizer.sourceFactory
-        .resolveUri(librarySource, dependency.uri);
-    String referencedLibraryUri = referencedLibrarySource.uri.toString();
-    String partUri;
-    if (unit != 0) {
-      String uri = dependency.parts[unit - 1];
-      Source partSource = summaryResynthesizer.sourceFactory
-          .resolveUri(referencedLibrarySource, uri);
-      partUri = partSource.uri.toString();
-    } else {
-      partUri = referencedLibraryUri;
-    }
-    return <String>[referencedLibraryUri, partUri, name];
-  }
-
-  /**
    * Get the type parameter from the surrounding scope whose De Bruijn index is
    * [index].
    */
@@ -2086,10 +2370,10 @@
       DartType type;
       int numTypeParameters = linkedReference.numTypeParameters;
       if (linkedReference.kind == ReferenceKind.unresolved) {
-        type = summaryResynthesizer.typeProvider.undefinedType;
+        type = UndefinedTypeImpl.instance;
         element = null;
       } else if (name == 'dynamic') {
-        type = summaryResynthesizer.typeProvider.dynamicType;
+        type = DynamicTypeImpl.instance;
         element = type.element;
       } else if (name == 'void') {
         type = VoidTypeImpl.instance;
@@ -2106,8 +2390,9 @@
           locationComponents.add(identifier);
         } else {
           String identifier = _getElementIdentifier(name, linkedReference.kind);
-          locationComponents = getReferencedLocationComponents(
-              linkedReference.dependency, linkedReference.unit, identifier);
+          locationComponents =
+              libraryResynthesizer.getReferencedLocationComponents(
+                  linkedReference.dependency, linkedReference.unit, identifier);
         }
         ElementLocation location =
             new ElementLocationImpl.con3(locationComponents);
@@ -2183,13 +2468,12 @@
    * Populate a [CompilationUnitElement] by deserializing all the elements
    * contained in it.
    */
-  void populateUnit(CompilationUnitElementImpl unit, int unitNum) {
+  void populateUnit() {
     unlinkedUnit.classes.forEach(buildClass);
     unlinkedUnit.enums.forEach(buildEnum);
     unlinkedUnit.executables.forEach(buildExecutable);
     unlinkedUnit.typedefs.forEach(buildTypedef);
     unlinkedUnit.variables.forEach(buildVariable);
-    String absoluteUri = unit.source.uri.toString();
     unit.accessors = unitHolder.accessors;
     unit.enums = unitHolder.enums;
     unit.functions = unitHolder.functions;
@@ -2202,7 +2486,6 @@
     unit.typeAliases = typeAliases.where((e) => !e.isSynthetic).toList();
     unit.types = unitHolder.types;
     unit.topLevelVariables = unitHolder.topLevelVariables;
-    Map<String, Element> elementMap = <String, Element>{};
     for (ClassElement cls in unit.types) {
       elementMap[cls.name] = cls;
     }
@@ -2219,28 +2502,10 @@
       elementMap[accessor.identifier] = accessor;
     }
     buildCodeRange(unit, unlinkedUnit.codeRange);
-    resynthesizedUnits[absoluteUri] = unit;
-    resynthesizedElements[absoluteUri] = elementMap;
     assert(currentTypeParameters.isEmpty);
   }
 
   /**
-   * Set up data structures for deserializing a compilation unit.
-   */
-  void prepareUnit(CompilationUnitElementImpl unit, int unitNum) {
-    linkedUnit = linkedLibrary.units[unitNum];
-    unlinkedUnit = unlinkedUnits[unitNum];
-    linkedTypeMap = <int, EntityRef>{};
-    currentCompilationUnit = unit;
-    for (EntityRef t in linkedUnit.types) {
-      linkedTypeMap[t.slot] = t;
-    }
-    constCycles = linkedUnit.constCycles.toSet();
-    populateReferenceInfos();
-    unitHolder = new ElementHolder();
-  }
-
-  /**
    * Constructor initializers can reference fields and other constructors of
    * the same class, including forward references. So, we need to delay
    * resolution until after class elements are built.
@@ -2333,149 +2598,3 @@
     return name;
   }
 }
-
-/**
- * Data structure used during resynthesis to record all the information that is
- * known about how to resynthesize a single entry in [LinkedUnit.references]
- * (and its associated entry in [UnlinkedUnit.references], if it exists).
- */
-class _ReferenceInfo {
-  /**
-   * The enclosing [_ReferenceInfo], or `null` for top-level elements.
-   */
-  final _ReferenceInfo enclosing;
-
-  /**
-   * The name of the entity referred to by this reference.
-   */
-  final String name;
-
-  /**
-   * The element referred to by this reference, or `null` if there is no
-   * associated element (e.g. because it is a reference to an undefined
-   * entity).
-   */
-  final Element element;
-
-  /**
-   * If this reference refers to a non-generic type, the type it refers to.
-   * Otherwise `null`.
-   */
-  DartType type;
-
-  /**
-   * The number of type parameters accepted by the entity referred to by this
-   * reference, or zero if it doesn't accept any type parameters.
-   */
-  final int numTypeParameters;
-
-  /**
-   * Create a new [_ReferenceInfo] object referring to an element called [name]
-   * via the element handle [element], and having [numTypeParameters] type
-   * parameters.
-   *
-   * For the special types `dynamic` and `void`, [specialType] should point to
-   * the type itself.  Otherwise, pass `null` and the type will be computed
-   * when appropriate.
-   */
-  _ReferenceInfo(this.enclosing, this.name, this.element, DartType specialType,
-      this.numTypeParameters) {
-    if (specialType != null) {
-      type = specialType;
-    } else {
-      type = _buildType((_) => DynamicTypeImpl.instance, const []);
-    }
-  }
-
-  /**
-   * Build a [DartType] corresponding to the result of applying some type
-   * arguments to the entity referred to by this [_ReferenceInfo].  The type
-   * arguments are retrieved by calling [getTypeArgument].
-   *
-   * If [implicitFunctionTypeIndices] is not empty, a [DartType] should be
-   * created which refers to a function type implicitly defined by one of the
-   * element's parameters.  [implicitFunctionTypeIndices] is interpreted as in
-   * [EntityRef.implicitFunctionTypeIndices].
-   *
-   * If the entity referred to by this [_ReferenceInfo] is not a type, `null`
-   * is returned.
-   */
-  DartType buildType(
-      DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
-    DartType result =
-        (numTypeParameters == 0 && implicitFunctionTypeIndices.isEmpty)
-            ? type
-            : _buildType(getTypeArgument, implicitFunctionTypeIndices);
-    if (result == null) {
-      // TODO(paulberry): figure out how to handle this case (which should
-      // only occur in the event of erroneous code).
-      throw new UnimplementedError();
-    }
-    return result;
-  }
-
-  /**
-   * If this reference refers to a type, build a [DartType] which instantiates
-   * it with type arguments returned by [getTypeArgument].  Otherwise return
-   * `null`.
-   *
-   * If [implicitFunctionTypeIndices] is not null, a [DartType] should be
-   * created which refers to a function type implicitly defined by one of the
-   * element's parameters.  [implicitFunctionTypeIndices] is interpreted as in
-   * [EntityRef.implicitFunctionTypeIndices].
-   */
-  DartType _buildType(
-      DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
-    ElementHandle element = this.element; // To allow type promotion
-    if (element is ClassElementHandle) {
-      return new InterfaceTypeImpl.elementWithNameAndArgs(element, name,
-          _buildTypeArguments(numTypeParameters, getTypeArgument));
-    } else if (element is FunctionTypeAliasElementHandle) {
-      return new FunctionTypeImpl.elementWithNameAndArgs(
-          element,
-          name,
-          _buildTypeArguments(numTypeParameters, getTypeArgument),
-          numTypeParameters != 0);
-    } else if (element is FunctionTypedElement) {
-      int numTypeArguments;
-      FunctionTypedElementComputer computer;
-      if (implicitFunctionTypeIndices.isNotEmpty) {
-        numTypeArguments = numTypeParameters;
-        computer = () {
-          FunctionTypedElement element = this.element;
-          for (int index in implicitFunctionTypeIndices) {
-            element = element.parameters[index].type.element;
-          }
-          return element;
-        };
-      } 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 == null ? 0 : enclosing.numTypeParameters;
-        computer = () => this.element;
-      }
-      // TODO(paulberry): Is it a bug that we have to pass `false` for
-      // isInstantiated?
-      return new DeferredFunctionTypeImpl(computer, null,
-          _buildTypeArguments(numTypeArguments, getTypeArgument), false);
-    } else {
-      return null;
-    }
-  }
-
-  /**
-   * Build a list of type arguments having length [numTypeArguments] where each
-   * type argument is obtained by calling [getTypeArgument].
-   */
-  List<DartType> _buildTypeArguments(
-      int numTypeArguments, DartType getTypeArgument(int i)) {
-    List<DartType> typeArguments = const <DartType>[];
-    if (numTypeArguments != 0) {
-      typeArguments = <DartType>[];
-      for (int i = 0; i < numTypeArguments; i++) {
-        typeArguments.add(getTypeArgument(i));
-      }
-    }
-    return typeArguments;
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index a527fba..715267b 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -255,6 +255,11 @@
   final Map<int, Map<String, int>> nameToReference = <int, Map<String, int>>{};
 
   /**
+   * True if the 'dart:core' library is been summarized.
+   */
+  bool isCoreLibrary = false;
+
+  /**
    * If the library has a library directive, the library name derived from it.
    * Otherwise `null`.
    */
@@ -375,6 +380,8 @@
         serializeTypeParameters(typeParameters, typeParameterScope);
     if (superclass != null) {
       b.supertype = serializeTypeName(superclass);
+    } else {
+      b.hasNoSupertype = isCoreLibrary && name == 'Object';
     }
     if (withClause != null) {
       b.mixins = withClause.mixinTypes.map(serializeTypeName).toList();
@@ -472,6 +479,36 @@
   }
 
   /**
+   * Serialize the given [declaredIdentifier] into [UnlinkedVariable], and
+   * store it in [variables].
+   */
+  void serializeDeclaredIdentifier(
+      AstNode scopeNode,
+      Comment documentationComment,
+      NodeList<Annotation> annotations,
+      bool isFinal,
+      bool isConst,
+      TypeName type,
+      bool assignPropagatedTypeSlot,
+      SimpleIdentifier declaredIdentifier) {
+    UnlinkedVariableBuilder b = new UnlinkedVariableBuilder();
+    b.isFinal = isFinal;
+    b.isConst = isConst;
+    b.name = declaredIdentifier.name;
+    b.nameOffset = declaredIdentifier.offset;
+    b.type = serializeTypeName(type);
+    b.documentationComment = serializeDocumentation(documentationComment);
+    b.annotations = serializeAnnotations(annotations);
+    b.codeRange = serializeCodeRange(declaredIdentifier);
+    if (assignPropagatedTypeSlot) {
+      b.propagatedTypeSlot = assignSlot();
+    }
+    b.visibleOffset = scopeNode?.offset;
+    b.visibleLength = scopeNode?.length;
+    this.variables.add(b);
+  }
+
+  /**
    * Serialize a [Comment] node into an [UnlinkedDocumentationComment] object.
    */
   UnlinkedDocumentationCommentBuilder serializeDocumentation(
@@ -521,7 +558,8 @@
     } else {
       b.kind = UnlinkedExecutableKind.functionOrMethod;
     }
-    b.isAbstract = body is EmptyFunctionBody;
+    b.isExternal = isExternal;
+    b.isAbstract = !isExternal && body is EmptyFunctionBody;
     b.name = nameString;
     b.nameOffset = nameOffset;
     b.typeParameters =
@@ -530,7 +568,6 @@
       b.isStatic = isDeclaredStatic;
     }
     b.returnType = serializeTypeName(returnType);
-    b.isExternal = isExternal;
     bool isSemanticallyStatic = isTopLevel || isDeclaredStatic;
     if (formalParameters != null) {
       b.parameters = formalParameters.parameters
@@ -769,6 +806,7 @@
    * in [this.variables].
    */
   void serializeVariables(
+      AstNode scopeNode,
       VariableDeclarationList variables,
       bool isDeclaredStatic,
       Comment documentationComment,
@@ -801,8 +839,8 @@
           (variable.initializer != null || !isSemanticallyStatic)) {
         b.inferredTypeSlot = assignSlot();
       }
-      b.visibleOffset = enclosingBlock?.offset;
-      b.visibleLength = enclosingBlock?.length;
+      b.visibleOffset = scopeNode?.offset;
+      b.visibleLength = scopeNode?.length;
       b.initializer = serializeInitializerFunction(variable.initializer);
       this.variables.add(b);
     }
@@ -817,6 +855,21 @@
   }
 
   @override
+  void visitCatchClause(CatchClause node) {
+    SimpleIdentifier exception = node.exceptionParameter;
+    SimpleIdentifier st = node.stackTraceParameter;
+    if (exception != null) {
+      serializeDeclaredIdentifier(
+          node, null, null, false, false, node.exceptionType, false, exception);
+    }
+    if (st != null) {
+      serializeDeclaredIdentifier(
+          node, null, null, false, false, null, false, st);
+    }
+    super.visitCatchClause(node);
+  }
+
+  @override
   void visitClassDeclaration(ClassDeclaration node) {
     TypeName superclass =
         node.extendsClause == null ? null : node.extendsClause.superclass;
@@ -890,6 +943,7 @@
     b.isExternal = node.externalKeyword != null;
     b.documentationComment = serializeDocumentation(node.documentationComment);
     b.annotations = serializeAnnotations(node.metadata);
+    b.codeRange = serializeCodeRange(node);
     if (node.constKeyword != null) {
       Set<String> constructorParameterNames =
           node.parameters.parameters.map((p) => p.identifier.name).toSet();
@@ -913,6 +967,7 @@
       b.defaultValueCode = node.defaultValue.toSource();
     }
     b.initializer = serializeInitializerFunction(node.defaultValue);
+    b.codeRange = serializeCodeRange(node);
     return b;
   }
 
@@ -944,7 +999,7 @@
 
   @override
   void visitFieldDeclaration(FieldDeclaration node) {
-    serializeVariables(node.fields, node.staticKeyword != null,
+    serializeVariables(null, node.fields, node.staticKeyword != null,
         node.documentationComment, node.metadata, true);
   }
 
@@ -964,6 +1019,30 @@
   }
 
   @override
+  void visitForEachStatement(ForEachStatement node) {
+    DeclaredIdentifier loopVariable = node.loopVariable;
+    serializeDeclaredIdentifier(
+        node,
+        loopVariable.documentationComment,
+        loopVariable.metadata,
+        loopVariable.isFinal,
+        loopVariable.isConst,
+        loopVariable.type,
+        true,
+        loopVariable.identifier);
+    super.visitForEachStatement(node);
+  }
+
+  @override
+  void visitForStatement(ForStatement node) {
+    VariableDeclarationList declaredVariables = node.variables;
+    if (declaredVariables != null) {
+      serializeVariables(node, declaredVariables, false, null, null, false);
+    }
+    super.visitForStatement(node);
+  }
+
+  @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     executables.add(serializeExecutable(
         node,
@@ -1060,12 +1139,14 @@
   @override
   void visitLabel(Label node) {
     AstNode parent = node.parent;
-    labels.add(new UnlinkedLabelBuilder(
-        name: node.label.name,
-        nameOffset: node.offset,
-        isOnSwitchMember: parent is SwitchMember,
-        isOnSwitchStatement:
-            parent is LabeledStatement && parent.statement is SwitchStatement));
+    if (parent is! NamedExpression) {
+      labels.add(new UnlinkedLabelBuilder(
+          name: node.label.name,
+          nameOffset: node.offset,
+          isOnSwitchMember: parent is SwitchMember,
+          isOnSwitchStatement: parent is LabeledStatement &&
+              parent.statement is SwitchStatement));
+    }
   }
 
   @override
@@ -1074,6 +1155,7 @@
         node.name.components.map((SimpleIdentifier id) => id.name).join('.');
     libraryNameOffset = node.name.offset;
     libraryNameLength = node.name.length;
+    isCoreLibrary = libraryName == 'dart.core';
     libraryDocumentationComment =
         serializeDocumentation(node.documentationComment);
     libraryAnnotations = serializeAnnotations(node.metadata);
@@ -1107,7 +1189,9 @@
   }
 
   @override
-  void visitPartOfDirective(PartOfDirective node) {}
+  void visitPartOfDirective(PartOfDirective node) {
+    isCoreLibrary = node.libraryName.name == 'dart.core';
+  }
 
   @override
   UnlinkedParamBuilder visitSimpleFormalParameter(SimpleFormalParameter node) {
@@ -1118,8 +1202,8 @@
 
   @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
-    serializeVariables(
-        node.variables, false, node.documentationComment, node.metadata, false);
+    serializeVariables(null, node.variables, false, node.documentationComment,
+        node.metadata, false);
   }
 
   @override
@@ -1137,7 +1221,8 @@
 
   @override
   void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    serializeVariables(node.variables, false, null, null, false);
+    serializeVariables(
+        enclosingBlock, node.variables, false, null, null, false);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/summary/summarize_elements.dart b/pkg/analyzer/lib/src/summary/summarize_elements.dart
index 798c152..09ea986 100644
--- a/pkg/analyzer/lib/src/summary/summarize_elements.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_elements.dart
@@ -138,6 +138,40 @@
   final List<String> _unlinkedUnitHashes = <String>[];
 
   /**
+   * Add a fallback library to the package bundle, corresponding to the library
+   * whose defining compilation unit is located at [source].  Caller must also
+   * call [addFallbackUnit] for all compilation units contained in the library
+   * (including the defining compilation unit).
+   */
+  void addFallbackLibrary(Source source) {
+    String uri = source.uri.toString();
+    _linkedLibraryUris.add(uri);
+    _linkedLibraries.add(new LinkedLibraryBuilder(fallbackMode: true));
+  }
+
+  /**
+   * Add a fallback compilation unit to the package bundle, corresponding to
+   * the compilation unit located at [source].
+   */
+  void addFallbackUnit(Source source) {
+    String uri = source.uri.toString();
+    _unlinkedUnitUris.add(uri);
+    _unlinkedUnits
+        .add(new UnlinkedUnitBuilder(fallbackModePath: source.fullName));
+  }
+
+  void addLinkedLibrary(String uri, LinkedLibraryBuilder library) {
+    _linkedLibraries.add(library);
+    _linkedLibraryUris.add(uri);
+  }
+
+  void addUnlinkedUnit(Source source, UnlinkedUnitBuilder unit) {
+    _unlinkedUnitUris.add(source.uri.toString());
+    _unlinkedUnits.add(unit);
+    _unlinkedUnitHashes.add(_hash(source.contents.data));
+  }
+
+  /**
    * Assemble a new [PackageBundleBuilder] using the gathered information.
    */
   PackageBundleBuilder assemble() {
@@ -312,7 +346,9 @@
     for (ClassElement enm in compilationUnit.enums) {
       if (enm.isPublic) {
         names.add(new UnlinkedPublicNameBuilder(
-            kind: ReferenceKind.classOrEnum, name: enm.name));
+            kind: ReferenceKind.classOrEnum,
+            name: enm.name,
+            members: serializeClassConstMembers(enm)));
       }
     }
     for (FunctionElement function in compilationUnit.functions) {
@@ -469,7 +505,8 @@
       return const <UnlinkedConstBuilder>[];
     }
     return element.metadata.map((ElementAnnotationImpl a) {
-      _ConstExprSerializer serializer = new _ConstExprSerializer(this, null);
+      _ConstExprSerializer serializer =
+          new _ConstExprSerializer(this, element, null);
       serializer.serializeAnnotation(a.annotationAst);
       return serializer.toBuilder();
     }).toList();
@@ -615,10 +652,11 @@
   /**
    * Serialize the given [expression], creating an [UnlinkedConstBuilder].
    */
-  UnlinkedConstBuilder serializeConstExpr(Expression expression,
+  UnlinkedConstBuilder serializeConstExpr(
+      Element context, Expression expression,
       [Set<String> constructorParameterNames]) {
     _ConstExprSerializer serializer =
-        new _ConstExprSerializer(this, constructorParameterNames);
+        new _ConstExprSerializer(this, context, constructorParameterNames);
     serializer.serialize(expression);
     return serializer.toBuilder();
   }
@@ -733,8 +771,8 @@
               .map((ConstructorInitializer initializer) =>
                   serializeConstructorInitializer(
                       initializer,
-                      (expr) =>
-                          serializeConstExpr(expr, constructorParameterNames)))
+                      (expr) => serializeConstExpr(
+                          executableElement, expr, constructorParameterNames)))
               .toList();
         }
       }
@@ -870,7 +908,7 @@
       ConstVariableElement constParameter = parameter as ConstVariableElement;
       Expression initializer = constParameter.constantInitializer;
       if (initializer != null) {
-        b.defaultValue = serializeConstExpr(initializer);
+        b.defaultValue = serializeConstExpr(parameter, initializer);
         b.defaultValueCode = parameter.defaultValueCode;
       }
     }
@@ -1084,7 +1122,7 @@
       ConstVariableElement constVariable = variable as ConstVariableElement;
       Expression initializer = constVariable.constantInitializer;
       if (initializer != null) {
-        b.constExpr = serializeConstExpr(initializer);
+        b.constExpr = serializeConstExpr(variable, initializer);
       }
     }
     if (variable is PropertyInducingElement) {
@@ -1248,6 +1286,7 @@
  */
 class _ConstExprSerializer extends AbstractConstExprSerializer {
   final _CompilationUnitSerializer serializer;
+  final Element context;
 
   /**
    * If a constructor initializer expression is being serialized, the names of
@@ -1255,7 +1294,8 @@
    */
   final Set<String> constructorParameterNames;
 
-  _ConstExprSerializer(this.serializer, this.constructorParameterNames);
+  _ConstExprSerializer(
+      this.serializer, this.context, this.constructorParameterNames);
 
   @override
   bool isConstructorParameterName(String name) {
@@ -1386,7 +1426,7 @@
       }
     }
     DartType type = typeName != null ? typeName.type : DynamicTypeImpl.instance;
-    return serializer.serializeTypeRef(type, null);
+    return serializer.serializeTypeRef(type, context);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index b366e13..8705dd8 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -46,7 +46,7 @@
  * The [ResultCachingPolicy] for ASTs.
  */
 const ResultCachingPolicy AST_CACHING_POLICY =
-    const SimpleResultCachingPolicy(8192, 8192);
+    const SimpleResultCachingPolicy(16384, 16384);
 
 /**
  * The [ResultCachingPolicy] for [Element]s.
diff --git a/pkg/analyzer/lib/src/task/html.dart b/pkg/analyzer/lib/src/task/html.dart
index 90e78bd..ae1fb0d 100644
--- a/pkg/analyzer/lib/src/task/html.dart
+++ b/pkg/analyzer/lib/src/task/html.dart
@@ -88,10 +88,6 @@
 
   @override
   bool exists() => source.exists();
-
-  @override
-  Uri resolveRelativeUri(Uri relativeUri) =>
-      throw new StateError('resolveRelativeUri not supported for scripts');
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/task/options_work_manager.dart b/pkg/analyzer/lib/src/task/options_work_manager.dart
index 4447f30..bade2fc 100644
--- a/pkg/analyzer/lib/src/task/options_work_manager.dart
+++ b/pkg/analyzer/lib/src/task/options_work_manager.dart
@@ -169,6 +169,7 @@
   }
 
   /// Return `true` if the given target is an `.analysis_options` source.
-  static bool _isOptionsSource(AnalysisTarget target) => target is Source &&
+  static bool _isOptionsSource(AnalysisTarget target) =>
+      target is Source &&
       AnalysisEngine.isAnalysisOptionsFileName(target.fullName);
 }
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 79da6a8..eaa8599 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -345,7 +345,8 @@
       // supertype of it, do an implicit downcast to Iterable<dynamic>. Then
       // we'll do a separate cast of the dynamic element to the variable's type.
       if (elementType == null) {
-        var sequenceType = sequenceInterface.instantiate([DynamicTypeImpl.instance]);
+        var sequenceType =
+            sequenceInterface.instantiate([DynamicTypeImpl.instance]);
 
         if (rules.isSubtypeOf(sequenceType, iterableType)) {
           _recordMessage(DownCast.create(
@@ -636,57 +637,6 @@
     }
   }
 
-  void _checkFieldAccess(AstNode node, AstNode target, SimpleIdentifier field) {
-    if ((_isDynamicTarget(target) || field.staticElement == null) &&
-        !_isObjectProperty(target, field)) {
-      _recordDynamicInvoke(node, target);
-    }
-    node.visitChildren(this);
-  }
-
-  void _checkReturnOrYield(Expression expression, AstNode node,
-      {bool yieldStar: false}) {
-    var body = node.getAncestor((n) => n is FunctionBody);
-    var type = _getExpectedReturnType(body, yieldStar: yieldStar);
-    if (type == null) {
-      // We have a type mismatch: the async/async*/sync* modifier does
-      // not match the return or yield type.  We should have already gotten an
-      // analyzer error in this case.
-      return;
-    }
-    InterfaceType futureType = typeProvider.futureType;
-    DartType actualType = expression?.staticType;
-    if (body.isAsynchronous &&
-        !body.isGenerator &&
-        actualType is InterfaceType &&
-        actualType.element == futureType.element) {
-      type = futureType.instantiate([type]);
-    }
-    // TODO(vsm): Enforce void or dynamic (to void?) when expression is null.
-    if (expression != null) checkAssignment(expression, type);
-  }
-
-  void _checkRuntimeTypeCheck(AstNode node, TypeName typeName) {
-    var type = getType(typeName);
-    if (!rules.isGroundType(type)) {
-      _recordMessage(new NonGroundTypeCheckInfo(node, type));
-    }
-  }
-
-  void _checkUnary(/*PrefixExpression|PostfixExpression*/ node) {
-    var op = node.operator;
-    if (op.isUserDefinableOperator ||
-        op.type == TokenType.PLUS_PLUS ||
-        op.type == TokenType.MINUS_MINUS) {
-      if (_isDynamicTarget(node.operand)) {
-        _recordDynamicInvoke(node, node.operand);
-      }
-      // For ++ and --, even if it is not dynamic, we still need to check
-      // that the user defined method accepts an `int` as the RHS.
-      // We assume Analyzer has done this already.
-    }
-  }
-
   /// Records a [DownCast] of [expr] from [from] to [to], if there is one.
   ///
   /// If [from] is omitted, uses the static type of [expr].
@@ -736,6 +686,57 @@
     }
   }
 
+  void _checkFieldAccess(AstNode node, AstNode target, SimpleIdentifier field) {
+    if ((_isDynamicTarget(target) || field.staticElement == null) &&
+        !_isObjectProperty(target, field)) {
+      _recordDynamicInvoke(node, target);
+    }
+    node.visitChildren(this);
+  }
+
+  void _checkReturnOrYield(Expression expression, AstNode node,
+      {bool yieldStar: false}) {
+    FunctionBody body = node.getAncestor((n) => n is FunctionBody);
+    var type = _getExpectedReturnType(body, yieldStar: yieldStar);
+    if (type == null) {
+      // We have a type mismatch: the async/async*/sync* modifier does
+      // not match the return or yield type.  We should have already gotten an
+      // analyzer error in this case.
+      return;
+    }
+    InterfaceType futureType = typeProvider.futureType;
+    DartType actualType = expression?.staticType;
+    if (body.isAsynchronous &&
+        !body.isGenerator &&
+        actualType is InterfaceType &&
+        actualType.element == futureType.element) {
+      type = futureType.instantiate([type]);
+    }
+    // TODO(vsm): Enforce void or dynamic (to void?) when expression is null.
+    if (expression != null) checkAssignment(expression, type);
+  }
+
+  void _checkRuntimeTypeCheck(AstNode node, TypeName typeName) {
+    var type = getType(typeName);
+    if (!rules.isGroundType(type)) {
+      _recordMessage(new NonGroundTypeCheckInfo(node, type));
+    }
+  }
+
+  void _checkUnary(/*PrefixExpression|PostfixExpression*/ node) {
+    var op = node.operator;
+    if (op.isUserDefinableOperator ||
+        op.type == TokenType.PLUS_PLUS ||
+        op.type == TokenType.MINUS_MINUS) {
+      if (_isDynamicTarget(node.operand)) {
+        _recordDynamicInvoke(node, node.operand);
+      }
+      // For ++ and --, even if it is not dynamic, we still need to check
+      // that the user defined method accepts an `int` as the RHS.
+      // We assume Analyzer has done this already.
+    }
+  }
+
   // Produce a coercion which coerces something of type fromT
   // to something of type toT.
   // Returns the error coercion if the types cannot be coerced
@@ -749,7 +750,8 @@
       functionType = _elementType(parent.element);
     } else {
       assert(parent is FunctionExpression);
-      functionType = parent.staticType ?? DynamicTypeImpl.instance;
+      functionType =
+          (parent as FunctionExpression).staticType ?? DynamicTypeImpl.instance;
     }
 
     var type = functionType.returnType;
@@ -804,55 +806,6 @@
     return t;
   }
 
-  /// Remove "fuzzy arrow" in this function type.
-  ///
-  /// Normally we treat dynamically typed parameters as bottom for function
-  /// types. This allows type tests such as `if (f is SingleArgFunction)`.
-  /// It also requires a dynamic check on the parameter type to call these
-  /// functions.
-  ///
-  /// When we convert to a strict arrow, dynamically typed parameters become
-  /// top. This is safe to do for known functions, like top-level or local
-  /// functions and static methods. Those functions must already be essentially
-  /// treating dynamic as top.
-  ///
-  /// Only the outer-most arrow can be strict. Any others must be fuzzy, because
-  /// we don't know what function value will be passed there.
-  // TODO(jmesserly): should we use a real "fuzzyArrow" bit on the function
-  // type? That would allow us to implement this in the subtype relation.
-  // TODO(jmesserly): we'll need to factor this differently if we want to
-  // move CodeChecker's functionality into existing analyzer. Likely we can
-  // let the Expression have a strict arrow, then in places were we do
-  // inference, convert back to a fuzzy arrow.
-  FunctionType _removeFuzz(FunctionType t) {
-    bool foundFuzz = false;
-    List<ParameterElement> parameters = <ParameterElement>[];
-    for (ParameterElement p in t.parameters) {
-      ParameterElement newP = _removeParameterFuzz(p);
-      parameters.add(newP);
-      if (p != newP) foundFuzz = true;
-    }
-    if (!foundFuzz) {
-      return t;
-    }
-
-    FunctionElementImpl function = new FunctionElementImpl("", -1);
-    function.synthetic = true;
-    function.returnType = t.returnType;
-    function.shareTypeParameters(t.typeFormals);
-    function.shareParameters(parameters);
-    return function.type = new FunctionTypeImpl(function);
-  }
-
-  /// Removes fuzzy arrow, see [_removeFuzz].
-  ParameterElement _removeParameterFuzz(ParameterElement p) {
-    if (p.type.isDynamic) {
-      return new ParameterElementImpl.synthetic(
-          p.name, typeProvider.objectType, p.parameterKind);
-    }
-    return p;
-  }
-
   /// Given an expression, return its type assuming it is
   /// in the caller position of a call (that is, accounting
   /// for the possibility of a call method).  Returns null
@@ -955,6 +908,55 @@
     }
   }
 
+  /// Remove "fuzzy arrow" in this function type.
+  ///
+  /// Normally we treat dynamically typed parameters as bottom for function
+  /// types. This allows type tests such as `if (f is SingleArgFunction)`.
+  /// It also requires a dynamic check on the parameter type to call these
+  /// functions.
+  ///
+  /// When we convert to a strict arrow, dynamically typed parameters become
+  /// top. This is safe to do for known functions, like top-level or local
+  /// functions and static methods. Those functions must already be essentially
+  /// treating dynamic as top.
+  ///
+  /// Only the outer-most arrow can be strict. Any others must be fuzzy, because
+  /// we don't know what function value will be passed there.
+  // TODO(jmesserly): should we use a real "fuzzyArrow" bit on the function
+  // type? That would allow us to implement this in the subtype relation.
+  // TODO(jmesserly): we'll need to factor this differently if we want to
+  // move CodeChecker's functionality into existing analyzer. Likely we can
+  // let the Expression have a strict arrow, then in places were we do
+  // inference, convert back to a fuzzy arrow.
+  FunctionType _removeFuzz(FunctionType t) {
+    bool foundFuzz = false;
+    List<ParameterElement> parameters = <ParameterElement>[];
+    for (ParameterElement p in t.parameters) {
+      ParameterElement newP = _removeParameterFuzz(p);
+      parameters.add(newP);
+      if (p != newP) foundFuzz = true;
+    }
+    if (!foundFuzz) {
+      return t;
+    }
+
+    FunctionElementImpl function = new FunctionElementImpl("", -1);
+    function.synthetic = true;
+    function.returnType = t.returnType;
+    function.shareTypeParameters(t.typeFormals);
+    function.shareParameters(parameters);
+    return function.type = new FunctionTypeImpl(function);
+  }
+
+  /// Removes fuzzy arrow, see [_removeFuzz].
+  ParameterElement _removeParameterFuzz(ParameterElement p) {
+    if (p.type.isDynamic) {
+      return new ParameterElementImpl.synthetic(
+          p.name, typeProvider.objectType, p.parameterKind);
+    }
+    return p;
+  }
+
   DartType _specializedBinaryReturnType(
       TokenType op, DartType t1, DartType t2, DartType normalReturnType) {
     // This special cases binary return types as per 16.26 and 16.27 of the
@@ -1058,7 +1060,6 @@
   _checkIndividualOverridesFromClass(ClassDeclaration node,
       InterfaceType baseType, Set<String> seen, bool isSubclass) {
     for (var member in node.members) {
-      if (member is ConstructorDeclaration) continue;
       if (member is FieldDeclaration) {
         if (member.isStatic) continue;
         for (var variable in member.fields.variables) {
@@ -1068,23 +1069,25 @@
           var getter = element.getter;
           var setter = element.setter;
           bool found = _checkSingleOverride(
-              getter, baseType, variable, member, isSubclass);
+              getter, baseType, variable.name, member, isSubclass);
           if (!variable.isFinal &&
               !variable.isConst &&
               _checkSingleOverride(
-                  setter, baseType, variable, member, isSubclass)) {
+                  setter, baseType, variable.name, member, isSubclass)) {
             found = true;
           }
           if (found) seen.add(name);
         }
-      } else {
-        if ((member as MethodDeclaration).isStatic) continue;
-        var method = (member as MethodDeclaration).element;
+      } else if (member is MethodDeclaration) {
+        if (member.isStatic) continue;
+        var method = member.element;
         if (seen.contains(method.name)) continue;
         if (_checkSingleOverride(
-            method, baseType, member, member, isSubclass)) {
+            method, baseType, member.name, member, isSubclass)) {
           seen.add(method.name);
         }
+      } else {
+        assert(member is ConstructorDeclaration);
       }
     }
   }
diff --git a/pkg/analyzer/lib/src/task/strong/info.dart b/pkg/analyzer/lib/src/task/strong/info.dart
index b8f09ea..41703e1 100644
--- a/pkg/analyzer/lib/src/task/strong/info.dart
+++ b/pkg/analyzer/lib/src/task/strong/info.dart
@@ -170,7 +170,7 @@
   @override
   String get name => 'STRONG_MODE_DOWN_CAST_COMPOSITE';
 
-  toErrorCode() => new StaticTypeWarningCode(name, message);
+  toErrorCode() => new StaticWarningCode(name, message);
 }
 
 /// A down cast to a non-ground type.  These behave differently from standard
@@ -518,7 +518,9 @@
 
   static bool isKnownFunction(Expression expression) {
     Element element = null;
-    if (expression is PropertyAccess) {
+    if (expression is FunctionExpression) {
+      return true;
+    } else if (expression is PropertyAccess) {
       element = expression.propertyName.staticElement;
     } else if (expression is Identifier) {
       element = expression.staticElement;
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index e902923..7c34d93 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.27.3-alpha.4
+version: 0.27.3-alpha.6
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
diff --git a/pkg/analyzer/test/cancelable_future_test.dart b/pkg/analyzer/test/cancelable_future_test.dart
index 24c84ae..1ece1a5f 100644
--- a/pkg/analyzer/test/cancelable_future_test.dart
+++ b/pkg/analyzer/test/cancelable_future_test.dart
@@ -39,15 +39,18 @@
     completer.future.cancel();
     expect(cancelCount, 1);
     // Make sure the future still completes with error.
-    return completer.future.then((_) {
-      fail('Expected error completion');
-    }, onError: (error) {
-      expect(error, new isInstanceOf<FutureCanceledError>());
-      // And make sure nothing else happens.
-    }).then((_) => pumpEventQueue()).then((_) {
-      expect(completer.isCompleted, isFalse);
-      expect(cancelCount, 1);
-    });
+    return completer.future
+        .then((_) {
+          fail('Expected error completion');
+        }, onError: (error) {
+          expect(error, new isInstanceOf<FutureCanceledError>());
+          // And make sure nothing else happens.
+        })
+        .then((_) => pumpEventQueue())
+        .then((_) {
+          expect(completer.isCompleted, isFalse);
+          expect(cancelCount, 1);
+        });
   }
 
   Future test_cancel_after_chaining() {
@@ -82,13 +85,16 @@
     // late to cancel.
     expect(cancelCount, 0);
     // Make sure the future still completes with the object.
-    return completer.future.then((result) {
-      expect(result, same(obj));
-      // And make sure nothing else happens.
-    }).then((_) => pumpEventQueue()).then((_) {
-      expect(completer.isCompleted, isTrue);
-      expect(cancelCount, 0);
-    });
+    return completer.future
+        .then((result) {
+          expect(result, same(obj));
+          // And make sure nothing else happens.
+        })
+        .then((_) => pumpEventQueue())
+        .then((_) {
+          expect(completer.isCompleted, isTrue);
+          expect(cancelCount, 0);
+        });
   }
 
   Future test_cancel_before_chaining() {
@@ -126,15 +132,18 @@
     completer.complete(obj);
     expect(completer.isCompleted, isTrue);
     // Make sure the future still completer with error.
-    return completer.future.then((_) {
-      fail('Expected error completion');
-    }, onError: (error) {
-      expect(error, new isInstanceOf<FutureCanceledError>());
-      // And make sure nothing else happens.
-    }).then((_) => pumpEventQueue()).then((_) {
-      expect(completer.isCompleted, isTrue);
-      expect(cancelCount, 1);
-    });
+    return completer.future
+        .then((_) {
+          fail('Expected error completion');
+        }, onError: (error) {
+          expect(error, new isInstanceOf<FutureCanceledError>());
+          // And make sure nothing else happens.
+        })
+        .then((_) => pumpEventQueue())
+        .then((_) {
+          expect(completer.isCompleted, isTrue);
+          expect(cancelCount, 1);
+        });
   }
 
   Future test_complete_after_chaining() {
@@ -150,16 +159,19 @@
     expect(completer.isCompleted, isFalse);
     // Running the event loop should have no effect since the completer hasn't
     // been completed yet.
-    return pumpEventQueue().then((_) {
-      completer.complete(obj);
-      expect(completer.isCompleted, isTrue);
-      // The callback should be deferred to a microtask.
-      expect(callbackInvoked, isFalse);
-    }).then((_) => pumpEventQueue()).then((_) {
-      expect(callbackInvoked, isTrue);
-      expect(completer.isCompleted, isTrue);
-      expect(cancelCount, 0);
-    });
+    return pumpEventQueue()
+        .then((_) {
+          completer.complete(obj);
+          expect(completer.isCompleted, isTrue);
+          // The callback should be deferred to a microtask.
+          expect(callbackInvoked, isFalse);
+        })
+        .then((_) => pumpEventQueue())
+        .then((_) {
+          expect(callbackInvoked, isTrue);
+          expect(completer.isCompleted, isTrue);
+          expect(cancelCount, 0);
+        });
   }
 
   void test_complete_after_complete() {
@@ -221,15 +233,18 @@
     completer.completeError(obj);
     expect(completer.isCompleted, isTrue);
     // Make sure the future still completes with error.
-    return completer.future.then((_) {
-      fail('Expected error completion');
-    }, onError: (error) {
-      expect(error, new isInstanceOf<FutureCanceledError>());
-      // And make sure nothing else happens.
-    }).then((_) => pumpEventQueue()).then((_) {
-      expect(completer.isCompleted, isTrue);
-      expect(cancelCount, 1);
-    });
+    return completer.future
+        .then((_) {
+          fail('Expected error completion');
+        }, onError: (error) {
+          expect(error, new isInstanceOf<FutureCanceledError>());
+          // And make sure nothing else happens.
+        })
+        .then((_) => pumpEventQueue())
+        .then((_) {
+          expect(completer.isCompleted, isTrue);
+          expect(cancelCount, 1);
+        });
   }
 
   Future test_completeError_after_chaining() {
@@ -245,16 +260,19 @@
     expect(completer.isCompleted, isFalse);
     // Running the event loop should have no effect since the completer hasn't
     // been completed yet.
-    return pumpEventQueue().then((_) {
-      completer.completeError(obj);
-      expect(completer.isCompleted, isTrue);
-      // The callback should be deferred to a microtask.
-      expect(callbackInvoked, isFalse);
-    }).then((_) => pumpEventQueue()).then((_) {
-      expect(callbackInvoked, isTrue);
-      expect(completer.isCompleted, isTrue);
-      expect(cancelCount, 0);
-    });
+    return pumpEventQueue()
+        .then((_) {
+          completer.completeError(obj);
+          expect(completer.isCompleted, isTrue);
+          // The callback should be deferred to a microtask.
+          expect(callbackInvoked, isFalse);
+        })
+        .then((_) => pumpEventQueue())
+        .then((_) {
+          expect(callbackInvoked, isTrue);
+          expect(completer.isCompleted, isTrue);
+          expect(cancelCount, 0);
+        });
   }
 
   Future test_completeError_before_chaining() {
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index 6cd446d..35ff9a9 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -573,124 +573,6 @@
 
 @reflectiveTest
 class SimpleIdentifierTest extends ParserTestCase {
-  void test_inDeclarationContext_catch_exception() {
-    SimpleIdentifier identifier =
-        AstFactory.catchClause("e").exceptionParameter;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_catch_stack() {
-    SimpleIdentifier identifier =
-        AstFactory.catchClause2("e", "s").stackTraceParameter;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_classDeclaration() {
-    SimpleIdentifier identifier =
-        AstFactory.classDeclaration(null, "C", null, null, null, null).name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_classTypeAlias() {
-    SimpleIdentifier identifier =
-        AstFactory.classTypeAlias("C", null, null, null, null, null).name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_constructorDeclaration() {
-    SimpleIdentifier identifier = AstFactory
-        .constructorDeclaration(AstFactory.identifier3("C"), "c", null, null)
-        .name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_declaredIdentifier() {
-    DeclaredIdentifier declaredIdentifier = AstFactory.declaredIdentifier3("v");
-    SimpleIdentifier identifier = declaredIdentifier.identifier;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_enumConstantDeclaration() {
-    EnumDeclaration enumDeclaration =
-        AstFactory.enumDeclaration2('MyEnum', ['CONST']);
-    SimpleIdentifier identifier = enumDeclaration.constants[0].name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_enumDeclaration() {
-    EnumDeclaration enumDeclaration =
-        AstFactory.enumDeclaration2('MyEnum', ['A', 'B', 'C']);
-    SimpleIdentifier identifier = enumDeclaration.name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_fieldFormalParameter() {
-    SimpleIdentifier identifier =
-        AstFactory.fieldFormalParameter2("p").identifier;
-    expect(identifier.inDeclarationContext(), isFalse);
-  }
-
-  void test_inDeclarationContext_functionDeclaration() {
-    SimpleIdentifier identifier =
-        AstFactory.functionDeclaration(null, null, "f", null).name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_functionTypeAlias() {
-    SimpleIdentifier identifier =
-        AstFactory.typeAlias(null, "F", null, null).name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_label_false() {
-    SimpleIdentifier identifier =
-        AstFactory.namedExpression2("l", AstFactory.integer(0)).name.label;
-    expect(identifier.inDeclarationContext(), isFalse);
-  }
-
-  void test_inDeclarationContext_label_true() {
-    Label label = AstFactory.label2("l");
-    SimpleIdentifier identifier = label.label;
-    AstFactory.labeledStatement([label], AstFactory.emptyStatement());
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_methodDeclaration() {
-    SimpleIdentifier identifier = AstFactory.identifier3("m");
-    AstFactory.methodDeclaration2(
-        null, null, null, null, identifier, null, null);
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_prefix() {
-    SimpleIdentifier identifier =
-        AstFactory.importDirective3("uri", "pref").prefix;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_simpleFormalParameter() {
-    SimpleIdentifier identifier =
-        AstFactory.simpleFormalParameter3("p").identifier;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_typeParameter_bound() {
-    TypeName bound = AstFactory.typeName4("A");
-    SimpleIdentifier identifier = bound.name as SimpleIdentifier;
-    AstFactory.typeParameter2("E", bound);
-    expect(identifier.inDeclarationContext(), isFalse);
-  }
-
-  void test_inDeclarationContext_typeParameter_name() {
-    SimpleIdentifier identifier = AstFactory.typeParameter("E").name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
-  void test_inDeclarationContext_variableDeclaration() {
-    SimpleIdentifier identifier = AstFactory.variableDeclaration("v").name;
-    expect(identifier.inDeclarationContext(), isTrue);
-  }
-
   void test_inGetterContext() {
     for (_WrapperKind wrapper in _WrapperKind.values) {
       for (_AssignmentKind assignment in _AssignmentKind.values) {
diff --git a/pkg/analyzer/test/file_system/memory_file_system_test.dart b/pkg/analyzer/test/file_system/memory_file_system_test.dart
index 759362b..b40be43 100644
--- a/pkg/analyzer/test/file_system/memory_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 import 'package:watcher/watcher.dart';
@@ -402,14 +403,14 @@
   }
 
   void test_resolveRelative() {
-    Uri relative = source.resolveRelativeUri(new Uri.file('bar/baz.dart'));
+    Uri relative = resolveRelativeUri(source.uri, new Uri.file('bar/baz.dart'));
     expect(relative.path, '/foo/bar/baz.dart');
   }
 
   void test_resolveRelative_dart() {
     File file = provider.newFile('/sdk/lib/core/core.dart', '');
     Source source = file.createSource(Uri.parse('dart:core'));
-    Uri resolved = source.resolveRelativeUri(Uri.parse('int.dart'));
+    Uri resolved = resolveRelativeUri(source.uri, Uri.parse('int.dart'));
     expect(resolved.toString(), 'dart:core/int.dart');
   }
 
@@ -451,7 +452,7 @@
   }
 
   void test_resolveRelative() {
-    Uri relative = source.resolveRelativeUri(new Uri.file('bar/baz.dart'));
+    Uri relative = resolveRelativeUri(source.uri, new Uri.file('bar/baz.dart'));
     expect(relative.path, '/foo/bar/baz.dart');
   }
 
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 33db261..f032daf 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -54,6 +54,7 @@
   runReflectiveTests(ExitDetectorTest2);
   runReflectiveTests(FileBasedSourceTest);
   runReflectiveTests(FileUriResolverTest);
+  runReflectiveTests(ResolveRelativeUriTest);
   runReflectiveTests(SDKLibrariesReaderTest);
   runReflectiveTests(UriKindTest);
 }
@@ -155,6 +156,24 @@
     expect(docFile, isNotNull);
   }
 
+  void test_analysisOptions_afterContextCreation() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    sdk.context;
+    expect(() {
+      sdk.analysisOptions = new AnalysisOptionsImpl();
+    }, throwsStateError);
+  }
+
+  void test_analysisOptions_beforeContextCreation() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    sdk.analysisOptions = new AnalysisOptionsImpl();
+    sdk.context;
+    // cannot change "analysisOptions" in the context
+    expect(() {
+      sdk.context.analysisOptions = new AnalysisOptionsImpl();
+    }, throwsStateError);
+  }
+
   void test_creation() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     expect(sdk, isNotNull);
@@ -262,6 +281,20 @@
     expect(executable.isExecutable(), isTrue);
   }
 
+  void test_useSummary_afterContextCreation() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    sdk.context;
+    expect(() {
+      sdk.useSummary = true;
+    }, throwsStateError);
+  }
+
+  void test_useSummary_beforeContextCreation() {
+    DirectoryBasedDartSdk sdk = _createDartSdk();
+    sdk.useSummary = true;
+    sdk.context;
+  }
+
   DirectoryBasedDartSdk _createDartSdk() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
     expect(sdkDirectory, isNotNull,
@@ -563,11 +596,13 @@
     String stackParameterName = "s";
     CatchClause clause =
         AstFactory.catchClause2(exceptionParameterName, stackParameterName);
+    _setNodeSourceRange(clause, 100, 110);
     clause.accept(builder);
 
     List<LocalVariableElement> variables = holder.localVariables;
     expect(variables, hasLength(2));
-    VariableElement exceptionVariable = variables[0];
+
+    LocalVariableElement exceptionVariable = variables[0];
     expect(exceptionVariable, isNotNull);
     expect(exceptionVariable.name, exceptionParameterName);
     expect(exceptionVariable.hasImplicitType, isTrue);
@@ -575,13 +610,16 @@
     expect(exceptionVariable.isConst, isFalse);
     expect(exceptionVariable.isFinal, isFalse);
     expect(exceptionVariable.initializer, isNull);
-    VariableElement stackVariable = variables[1];
+    _assertVisibleRange(exceptionVariable, 100, 110);
+
+    LocalVariableElement stackVariable = variables[1];
     expect(stackVariable, isNotNull);
     expect(stackVariable.name, stackParameterName);
     expect(stackVariable.isSynthetic, isFalse);
     expect(stackVariable.isConst, isFalse);
     expect(stackVariable.isFinal, isFalse);
     expect(stackVariable.initializer, isNull);
+    _assertVisibleRange(stackVariable, 100, 110);
   }
 
   void test_visitCatchClause_withType() {
@@ -4023,38 +4061,6 @@
     expect(source.exists(), isFalse);
   }
 
-  void test_resolveRelative_dart_fileName() {
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source =
-        new FileBasedSource(file, parseUriWithException("dart:test"));
-    expect(source, isNotNull);
-    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "dart:test/lib.dart");
-  }
-
-  void test_resolveRelative_dart_filePath() {
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source =
-        new FileBasedSource(file, parseUriWithException("dart:test"));
-    expect(source, isNotNull);
-    Uri relative =
-        source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "dart:test/c/lib.dart");
-  }
-
-  void test_resolveRelative_dart_filePathWithParent() {
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = new FileBasedSource(
-        file, parseUriWithException("dart:test/b/test.dart"));
-    expect(source, isNotNull);
-    Uri relative =
-        source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "dart:test/c/lib.dart");
-  }
-
   void test_resolveRelative_file_fileName() {
     if (OSUtilities.isWindows()) {
       // On Windows, the URI that is produced includes a drive letter,
@@ -4065,7 +4071,8 @@
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source = new FileBasedSource(file);
     expect(source, isNotNull);
-    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
+    Uri relative =
+        resolveRelativeUri(source.uri, parseUriWithException("lib.dart"));
     expect(relative, isNotNull);
     expect(relative.toString(), "file:///a/b/lib.dart");
   }
@@ -4081,7 +4088,7 @@
     FileBasedSource source = new FileBasedSource(file);
     expect(source, isNotNull);
     Uri relative =
-        source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
+        resolveRelativeUri(source.uri, parseUriWithException("c/lib.dart"));
     expect(relative, isNotNull);
     expect(relative.toString(), "file:///a/b/c/lib.dart");
   }
@@ -4096,53 +4103,11 @@
     FileBasedSource source = new FileBasedSource(file);
     expect(source, isNotNull);
     Uri relative =
-        source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
+        resolveRelativeUri(source.uri, parseUriWithException("../c/lib.dart"));
     expect(relative, isNotNull);
     expect(relative.toString(), "file:///a/c/lib.dart");
   }
 
-  void test_resolveRelative_package_fileName() {
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source =
-        new FileBasedSource(file, parseUriWithException("package:b/test.dart"));
-    expect(source, isNotNull);
-    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "package:b/lib.dart");
-  }
-
-  void test_resolveRelative_package_fileNameWithoutPackageName() {
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source =
-        new FileBasedSource(file, parseUriWithException("package:test.dart"));
-    expect(source, isNotNull);
-    Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "package:lib.dart");
-  }
-
-  void test_resolveRelative_package_filePath() {
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source =
-        new FileBasedSource(file, parseUriWithException("package:b/test.dart"));
-    expect(source, isNotNull);
-    Uri relative =
-        source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "package:b/c/lib.dart");
-  }
-
-  void test_resolveRelative_package_filePathWithParent() {
-    JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
-    FileBasedSource source = new FileBasedSource(
-        file, parseUriWithException("package:a/b/test.dart"));
-    expect(source, isNotNull);
-    Uri relative =
-        source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
-    expect(relative, isNotNull);
-    expect(relative.toString(), "package:a/c/lib.dart");
-  }
-
   void test_system() {
     JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
     FileBasedSource source =
@@ -4189,6 +4154,74 @@
 }
 
 @reflectiveTest
+class ResolveRelativeUriTest {
+  void test_resolveRelative_dart_dartUri() {
+    Uri uri = parseUriWithException('dart:foo');
+    Uri relative = resolveRelativeUri(uri, parseUriWithException('dart:bar'));
+    expect(relative, isNotNull);
+    expect(relative.toString(), 'dart:bar');
+  }
+
+  void test_resolveRelative_dart_fileName() {
+    Uri uri = parseUriWithException("dart:test");
+    Uri relative = resolveRelativeUri(uri, parseUriWithException("lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/lib.dart");
+  }
+
+  void test_resolveRelative_dart_filePath() {
+    Uri uri = parseUriWithException("dart:test");
+    Uri relative = resolveRelativeUri(uri, parseUriWithException("c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/c/lib.dart");
+  }
+
+  void test_resolveRelative_dart_filePathWithParent() {
+    Uri uri = parseUriWithException("dart:test/b/test.dart");
+    Uri relative =
+        resolveRelativeUri(uri, parseUriWithException("../c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/c/lib.dart");
+  }
+
+  void test_resolveRelative_package_dartUri() {
+    Uri uri = parseUriWithException('package:foo/bar.dart');
+    Uri relative = resolveRelativeUri(uri, parseUriWithException('dart:test'));
+    expect(relative, isNotNull);
+    expect(relative.toString(), 'dart:test');
+  }
+
+  void test_resolveRelative_package_fileName() {
+    Uri uri = parseUriWithException("package:b/test.dart");
+    Uri relative = resolveRelativeUri(uri, parseUriWithException("lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:b/lib.dart");
+  }
+
+  void test_resolveRelative_package_fileNameWithoutPackageName() {
+    Uri uri = parseUriWithException("package:test.dart");
+    Uri relative = resolveRelativeUri(uri, parseUriWithException("lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:lib.dart");
+  }
+
+  void test_resolveRelative_package_filePath() {
+    Uri uri = parseUriWithException("package:b/test.dart");
+    Uri relative = resolveRelativeUri(uri, parseUriWithException("c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:b/c/lib.dart");
+  }
+
+  void test_resolveRelative_package_filePathWithParent() {
+    Uri uri = parseUriWithException("package:a/b/test.dart");
+    Uri relative =
+        resolveRelativeUri(uri, parseUriWithException("../c/lib.dart"));
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:a/c/lib.dart");
+  }
+}
+
+@reflectiveTest
 class SDKLibrariesReaderTest extends EngineTestCase {
   void test_readFrom_dart2js() {
     LibraryMap libraryMap = new SdkLibrariesReader(true).readFromFile(
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index ad6f418..04560c2 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -93,7 +93,7 @@
     //
     TestTypeProvider provider = new TestTypeProvider();
     CompilationUnitElementImpl coreUnit =
-    new CompilationUnitElementImpl("core.dart");
+        new CompilationUnitElementImpl("core.dart");
     Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
     coreContext.setContents(coreSource, "");
     coreUnit.librarySource = coreUnit.source = coreSource;
@@ -132,15 +132,15 @@
     TopLevelVariableElement proxyTopLevelVariableElt = ElementFactory
         .topLevelVariableElement3("proxy", true, false, proxyClassElement.type);
     ConstTopLevelVariableElementImpl deprecatedTopLevelVariableElt =
-    ElementFactory.topLevelVariableElement3(
-        "deprecated", true, false, provider.deprecatedType);
+        ElementFactory.topLevelVariableElement3(
+            "deprecated", true, false, provider.deprecatedType);
     {
       ClassElement deprecatedElement = provider.deprecatedType.element;
       InstanceCreationExpression initializer = AstFactory
           .instanceCreationExpression2(
-          Keyword.CONST,
-          AstFactory.typeName(deprecatedElement),
-          [AstFactory.string2('next release')]);
+              Keyword.CONST,
+              AstFactory.typeName(deprecatedElement),
+              [AstFactory.string2('next release')]);
       ConstructorElement constructor = deprecatedElement.constructors.single;
       initializer.staticElement = constructor;
       initializer.constructorName.staticElement = constructor;
@@ -166,18 +166,18 @@
       asyncLibrary = new LibraryElementImpl.forNode(
           coreContext, AstFactory.libraryIdentifier2(["dart", "async"]));
       CompilationUnitElementImpl asyncUnit =
-      new CompilationUnitElementImpl("async.dart");
+          new CompilationUnitElementImpl("async.dart");
       asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
       coreContext.setContents(asyncSource, "");
       asyncUnit.librarySource = asyncUnit.source = asyncSource;
       asyncLibrary.definingCompilationUnit = asyncUnit;
       // Future
       ClassElementImpl futureElement =
-      ElementFactory.classElement2("Future", ["T"]);
+          ElementFactory.classElement2("Future", ["T"]);
       futureElement.enclosingElement = asyncUnit;
       //   factory Future.value([value])
       ConstructorElementImpl futureConstructor =
-      ElementFactory.constructorElement2(futureElement, "value");
+          ElementFactory.constructorElement2(futureElement, "value");
       futureConstructor.parameters = <ParameterElement>[
         ElementFactory.positionalParameter2("value", provider.dynamicType)
       ];
@@ -210,18 +210,18 @@
       futureElement.methods = <MethodElement>[thenMethod];
       // Completer
       ClassElementImpl completerElement =
-      ElementFactory.classElement2("Completer", ["T"]);
+          ElementFactory.classElement2("Completer", ["T"]);
       ConstructorElementImpl completerConstructor =
-      ElementFactory.constructorElement2(completerElement, null);
+          ElementFactory.constructorElement2(completerElement, null);
       completerElement.constructors = <ConstructorElement>[
         completerConstructor
       ];
       // StreamSubscription
       ClassElementImpl streamSubscriptionElement =
-      ElementFactory.classElement2("StreamSubscription", ["T"]);
+          ElementFactory.classElement2("StreamSubscription", ["T"]);
       // Stream
       ClassElementImpl streamElement =
-      ElementFactory.classElement2("Stream", ["T"]);
+          ElementFactory.classElement2("Stream", ["T"]);
       streamElement.constructors = <ConstructorElement>[
         ElementFactory.constructorElement2(streamElement, null)
       ];
@@ -236,7 +236,7 @@
       List<DartType> parameterTypes = <DartType>[listenOnData.type,];
       // TODO(brianwilkerson) This is missing the optional parameters.
       MethodElementImpl listenMethod =
-      ElementFactory.methodElement('listen', returnType, parameterTypes);
+          ElementFactory.methodElement('listen', returnType, parameterTypes);
       streamElement.methods = <MethodElement>[listenMethod];
       listenMethod.type = new FunctionTypeImpl(listenMethod);
 
@@ -257,16 +257,16 @@
     // dart:html
     //
     CompilationUnitElementImpl htmlUnit =
-    new CompilationUnitElementImpl("html_dartium.dart");
+        new CompilationUnitElementImpl("html_dartium.dart");
     Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
     coreContext.setContents(htmlSource, "");
     htmlUnit.librarySource = htmlUnit.source = htmlSource;
     ClassElementImpl elementElement = ElementFactory.classElement2("Element");
     InterfaceType elementType = elementElement.type;
     ClassElementImpl canvasElement =
-    ElementFactory.classElement("CanvasElement", elementType);
+        ElementFactory.classElement("CanvasElement", elementType);
     ClassElementImpl contextElement =
-    ElementFactory.classElement2("CanvasRenderingContext");
+        ElementFactory.classElement2("CanvasRenderingContext");
     InterfaceType contextElementType = contextElement.type;
     ClassElementImpl context2dElement = ElementFactory.classElement(
         "CanvasRenderingContext2D", contextElementType);
@@ -281,9 +281,9 @@
         .map((PropertyAccessorElement accessor) => accessor.variable)
         .toList();
     ClassElementImpl documentElement =
-    ElementFactory.classElement("Document", elementType);
+        ElementFactory.classElement("Document", elementType);
     ClassElementImpl htmlDocumentElement =
-    ElementFactory.classElement("HtmlDocument", documentElement.type);
+        ElementFactory.classElement("HtmlDocument", documentElement.type);
     htmlDocumentElement.methods = <MethodElement>[
       ElementFactory
           .methodElement("query", elementType, <DartType>[provider.stringType])
@@ -307,8 +307,8 @@
           <ClassElement>[provider.stringType.element], ClassElement.EMPTY_LIST)
     ];
     TopLevelVariableElementImpl document =
-    ElementFactory.topLevelVariableElement3(
-        "document", false, true, htmlDocumentElement.type);
+        ElementFactory.topLevelVariableElement3(
+            "document", false, true, htmlDocumentElement.type);
     htmlUnit.topLevelVariables = <TopLevelVariableElement>[document];
     htmlUnit.accessors = <PropertyAccessorElement>[document.getter];
     LibraryElementImpl htmlLibrary = new LibraryElementImpl.forNode(
@@ -318,7 +318,7 @@
     // dart:math
     //
     CompilationUnitElementImpl mathUnit =
-    new CompilationUnitElementImpl("math.dart");
+        new CompilationUnitElementImpl("math.dart");
     Source mathSource = sourceFactory.forUri(_DART_MATH);
     coreContext.setContents(mathSource, "");
     mathUnit.librarySource = mathUnit.source = mathSource;
@@ -330,7 +330,7 @@
     TopLevelVariableElement ln10Element = ElementFactory
         .topLevelVariableElement3("LN10", true, false, provider.doubleType);
     TypeParameterElement maxT =
-    ElementFactory.typeParameterWithType('T', provider.numType);
+        ElementFactory.typeParameterWithType('T', provider.numType);
     FunctionElementImpl maxElement = ElementFactory.functionElement3(
         "max", maxT, [maxT, maxT], ClassElement.EMPTY_LIST);
     maxElement.typeParameters = [maxT];
@@ -340,7 +340,7 @@
     ClassElementImpl randomElement = ElementFactory.classElement2("Random");
     randomElement.abstract = true;
     ConstructorElementImpl randomConstructor =
-    ElementFactory.constructorElement2(randomElement, null);
+        ElementFactory.constructorElement2(randomElement, null);
     randomConstructor.factory = true;
     ParameterElementImpl seedParam = new ParameterElementImpl("seed", 0);
     seedParam.parameterKind = ParameterKind.POSITIONAL;
@@ -386,7 +386,7 @@
     // Record the elements.
     //
     HashMap<Source, LibraryElement> elementMap =
-    new HashMap<Source, LibraryElement>();
+        new HashMap<Source, LibraryElement>();
     elementMap[coreSource] = coreLibrary;
     if (asyncSource != null) {
       elementMap[asyncSource] = asyncLibrary;
@@ -399,7 +399,7 @@
     //
     for (LibraryElementImpl library in elementMap.values) {
       Namespace namespace =
-      new NamespaceBuilder().createPublicNamespaceForLibrary(library);
+          new NamespaceBuilder().createPublicNamespaceForLibrary(library);
       library.exportNamespace = namespace;
       library.publicNamespace = namespace;
     }
@@ -421,7 +421,7 @@
   void set analysisOptions(AnalysisOptions options) {
     AnalysisOptions currentOptions = analysisOptions;
     bool needsRecompute = currentOptions.analyzeFunctionBodiesPredicate !=
-        options.analyzeFunctionBodiesPredicate ||
+            options.analyzeFunctionBodiesPredicate ||
         currentOptions.generateImplicitErrors !=
             options.generateImplicitErrors ||
         currentOptions.generateSdkErrors != options.generateSdkErrors ||
@@ -517,7 +517,7 @@
   TestPackageUriResolver(Map<String, String> map) {
     map.forEach((String uri, String contents) {
       sourceMap[Uri.parse(uri)] =
-      new StringSource(contents, '/test_pkg_source.dart');
+          new StringSource(contents, '/test_pkg_source.dart');
     });
   }
 
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 6231930..34dd9b9 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -5478,6 +5478,22 @@
     verify([source]);
   }
 
+  void test_recursiveInterfaceInheritanceBaseCaseExtends_abstract() {
+    Source source = addSource(r'''
+class C extends C {
+  var bar = 0;
+  m();
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS,
+      StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
+      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
+    ]);
+    verify([source]);
+  }
+
   void test_recursiveInterfaceInheritanceBaseCaseImplements() {
     Source source = addSource("class A implements A {}");
     computeLibrarySourceErrors(source);
@@ -6045,6 +6061,21 @@
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
 
+  void test_uriDoesNotExist_import_appears_after_deleting_target() {
+    Source test = addSource("import 'target.dart';");
+    Source target = addNamedSource("/target.dart", "");
+    computeLibrarySourceErrors(test);
+    assertErrors(test, [HintCode.UNUSED_IMPORT]);
+
+    // Remove the overlay in the same way as AnalysisServer.
+    analysisContext2.setContents(target, null);
+    ChangeSet changeSet = new ChangeSet()..removedSource(target);
+    analysisContext2.applyChanges(changeSet);
+
+    computeLibrarySourceErrors(test);
+    assertErrors(test, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+  }
+
   void test_uriDoesNotExist_import_disappears_when_fixed() {
     Source source = addSource("import 'target.dart';");
     computeLibrarySourceErrors(source);
@@ -6065,21 +6096,6 @@
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
   }
 
-  void test_uriDoesNotExist_import_appears_after_deleting_target() {
-    Source test = addSource("import 'target.dart';");
-    Source target = addNamedSource("/target.dart", "");
-    computeLibrarySourceErrors(test);
-    assertErrors(test, [HintCode.UNUSED_IMPORT]);
-
-    // Remove the overlay in the same way as AnalysisServer.
-    analysisContext2.setContents(target, null);
-    ChangeSet changeSet = new ChangeSet()..removedSource(target);
-    analysisContext2.applyChanges(changeSet);
-
-    computeLibrarySourceErrors(test);
-    assertErrors(test, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
-  }
-
   void test_uriDoesNotExist_part() {
     Source source = addSource(r'''
 library lib;
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index a4cd97e..5eb564a 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -120,7 +120,7 @@
     //
     ClassElementImpl classA = ElementFactory.classElement2("A");
     MethodElement operator =
-    ElementFactory.methodElement("[]", intType, [intType]);
+        ElementFactory.methodElement("[]", intType, [intType]);
     classA.methods = <MethodElement>[operator];
     //
     // class B implements A {}
@@ -143,7 +143,7 @@
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classD.type;
     IndexExpression expression =
-    AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+        AstFactory.indexExpression(array, AstFactory.identifier3("i"));
     expect(_resolveIndexExpression(expression), same(operator));
     _listener.assertNoErrors();
   }
@@ -247,7 +247,7 @@
     BreakStatement breakStatement = AstFactory.breakStatement2(label);
     Expression condition = AstFactory.booleanLiteral(true);
     WhileStatement whileStatement =
-    AstFactory.whileStatement(condition, breakStatement);
+        AstFactory.whileStatement(condition, breakStatement);
     expect(_resolveBreak(breakStatement, labelElement, whileStatement),
         same(labelElement));
     expect(breakStatement.target, same(whileStatement));
@@ -265,9 +265,9 @@
     // set accessors
     String propName = "p";
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(propName, false, _typeProvider.intType);
+        ElementFactory.getterElement(propName, false, _typeProvider.intType);
     PropertyAccessorElement setter =
-    ElementFactory.setterElement(propName, false, _typeProvider.intType);
+        ElementFactory.setterElement(propName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getter, setter];
     // set name scope
     _visitor.nameScope = new EnclosedScope(null)
@@ -286,7 +286,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     // set method
     MethodElement method =
-    ElementFactory.methodElement("m", _typeProvider.intType);
+        ElementFactory.methodElement("m", _typeProvider.intType);
     classA.methods = <MethodElement>[method];
     // set name scope
     _visitor.nameScope = new EnclosedScope(null)
@@ -305,7 +305,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String constructorName = "a";
     ConstructorElement constructor =
-    ElementFactory.constructorElement2(classA, constructorName);
+        ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     ConstructorName name = AstFactory.constructorName(
         AstFactory.typeName(classA), constructorName);
@@ -318,7 +318,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String constructorName = null;
     ConstructorElement constructor =
-    ElementFactory.constructorElement2(classA, constructorName);
+        ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     ConstructorName name = AstFactory.constructorName(
         AstFactory.typeName(classA), constructorName);
@@ -337,7 +337,7 @@
     ContinueStatement continueStatement = AstFactory.continueStatement(label);
     Expression condition = AstFactory.booleanLiteral(true);
     WhileStatement whileStatement =
-    AstFactory.whileStatement(condition, continueStatement);
+        AstFactory.whileStatement(condition, continueStatement);
     expect(_resolveContinue(continueStatement, labelElement, whileStatement),
         same(labelElement));
     expect(continueStatement.target, same(whileStatement));
@@ -352,16 +352,16 @@
 
   void test_visitEnumDeclaration() {
     CompilationUnitElementImpl compilationUnitElement =
-    ElementFactory.compilationUnit('foo.dart');
+        ElementFactory.compilationUnit('foo.dart');
     ClassElementImpl enumElement =
-    ElementFactory.enumElement(_typeProvider, ('E'));
+        ElementFactory.enumElement(_typeProvider, ('E'));
     compilationUnitElement.enums = <ClassElement>[enumElement];
     EnumDeclaration enumNode = AstFactory.enumDeclaration2('E', []);
     Annotation annotationNode =
-    AstFactory.annotation(AstFactory.identifier3('a'));
+        AstFactory.annotation(AstFactory.identifier3('a'));
     annotationNode.element = ElementFactory.classElement2('A');
     annotationNode.elementAnnotation =
-    new ElementAnnotationImpl(compilationUnitElement);
+        new ElementAnnotationImpl(compilationUnitElement);
     enumNode.metadata.add(annotationNode);
     enumNode.name.staticElement = enumElement;
     List<ElementAnnotation> metadata = <ElementAnnotation>[
@@ -383,13 +383,13 @@
     String fieldName = "f";
     InterfaceType intType = _typeProvider.intType;
     FieldElementImpl fieldElement =
-    ElementFactory.fieldElement(fieldName, false, false, false, intType);
+        ElementFactory.fieldElement(fieldName, false, false, false, intType);
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.fields = <FieldElement>[fieldElement];
     FieldFormalParameter parameter =
-    AstFactory.fieldFormalParameter2(fieldName);
+        AstFactory.fieldFormalParameter2(fieldName);
     FieldFormalParameterElementImpl parameterElement =
-    ElementFactory.fieldFormalParameter(parameter.identifier);
+        ElementFactory.fieldFormalParameter(parameter.identifier);
     parameterElement.field = fieldElement;
     parameterElement.type = intType;
     parameter.identifier.staticElement = parameterElement;
@@ -420,17 +420,17 @@
   void test_visitImportDirective_withCombinators() {
     ShowCombinator combinator = AstFactory.showCombinator2(["A", "B", "C"]);
     ImportDirective directive =
-    AstFactory.importDirective3(null, null, [combinator]);
+        AstFactory.importDirective3(null, null, [combinator]);
     LibraryElementImpl library =
-    ElementFactory.library(_definingLibrary.context, "lib");
+        ElementFactory.library(_definingLibrary.context, "lib");
     TopLevelVariableElementImpl varA =
-    ElementFactory.topLevelVariableElement2("A");
+        ElementFactory.topLevelVariableElement2("A");
     TopLevelVariableElementImpl varB =
-    ElementFactory.topLevelVariableElement2("B");
+        ElementFactory.topLevelVariableElement2("B");
     TopLevelVariableElementImpl varC =
-    ElementFactory.topLevelVariableElement2("C");
+        ElementFactory.topLevelVariableElement2("C");
     CompilationUnitElementImpl unit =
-    library.definingCompilationUnit as CompilationUnitElementImpl;
+        library.definingCompilationUnit as CompilationUnitElementImpl;
     unit.accessors = <PropertyAccessorElement>[
       varA.getter,
       varA.setter,
@@ -450,12 +450,12 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     InterfaceType intType = _typeProvider.intType;
     MethodElement getter =
-    ElementFactory.methodElement("[]", intType, [intType]);
+        ElementFactory.methodElement("[]", intType, [intType]);
     classA.methods = <MethodElement>[getter];
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classA.type;
     IndexExpression expression =
-    AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+        AstFactory.indexExpression(array, AstFactory.identifier3("i"));
     expect(_resolveIndexExpression(expression), same(getter));
     _listener.assertNoErrors();
   }
@@ -464,12 +464,12 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     InterfaceType intType = _typeProvider.intType;
     MethodElement setter =
-    ElementFactory.methodElement("[]=", intType, [intType]);
+        ElementFactory.methodElement("[]=", intType, [intType]);
     classA.methods = <MethodElement>[setter];
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classA.type;
     IndexExpression expression =
-    AstFactory.indexExpression(array, AstFactory.identifier3("i"));
+        AstFactory.indexExpression(array, AstFactory.identifier3("i"));
     AstFactory.assignmentExpression(
         expression, TokenType.EQ, AstFactory.integer(0));
     expect(_resolveIndexExpression(expression), same(setter));
@@ -480,13 +480,13 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String constructorName = "a";
     ConstructorElement constructor =
-    ElementFactory.constructorElement2(classA, constructorName);
+        ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     ConstructorName name = AstFactory.constructorName(
         AstFactory.typeName(classA), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation =
-    AstFactory.instanceCreationExpression(Keyword.NEW, name);
+        AstFactory.instanceCreationExpression(Keyword.NEW, name);
     _resolveNode(creation);
     expect(creation.staticElement, same(constructor));
     _listener.assertNoErrors();
@@ -496,13 +496,13 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String constructorName = null;
     ConstructorElement constructor =
-    ElementFactory.constructorElement2(classA, constructorName);
+        ElementFactory.constructorElement2(classA, constructorName);
     classA.constructors = <ConstructorElement>[constructor];
     ConstructorName name = AstFactory.constructorName(
         AstFactory.typeName(classA), constructorName);
     name.staticElement = constructor;
     InstanceCreationExpression creation =
-    AstFactory.instanceCreationExpression(Keyword.NEW, name);
+        AstFactory.instanceCreationExpression(Keyword.NEW, name);
     _resolveNode(creation);
     expect(creation.staticElement, same(constructor));
     _listener.assertNoErrors();
@@ -512,7 +512,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String constructorName = null;
     ConstructorElementImpl constructor =
-    ElementFactory.constructorElement2(classA, constructorName);
+        ElementFactory.constructorElement2(classA, constructorName);
     String parameterName = "a";
     ParameterElement parameter = ElementFactory.namedParameter(parameterName);
     constructor.parameters = <ParameterElement>[parameter];
@@ -575,7 +575,7 @@
     SimpleIdentifier operand = AstFactory.identifier3("i");
     operand.staticType = numType;
     PostfixExpression expression =
-    AstFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
+        AstFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
     _resolveNode(expression);
     expect(expression.staticElement, getMethod(numType, "+"));
     _listener.assertNoErrors();
@@ -589,7 +589,7 @@
     target.staticElement = variable;
     target.staticType = dynamicType;
     PrefixedIdentifier identifier =
-    AstFactory.identifier(target, AstFactory.identifier3("b"));
+        AstFactory.identifier(target, AstFactory.identifier3("b"));
     _resolveNode(identifier);
     expect(identifier.staticElement, isNull);
     expect(identifier.identifier.staticElement, isNull);
@@ -600,7 +600,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "b";
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getter];
     SimpleIdentifier target = AstFactory.identifier3("a");
     VariableElementImpl variable = ElementFactory.localVariableElement(target);
@@ -608,7 +608,7 @@
     target.staticElement = variable;
     target.staticType = classA.type;
     PrefixedIdentifier identifier =
-    AstFactory.identifier(target, AstFactory.identifier3(getterName));
+        AstFactory.identifier(target, AstFactory.identifier3(getterName));
     _resolveNode(identifier);
     expect(identifier.staticElement, same(getter));
     expect(identifier.identifier.staticElement, same(getter));
@@ -620,16 +620,16 @@
     // set accessors
     String propName = "b";
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(propName, false, _typeProvider.intType);
+        ElementFactory.getterElement(propName, false, _typeProvider.intType);
     PropertyAccessorElement setter =
-    ElementFactory.setterElement(propName, false, _typeProvider.intType);
+        ElementFactory.setterElement(propName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getter, setter];
     // prepare "A.m"
     SimpleIdentifier target = AstFactory.identifier3("A");
     target.staticElement = classA;
     target.staticType = classA.type;
     PrefixedIdentifier identifier =
-    AstFactory.identifier(target, AstFactory.identifier3(propName));
+        AstFactory.identifier(target, AstFactory.identifier3(propName));
     // resolve
     _resolveNode(identifier);
     expect(identifier.staticElement, same(getter));
@@ -642,14 +642,14 @@
     // set methods
     String propName = "m";
     MethodElement method =
-    ElementFactory.methodElement("m", _typeProvider.intType);
+        ElementFactory.methodElement("m", _typeProvider.intType);
     classA.methods = <MethodElement>[method];
     // prepare "A.m"
     SimpleIdentifier target = AstFactory.identifier3("A");
     target.staticElement = classA;
     target.staticType = classA.type;
     PrefixedIdentifier identifier =
-    AstFactory.identifier(target, AstFactory.identifier3(propName));
+        AstFactory.identifier(target, AstFactory.identifier3(propName));
     AstFactory.assignmentExpression(
         identifier, TokenType.EQ, AstFactory.nullLiteral());
     // resolve
@@ -664,16 +664,16 @@
     // set accessors
     String propName = "b";
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(propName, false, _typeProvider.intType);
+        ElementFactory.getterElement(propName, false, _typeProvider.intType);
     PropertyAccessorElement setter =
-    ElementFactory.setterElement(propName, false, _typeProvider.intType);
+        ElementFactory.setterElement(propName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getter, setter];
     // prepare "A.b = null"
     SimpleIdentifier target = AstFactory.identifier3("A");
     target.staticElement = classA;
     target.staticType = classA.type;
     PrefixedIdentifier identifier =
-    AstFactory.identifier(target, AstFactory.identifier3(propName));
+        AstFactory.identifier(target, AstFactory.identifier3(propName));
     AstFactory.assignmentExpression(
         identifier, TokenType.EQ, AstFactory.nullLiteral());
     // resolve
@@ -688,7 +688,7 @@
     SimpleIdentifier operand = AstFactory.identifier3("i");
     operand.staticType = numType;
     PrefixExpression expression =
-    AstFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
+        AstFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
     _resolveNode(expression);
     expect(expression.staticElement, getMethod(numType, "+"));
     _listener.assertNoErrors();
@@ -698,7 +698,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "b";
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getter];
     SimpleIdentifier target = AstFactory.identifier3("a");
     target.staticType = classA.type;
@@ -720,7 +720,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "b";
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getter];
     SuperExpression target = AstFactory.superExpression();
     target.staticType = ElementFactory.classElement("B", classA.type).type;
@@ -742,7 +742,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String setterName = "b";
     PropertyAccessorElement setter =
-    ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[setter];
     ThisExpression target = AstFactory.thisExpression();
     target.staticType = classA.type;
@@ -783,7 +783,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String fieldName = "a";
     FieldElement field =
-    ElementFactory.fieldElement(fieldName, false, false, false, intType);
+        ElementFactory.fieldElement(fieldName, false, false, false, intType);
     classA.fields = <FieldElement>[field];
     classA.accessors = <PropertyAccessorElement>[field.getter, field.setter];
     SimpleIdentifier node = AstFactory.identifier3(fieldName);
@@ -799,15 +799,15 @@
   void test_visitSuperConstructorInvocation() {
     ClassElementImpl superclass = ElementFactory.classElement2("A");
     ConstructorElementImpl superConstructor =
-    ElementFactory.constructorElement2(superclass, null);
+        ElementFactory.constructorElement2(superclass, null);
     superclass.constructors = <ConstructorElement>[superConstructor];
     ClassElementImpl subclass =
-    ElementFactory.classElement("B", superclass.type);
+        ElementFactory.classElement("B", superclass.type);
     ConstructorElementImpl subConstructor =
-    ElementFactory.constructorElement2(subclass, null);
+        ElementFactory.constructorElement2(subclass, null);
     subclass.constructors = <ConstructorElement>[subConstructor];
     SuperConstructorInvocation invocation =
-    AstFactory.superConstructorInvocation();
+        AstFactory.superConstructorInvocation();
     _resolveInClass(invocation, subclass);
     expect(invocation.staticElement, superConstructor);
     _listener.assertNoErrors();
@@ -816,15 +816,15 @@
   void test_visitSuperConstructorInvocation_namedParameter() {
     ClassElementImpl superclass = ElementFactory.classElement2("A");
     ConstructorElementImpl superConstructor =
-    ElementFactory.constructorElement2(superclass, null);
+        ElementFactory.constructorElement2(superclass, null);
     String parameterName = "p";
     ParameterElement parameter = ElementFactory.namedParameter(parameterName);
     superConstructor.parameters = <ParameterElement>[parameter];
     superclass.constructors = <ConstructorElement>[superConstructor];
     ClassElementImpl subclass =
-    ElementFactory.classElement("B", superclass.type);
+        ElementFactory.classElement("B", superclass.type);
     ConstructorElementImpl subConstructor =
-    ElementFactory.constructorElement2(subclass, null);
+        ElementFactory.constructorElement2(subclass, null);
     subclass.constructors = <ConstructorElement>[subConstructor];
     SuperConstructorInvocation invocation = AstFactory
         .superConstructorInvocation([
@@ -849,9 +849,9 @@
   ElementResolver _createResolver() {
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     FileBasedSource source =
-    new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
     CompilationUnitElementImpl definingCompilationUnit =
-    new CompilationUnitElementImpl("test.dart");
+        new CompilationUnitElementImpl("test.dart");
     definingCompilationUnit.librarySource =
         definingCompilationUnit.source = source;
     _definingLibrary = ElementFactory.library(context, "test");
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index 118b80b..536553b 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -624,10 +624,10 @@
     verify([source]);
   }
 
-  void test_deprecatedAnnotationUse_deprecated() {
+  void test_deprecatedAnnotationUse_Deprecated() {
     Source source = addSource(r'''
 class A {
-  @deprecated
+  @Deprecated('0.9')
   m() {}
   n() {m();}
 }''');
@@ -636,10 +636,10 @@
     verify([source]);
   }
 
-  void test_deprecatedAnnotationUse_Deprecated() {
+  void test_deprecatedAnnotationUse_deprecated() {
     Source source = addSource(r'''
 class A {
-  @Deprecated('0.9')
+  @deprecated
   m() {}
   n() {m();}
 }''');
diff --git a/pkg/analyzer/test/generated/incremental_resolver_test.dart b/pkg/analyzer/test/generated/incremental_resolver_test.dart
index 8800865..afd10bf 100644
--- a/pkg/analyzer/test/generated/incremental_resolver_test.dart
+++ b/pkg/analyzer/test/generated/incremental_resolver_test.dart
@@ -4775,6 +4775,34 @@
 ''');
   }
 
+  void test_updateFunctionToForLoop() {
+    _resolveUnit(r'''
+class PlayDrag {
+  final List<num> times = new List<num>();
+
+  PlayDrag.start() {}
+
+  void update(num pos) {
+    fo (int i = times.length - 2; i >= 0; i--) {}
+  }
+}
+''');
+
+    _updateAndValidate(
+        r'''
+class PlayDrag {
+  final List<num> times = new List<num>();
+
+  PlayDrag.start() {}
+
+  void update(num pos) {
+    for (int i = times.length - 2; i >= 0; i--) {}
+  }
+}
+''',
+        expectLibraryUnchanged: false);
+  }
+
   void test_visibleRange() {
     _resolveUnit(r'''
 class Test {
@@ -4846,34 +4874,6 @@
     }
   }
 
-  void test_updateFunctionToForLoop() {
-    _resolveUnit(r'''
-class PlayDrag {
-  final List<num> times = new List<num>();
-
-  PlayDrag.start() {}
-
-  void update(num pos) {
-    fo (int i = times.length - 2; i >= 0; i--) {}
-  }
-}
-''');
-
-    _updateAndValidate(
-        r'''
-class PlayDrag {
-  final List<num> times = new List<num>();
-
-  PlayDrag.start() {}
-
-  void update(num pos) {
-    for (int i = times.length - 2; i >= 0; i--) {}
-  }
-}
-''',
-        expectLibraryUnchanged: false);
-  }
-
   void _assertCacheResults(
       {bool expectLibraryUnchanged: true,
       bool expectCachePostConstantsValid: true}) {
@@ -5290,18 +5290,18 @@
   Object lastException;
   Object lastStackTrace;
 
-  void expectNoErrors() {
-    if (lastException != null) {
-      fail("logged an exception:\n$lastException\n$lastStackTrace\n");
-    }
-  }
-
   @override
   void enter(String name) {}
 
   @override
   void exit() {}
 
+  void expectNoErrors() {
+    if (lastException != null) {
+      fail("logged an exception:\n$lastException\n$lastStackTrace\n");
+    }
+  }
+
   @override
   void log(Object obj) {}
 
diff --git a/pkg/analyzer/test/generated/inheritance_manager_test.dart b/pkg/analyzer/test/generated/inheritance_manager_test.dart
index f8afcd0..e41df2f 100644
--- a/pkg/analyzer/test/generated/inheritance_manager_test.dart
+++ b/pkg/analyzer/test/generated/inheritance_manager_test.dart
@@ -66,13 +66,13 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(getterName), same(getterG));
@@ -86,14 +86,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject);
     expect(mapB.get(getterName), isNull);
@@ -107,14 +107,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(getterName), same(getterG));
@@ -126,7 +126,7 @@
     // class A {}
     ClassElementImpl classA = ElementFactory.classElement2("A");
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     expect(mapA.size, _numOfMembersInObject);
     _assertNoErrors(classA);
   }
@@ -137,14 +137,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.supertype = classA.type;
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(methodName), same(methodM));
@@ -158,14 +158,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject);
     expect(mapB.get(methodName), isNull);
@@ -179,14 +179,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(methodName), same(methodM));
@@ -201,16 +201,16 @@
     ClassElementImpl classA1 = ElementFactory.classElement2("A1");
     String methodName = "m";
     MethodElement methodA1M =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA1.methods = <MethodElement>[methodA1M];
     ClassElementImpl classA2 = ElementFactory.classElement2("A2");
     MethodElement methodA2M =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA2.methods = <MethodElement>[methodA2M];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA1.type, classA2.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     expect(mapB.get(methodName), same(methodA2M));
     _assertNoErrors(classA1);
     _assertNoErrors(classA2);
@@ -223,13 +223,13 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(getterName), same(getterG));
@@ -243,14 +243,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(getterName), same(getterG));
@@ -264,14 +264,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(getterName), same(getterG));
@@ -283,29 +283,29 @@
     // class A {}
     ClassElementImpl classA = ElementFactory.classElement2("A");
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     _assertNoErrors(classA);
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method() {
+      test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_getter_method() {
     // class I1 { int m(); }
     // class I2 { int get m; }
     // class A implements I2, I1 {}
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classI1.methods = <MethodElement>[methodM];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(methodName, false, _typeProvider.intType);
+        ElementFactory.getterElement(methodName, false, _typeProvider.intType);
     classI2.accessors = <PropertyAccessorElement>[getter];
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI2.type, classI1.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapA.get(methodName), isNull);
     _assertErrors(classA,
@@ -313,14 +313,14 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str() {
+      test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_int_str() {
     // class I1 { int m(); }
     // class I2 { String m(); }
     // class A implements I1, I2 {}
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElement methodM1 =
-    ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
+        ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElement methodM2 = ElementFactory
@@ -329,7 +329,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapA.get(methodName), isNull);
     _assertErrors(
@@ -337,23 +337,23 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter() {
+      test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_method_getter() {
     // class I1 { int m(); }
     // class I2 { int get m; }
     // class A implements I1, I2 {}
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classI1.methods = <MethodElement>[methodM];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     PropertyAccessorElement getter =
-    ElementFactory.getterElement(methodName, false, _typeProvider.intType);
+        ElementFactory.getterElement(methodName, false, _typeProvider.intType);
     classI2.accessors = <PropertyAccessorElement>[getter];
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapA.get(methodName), isNull);
     _assertErrors(classA,
@@ -361,37 +361,37 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams() {
+      test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_numOfRequiredParams() {
     // class I1 { dynamic m(int, [int]); }
     // class I2 { dynamic m(int, int, int); }
     // class A implements I1, I2 {}
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElementImpl methodM1 =
-    ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
     ParameterElementImpl parameter1 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
     parameter1.type = _typeProvider.intType;
     parameter1.parameterKind = ParameterKind.REQUIRED;
     ParameterElementImpl parameter2 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
     parameter2.type = _typeProvider.intType;
     parameter2.parameterKind = ParameterKind.POSITIONAL;
     methodM1.parameters = <ParameterElement>[parameter1, parameter2];
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElementImpl methodM2 =
-    ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
     ParameterElementImpl parameter3 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
     parameter3.type = _typeProvider.intType;
     parameter3.parameterKind = ParameterKind.REQUIRED;
     ParameterElementImpl parameter4 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a4"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a4"));
     parameter4.type = _typeProvider.intType;
     parameter4.parameterKind = ParameterKind.REQUIRED;
     ParameterElementImpl parameter5 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a5"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a5"));
     parameter5.type = _typeProvider.intType;
     parameter5.parameterKind = ParameterKind.REQUIRED;
     methodM2.parameters = <ParameterElement>[
@@ -403,7 +403,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapA.get(methodName), isNull);
     _assertErrors(
@@ -411,7 +411,7 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int() {
+      test_getMapOfMembersInheritedFromInterfaces_inconsistentMethodInheritance_str_int() {
     // class I1 { int m(); }
     // class I2 { String m(); }
     // class A implements I2, I1 {}
@@ -422,12 +422,12 @@
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElement methodM2 =
-    ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
+        ElementFactory.methodElement(methodName, null, [_typeProvider.intType]);
     classI2.methods = <MethodElement>[methodM2];
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI2.type, classI1.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapA.get(methodName), isNull);
     _assertErrors(
@@ -440,13 +440,13 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(methodName), same(methodM));
@@ -460,14 +460,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(methodName), same(methodM));
@@ -481,14 +481,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
     MemberMap mapB =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject);
     expect(mapB.size, _numOfMembersInObject + 1);
     expect(mapB.get(methodName), same(methodM));
@@ -503,17 +503,17 @@
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName1 = "m1";
     MethodElement methodM1 =
-    ElementFactory.methodElement(methodName1, _typeProvider.intType);
+        ElementFactory.methodElement(methodName1, _typeProvider.intType);
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     String methodName2 = "m2";
     MethodElement methodM2 =
-    ElementFactory.methodElement(methodName2, _typeProvider.intType);
+        ElementFactory.methodElement(methodName2, _typeProvider.intType);
     classI2.methods = <MethodElement>[methodM2];
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject + 2);
     expect(mapA.get(methodName1), same(methodM1));
     expect(mapA.get(methodName2), same(methodM2));
@@ -521,7 +521,7 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters() {
+      test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_getters() {
     // class I1 { int get g; }
     // class I2 { num get g; }
     // class A implements I1, I2 {}
@@ -537,7 +537,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject + 1);
     PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(
         accessorName, false, _typeProvider.dynamicType);
@@ -546,25 +546,25 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() {
+      test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_methods() {
     // class I1 { dynamic m(int); }
     // class I2 { dynamic m(num); }
     // class A implements I1, I2 {}
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElementImpl methodM1 =
-    ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
     ParameterElementImpl parameter1 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
     parameter1.type = _typeProvider.intType;
     parameter1.parameterKind = ParameterKind.REQUIRED;
     methodM1.parameters = <ParameterElement>[parameter1];
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElementImpl methodM2 =
-    ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
     ParameterElementImpl parameter2 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
     parameter2.type = _typeProvider.numType;
     parameter2.parameterKind = ParameterKind.REQUIRED;
     methodM2.parameters = <ParameterElement>[parameter2];
@@ -572,7 +572,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject + 1);
     MethodElement syntheticMethod = ElementFactory.methodElement(
         methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
@@ -581,7 +581,7 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters() {
+      test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_2_setters() {
     // class I1 { set s(int); }
     // class I2 { set s(num); }
     // class A implements I1, I2 {}
@@ -597,7 +597,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject + 1);
     PropertyAccessorElementImpl syntheticAccessor = ElementFactory
         .setterElement(accessorName, false, _typeProvider.dynamicType);
@@ -607,7 +607,7 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() {
+      test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_getters() {
     // class A {}
     // class B extends A {}
     // class C extends B {}
@@ -621,15 +621,15 @@
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String accessorName = "g";
     PropertyAccessorElement getter1 =
-    ElementFactory.getterElement(accessorName, false, classA.type);
+        ElementFactory.getterElement(accessorName, false, classA.type);
     classI1.accessors = <PropertyAccessorElement>[getter1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     PropertyAccessorElement getter2 =
-    ElementFactory.getterElement(accessorName, false, classB.type);
+        ElementFactory.getterElement(accessorName, false, classB.type);
     classI2.accessors = <PropertyAccessorElement>[getter2];
     ClassElementImpl classI3 = ElementFactory.classElement2("I3");
     PropertyAccessorElement getter3 =
-    ElementFactory.getterElement(accessorName, false, classC.type);
+        ElementFactory.getterElement(accessorName, false, classC.type);
     classI3.accessors = <PropertyAccessorElement>[getter3];
     ClassElementImpl classD = ElementFactory.classElement2("D");
     classD.interfaces = <InterfaceType>[
@@ -638,7 +638,7 @@
       classI3.type
     ];
     MemberMap mapD =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
     expect(mapD.size, _numOfMembersInObject + 1);
     PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(
         accessorName, false, _typeProvider.dynamicType);
@@ -647,7 +647,7 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() {
+      test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_methods() {
     // class A {}
     // class B extends A {}
     // class C extends B {}
@@ -661,27 +661,27 @@
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElementImpl methodM1 =
-    ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
     ParameterElementImpl parameter1 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
     parameter1.type = classA.type;
     parameter1.parameterKind = ParameterKind.REQUIRED;
     methodM1.parameters = <ParameterElement>[parameter1];
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElementImpl methodM2 =
-    ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
     ParameterElementImpl parameter2 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
     parameter2.type = classB.type;
     parameter2.parameterKind = ParameterKind.REQUIRED;
     methodM2.parameters = <ParameterElement>[parameter2];
     classI2.methods = <MethodElement>[methodM2];
     ClassElementImpl classI3 = ElementFactory.classElement2("I3");
     MethodElementImpl methodM3 =
-    ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
+        ElementFactory.methodElement(methodName, _typeProvider.dynamicType);
     ParameterElementImpl parameter3 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a0"));
     parameter3.type = classC.type;
     parameter3.parameterKind = ParameterKind.REQUIRED;
     methodM3.parameters = <ParameterElement>[parameter3];
@@ -693,7 +693,7 @@
       classI3.type
     ];
     MemberMap mapD =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
     expect(mapD.size, _numOfMembersInObject + 1);
     MethodElement syntheticMethod = ElementFactory.methodElement(
         methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
@@ -702,7 +702,7 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters() {
+      test_getMapOfMembersInheritedFromInterfaces_union_multipleSubtypes_3_setters() {
     // class A {}
     // class B extends A {}
     // class C extends B {}
@@ -716,15 +716,15 @@
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String accessorName = "s";
     PropertyAccessorElement setter1 =
-    ElementFactory.setterElement(accessorName, false, classA.type);
+        ElementFactory.setterElement(accessorName, false, classA.type);
     classI1.accessors = <PropertyAccessorElement>[setter1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     PropertyAccessorElement setter2 =
-    ElementFactory.setterElement(accessorName, false, classB.type);
+        ElementFactory.setterElement(accessorName, false, classB.type);
     classI2.accessors = <PropertyAccessorElement>[setter2];
     ClassElementImpl classI3 = ElementFactory.classElement2("I3");
     PropertyAccessorElement setter3 =
-    ElementFactory.setterElement(accessorName, false, classC.type);
+        ElementFactory.setterElement(accessorName, false, classC.type);
     classI3.accessors = <PropertyAccessorElement>[setter3];
     ClassElementImpl classD = ElementFactory.classElement2("D");
     classD.interfaces = <InterfaceType>[
@@ -733,7 +733,7 @@
       classI3.type
     ];
     MemberMap mapD =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
     expect(mapD.size, _numOfMembersInObject + 1);
     PropertyAccessorElementImpl syntheticAccessor = ElementFactory
         .setterElement(accessorName, false, _typeProvider.dynamicType);
@@ -743,20 +743,20 @@
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() {
+      test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_2_methods() {
     // class I1 { int m(); }
     // class I2 { int m([int]); }
     // class A implements I1, I2 {}
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElement methodM1 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElementImpl methodM2 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     ParameterElementImpl parameter1 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
     parameter1.type = _typeProvider.intType;
     parameter1.parameterKind = ParameterKind.POSITIONAL;
     methodM2.parameters = <ParameterElement>[parameter1];
@@ -764,14 +764,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     classA.interfaces = <InterfaceType>[classI1.type, classI2.type];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject + 1);
     expect(mapA.get(methodName), same(methodM2));
     _assertNoErrors(classA);
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() {
+      test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_3_methods() {
     // class I1 { int m(); }
     // class I2 { int m([int]); }
     // class I3 { int m([int, int]); }
@@ -779,26 +779,26 @@
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElementImpl methodM1 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElementImpl methodM2 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     ParameterElementImpl parameter1 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
     parameter1.type = _typeProvider.intType;
     parameter1.parameterKind = ParameterKind.POSITIONAL;
     methodM1.parameters = <ParameterElement>[parameter1];
     classI2.methods = <MethodElement>[methodM2];
     ClassElementImpl classI3 = ElementFactory.classElement2("I3");
     MethodElementImpl methodM3 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     ParameterElementImpl parameter2 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
     parameter2.type = _typeProvider.intType;
     parameter2.parameterKind = ParameterKind.POSITIONAL;
     ParameterElementImpl parameter3 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
     parameter3.type = _typeProvider.intType;
     parameter3.parameterKind = ParameterKind.POSITIONAL;
     methodM3.parameters = <ParameterElement>[parameter2, parameter3];
@@ -810,14 +810,14 @@
       classI3.type
     ];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject + 1);
     expect(mapA.get(methodName), same(methodM3));
     _assertNoErrors(classA);
   }
 
   void
-  test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods() {
+      test_getMapOfMembersInheritedFromInterfaces_union_oneSubtype_4_methods() {
     // class I1 { int m(); }
     // class I2 { int m(); }
     // class I3 { int m([int]); }
@@ -826,30 +826,30 @@
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName = "m";
     MethodElement methodM1 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     MethodElement methodM2 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classI2.methods = <MethodElement>[methodM2];
     ClassElementImpl classI3 = ElementFactory.classElement2("I3");
     MethodElementImpl methodM3 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     ParameterElementImpl parameter1 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a1"));
     parameter1.type = _typeProvider.intType;
     parameter1.parameterKind = ParameterKind.POSITIONAL;
     methodM3.parameters = <ParameterElement>[parameter1];
     classI3.methods = <MethodElement>[methodM3];
     ClassElementImpl classI4 = ElementFactory.classElement2("I4");
     MethodElementImpl methodM4 =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     ParameterElementImpl parameter2 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a2"));
     parameter2.type = _typeProvider.intType;
     parameter2.parameterKind = ParameterKind.POSITIONAL;
     ParameterElementImpl parameter3 =
-    new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
+        new ParameterElementImpl.forNode(AstFactory.identifier3("a3"));
     parameter3.type = _typeProvider.intType;
     parameter3.parameterKind = ParameterKind.POSITIONAL;
     methodM4.parameters = <ParameterElement>[parameter2, parameter3];
@@ -862,7 +862,7 @@
       classI4.type
     ];
     MemberMap mapA =
-    _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
+        _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
     expect(mapA.size, _numOfMembersInObject + 1);
     expect(mapA.get(methodName), same(methodM4));
     _assertNoErrors(classA);
@@ -872,7 +872,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
@@ -886,7 +886,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
@@ -900,7 +900,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String setterName = "s";
     PropertyAccessorElement setterS =
-    ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[setterS];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
@@ -914,7 +914,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
@@ -945,12 +945,12 @@
     ClassElementImpl classI1 = ElementFactory.classElement2("I1");
     String methodName1 = "m1";
     MethodElement methodM1 =
-    ElementFactory.methodElement(methodName1, _typeProvider.intType);
+        ElementFactory.methodElement(methodName1, _typeProvider.intType);
     classI1.methods = <MethodElement>[methodM1];
     ClassElementImpl classI2 = ElementFactory.classElement2("I2");
     String methodName2 = "m2";
     MethodElement methodM2 =
-    ElementFactory.methodElement(methodName2, _typeProvider.intType);
+        ElementFactory.methodElement(methodName2, _typeProvider.intType);
     classI2.methods = <MethodElement>[methodM2];
     classI2.interfaces = <InterfaceType>[classI1.type];
     ClassElementImpl classA = ElementFactory.classElement2("A");
@@ -968,7 +968,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
@@ -982,7 +982,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
@@ -996,7 +996,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String setterName = "s";
     PropertyAccessorElement setterS =
-    ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[setterS];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.mixins = <InterfaceType>[classA.type];
@@ -1010,7 +1010,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B");
@@ -1030,7 +1030,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, getterName),
@@ -1060,7 +1060,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, methodName),
@@ -1073,7 +1073,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String setterName = "s";
     PropertyAccessorElement setterS =
-    ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[setterS];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     expect(_inheritanceManager.lookupInheritance(classB, "$setterName="),
@@ -1086,7 +1086,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement>[methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
@@ -1099,7 +1099,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, false, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     expect(_inheritanceManager.lookupMember(classA, getterName), same(getterG));
     _assertNoErrors(classA);
@@ -1109,7 +1109,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String getterName = "g";
     PropertyAccessorElement getterG =
-    ElementFactory.getterElement(getterName, true, _typeProvider.intType);
+        ElementFactory.getterElement(getterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[getterG];
     expect(_inheritanceManager.lookupMember(classA, getterName), isNull);
     _assertNoErrors(classA);
@@ -1119,7 +1119,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     expect(_inheritanceManager.lookupMember(classA, methodName), same(methodM));
     _assertNoErrors(classA);
@@ -1129,7 +1129,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElement methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement>[methodM];
     expect(_inheritanceManager.lookupMember(classA, methodName), isNull);
@@ -1146,7 +1146,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String setterName = "s";
     PropertyAccessorElement setterS =
-    ElementFactory.setterElement(setterName, false, _typeProvider.intType);
+        ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[setterS];
     expect(_inheritanceManager.lookupMember(classA, "$setterName="),
         same(setterS));
@@ -1157,7 +1157,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String setterName = "s";
     PropertyAccessorElement setterS =
-    ElementFactory.setterElement(setterName, true, _typeProvider.intType);
+        ElementFactory.setterElement(setterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement>[setterS];
     expect(_inheritanceManager.lookupMember(classA, setterName), isNull);
     _assertNoErrors(classA);
@@ -1167,7 +1167,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElementImpl methodM =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodM];
     expect(
         _inheritanceManager.lookupOverrides(classA, methodName), hasLength(0));
@@ -1178,14 +1178,14 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElementImpl methodMinA =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodMinA];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
     MethodElementImpl methodMinB =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classB.methods = <MethodElement>[methodMinB];
     List<ExecutableElement> overrides =
-    _inheritanceManager.lookupOverrides(classB, methodName);
+        _inheritanceManager.lookupOverrides(classB, methodName);
     expect(overrides, unorderedEquals([methodMinA]));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
@@ -1195,15 +1195,15 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElementImpl methodMinA =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodMinA];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     classB.interfaces = <InterfaceType>[classA.type];
     MethodElementImpl methodMinB =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classB.methods = <MethodElement>[methodMinB];
     List<ExecutableElement> overrides =
-    _inheritanceManager.lookupOverrides(classB, methodName);
+        _inheritanceManager.lookupOverrides(classB, methodName);
     expect(overrides, unorderedEquals([methodMinA]));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
@@ -1213,19 +1213,19 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     String methodName = "m";
     MethodElementImpl methodMinA =
-    ElementFactory.methodElement(methodName, _typeProvider.intType);
+        ElementFactory.methodElement(methodName, _typeProvider.intType);
     classA.methods = <MethodElement>[methodMinA];
     ClassElementImpl classB = ElementFactory.classElement2("B");
     MethodElementImpl methodMinB =
-    ElementFactory.methodElement(methodName, _typeProvider.doubleType);
+        ElementFactory.methodElement(methodName, _typeProvider.doubleType);
     classB.methods = <MethodElement>[methodMinB];
     ClassElementImpl classC = ElementFactory.classElement2("C");
     classC.interfaces = <InterfaceType>[classA.type, classB.type];
     MethodElementImpl methodMinC =
-    ElementFactory.methodElement(methodName, _typeProvider.numType);
+        ElementFactory.methodElement(methodName, _typeProvider.numType);
     classC.methods = <MethodElement>[methodMinC];
     List<ExecutableElement> overrides =
-    _inheritanceManager.lookupOverrides(classC, methodName);
+        _inheritanceManager.lookupOverrides(classC, methodName);
     expect(overrides, unorderedEquals([methodMinA, methodMinB]));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
@@ -1236,7 +1236,7 @@
       [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     HashSet<AnalysisError> actualErrors =
-    _inheritanceManager.getErrors(classElt);
+        _inheritanceManager.getErrors(classElt);
     if (actualErrors != null) {
       for (AnalysisError error in actualErrors) {
         errorListener.onError(error);
@@ -1257,9 +1257,9 @@
   InheritanceManager _createInheritanceManager() {
     AnalysisContext context = AnalysisContextFactory.contextWithCore();
     FileBasedSource source =
-    new FileBasedSource(FileUtilities2.createFile("/test.dart"));
+        new FileBasedSource(FileUtilities2.createFile("/test.dart"));
     CompilationUnitElementImpl definingCompilationUnit =
-    new CompilationUnitElementImpl("test.dart");
+        new CompilationUnitElementImpl("test.dart");
     definingCompilationUnit.librarySource =
         definingCompilationUnit.source = source;
     _definingLibrary = ElementFactory.library(context, "test");
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 292d016..fd3a422 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1477,6 +1477,26 @@
     verify([source]);
   }
 
+  void test_constRedirectSkipsSupertype() {
+    // Since C redirects to C.named, it doesn't implicitly refer to B's
+    // unnamed constructor.  Therefore there is no cycle.
+    Source source = addSource('''
+class B {
+  final x;
+  const B() : x = y;
+  const B.named() : x = null;
+}
+class C extends B {
+  const C() : this.named();
+  const C.named() : super.named();
+}
+const y = const C();
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_constructorDeclaration_scope_signature() {
     Source source = addSource(r'''
 const app = 0;
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index ea02857..9fc01e2 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -9743,6 +9743,7 @@
   void test_parseStatement_singleLabel() {
     LabeledStatement statement = parse4("parseStatement", "l: return x;");
     expect(statement.labels, hasLength(1));
+    expect(statement.labels[0].label.inDeclarationContext(), isTrue);
     expect(statement.statement, isNotNull);
   }
 
@@ -10013,7 +10014,32 @@
     expect(statement.rightParenthesis, isNotNull);
     expect(statement.leftBracket, isNotNull);
     expect(statement.members, hasLength(1));
-    expect(statement.members[0].labels, hasLength(3));
+    {
+      List<Label> labels = statement.members[0].labels;
+      expect(labels, hasLength(3));
+      expect(labels[0].label.inDeclarationContext(), isTrue);
+      expect(labels[1].label.inDeclarationContext(), isTrue);
+      expect(labels[2].label.inDeclarationContext(), isTrue);
+    }
+    expect(statement.rightBracket, isNotNull);
+  }
+
+  void test_parseSwitchStatement_labeledDefault() {
+    SwitchStatement statement =
+        parse4("parseSwitchStatement", "switch (a) {l1: l2: l3: default:}");
+    expect(statement.switchKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(1));
+    {
+      List<Label> labels = statement.members[0].labels;
+      expect(labels, hasLength(3));
+      expect(labels[0].label.inDeclarationContext(), isTrue);
+      expect(labels[1].label.inDeclarationContext(), isTrue);
+      expect(labels[2].label.inDeclarationContext(), isTrue);
+    }
     expect(statement.rightBracket, isNotNull);
   }
 
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index f6bd1cf..264d393 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -24,447 +24,6 @@
 import 'analysis_context_factory.dart';
 import 'test_support.dart';
 
-class ResolverTestCase extends EngineTestCase {
-  /**
-   * The analysis context used to parse the compilation units being resolved.
-   */
-  InternalAnalysisContext analysisContext2;
-
-  /**
-   * Specifies if [assertErrors] should check for [HintCode.UNUSED_ELEMENT] and
-   * [HintCode.UNUSED_FIELD].
-   */
-  bool enableUnusedElement = false;
-
-  /**
-   * Specifies if [assertErrors] should check for [HintCode.UNUSED_LOCAL_VARIABLE].
-   */
-  bool enableUnusedLocalVariable = false;
-
-  AnalysisContext get analysisContext => analysisContext2;
-
-  /**
-   * Return a type provider that can be used to test the results of resolution.
-   *
-   * @return a type provider
-   * @throws AnalysisException if dart:core cannot be resolved
-   */
-  TypeProvider get typeProvider => analysisContext2.typeProvider;
-
-  /**
-   * Return a type system that can be used to test the results of resolution.
-   *
-   * @return a type system
-   */
-  TypeSystem get typeSystem => analysisContext2.typeSystem;
-
-  /**
-   * Add a source file to the content provider. The file path should be absolute.
-   *
-   * @param filePath the path of the file being added
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the added file
-   */
-  Source addNamedSource(String filePath, String contents) {
-    Source source = cacheSource(filePath, contents);
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.addedSource(source);
-    analysisContext2.applyChanges(changeSet);
-    return source;
-  }
-
-  /**
-   * Add a source file to the content provider.
-   *
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the added file
-   */
-  Source addSource(String contents) => addNamedSource("/test.dart", contents);
-
-  /**
-   * Assert that the number of errors reported against the given source matches the number of errors
-   * that are given and that they have the expected error codes. The order in which the errors were
-   * gathered is ignored.
-   *
-   * @param source the source against which the errors should have been reported
-   * @param expectedErrorCodes the error codes of the errors that should have been reported
-   * @throws AnalysisException if the reported errors could not be computed
-   * @throws AssertionFailedError if a different number of errors have been reported than were
-   *           expected
-   */
-  void assertErrors(Source source,
-      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    for (AnalysisError error in analysisContext2.computeErrors(source)) {
-      expect(error.source, source);
-      ErrorCode errorCode = error.errorCode;
-      if (!enableUnusedElement &&
-          (errorCode == HintCode.UNUSED_ELEMENT ||
-              errorCode == HintCode.UNUSED_FIELD)) {
-        continue;
-      }
-      if (!enableUnusedLocalVariable &&
-          (errorCode == HintCode.UNUSED_CATCH_CLAUSE ||
-              errorCode == HintCode.UNUSED_CATCH_STACK ||
-              errorCode == HintCode.UNUSED_LOCAL_VARIABLE)) {
-        continue;
-      }
-      errorListener.onError(error);
-    }
-    errorListener.assertErrorsWithCodes(expectedErrorCodes);
-  }
-
-  /**
-   * Asserts that [code] verifies, but has errors with the given error codes.
-   *
-   * Like [assertErrors], but takes a string of source code.
-   */
-  // TODO(rnystrom): Use this in more tests that have the same structure.
-  void assertErrorsInCode(String code, List<ErrorCode> errors) {
-    Source source = addSource(code);
-    computeLibrarySourceErrors(source);
-    assertErrors(source, errors);
-    verify([source]);
-  }
-
-  /**
-   * Asserts that [code] has errors with the given error codes.
-   *
-   * Like [assertErrors], but takes a string of source code.
-   */
-  void assertErrorsInUnverifiedCode(String code, List<ErrorCode> errors) {
-    Source source = addSource(code);
-    computeLibrarySourceErrors(source);
-    assertErrors(source, errors);
-  }
-
-  /**
-   * Assert that no errors have been reported against the given source.
-   *
-   * @param source the source against which no errors should have been reported
-   * @throws AnalysisException if the reported errors could not be computed
-   * @throws AssertionFailedError if any errors have been reported
-   */
-  void assertNoErrors(Source source) {
-    assertErrors(source);
-  }
-
-  /**
-   * Asserts that [code] has no errors or warnings.
-   */
-  // TODO(rnystrom): Use this in more tests that have the same structure.
-  void assertNoErrorsInCode(String code) {
-    Source source = addSource(code);
-    computeLibrarySourceErrors(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  /**
-   * Cache the source file content in the source factory but don't add the source to the analysis
-   * context. The file path should be absolute.
-   *
-   * @param filePath the path of the file being cached
-   * @param contents the contents to be returned by the content provider for the specified file
-   * @return the source object representing the cached file
-   */
-  Source cacheSource(String filePath, String contents) {
-    Source source = new FileBasedSource(FileUtilities2.createFile(filePath));
-    analysisContext2.setContents(source, contents);
-    return source;
-  }
-
-  /**
-   * Change the contents of the given [source] to the given [contents].
-   */
-  void changeSource(Source source, String contents) {
-    analysisContext2.setContents(source, contents);
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.changedSource(source);
-    analysisContext2.applyChanges(changeSet);
-  }
-
-  /**
-   * Computes errors for the given [librarySource].
-   * This assumes that the given [librarySource] and its parts have already
-   * been added to the content provider using the method [addNamedSource].
-   */
-  void computeLibrarySourceErrors(Source librarySource) {
-    analysisContext.computeErrors(librarySource);
-  }
-
-  /**
-   * Create a library element that represents a library named `"test"` containing a single
-   * empty compilation unit.
-   *
-   * @return the library element that was created
-   */
-  LibraryElementImpl createDefaultTestLibrary() =>
-      createTestLibrary(AnalysisContextFactory.contextWithCore(), "test");
-
-  /**
-   * Create a library element that represents a library with the given name containing a single
-   * empty compilation unit.
-   *
-   * @param libraryName the name of the library to be created
-   * @return the library element that was created
-   */
-  LibraryElementImpl createTestLibrary(
-      AnalysisContext context, String libraryName,
-      [List<String> typeNames]) {
-    String fileName = "$libraryName.dart";
-    FileBasedSource definingCompilationUnitSource =
-    createNamedSource(fileName);
-    List<CompilationUnitElement> sourcedCompilationUnits;
-    if (typeNames == null) {
-      sourcedCompilationUnits = CompilationUnitElement.EMPTY_LIST;
-    } else {
-      int count = typeNames.length;
-      sourcedCompilationUnits = new List<CompilationUnitElement>(count);
-      for (int i = 0; i < count; i++) {
-        String typeName = typeNames[i];
-        ClassElementImpl type =
-        new ClassElementImpl.forNode(AstFactory.identifier3(typeName));
-        String fileName = "$typeName.dart";
-        CompilationUnitElementImpl compilationUnit =
-        new CompilationUnitElementImpl(fileName);
-        compilationUnit.source = createNamedSource(fileName);
-        compilationUnit.librarySource = definingCompilationUnitSource;
-        compilationUnit.types = <ClassElement>[type];
-        sourcedCompilationUnits[i] = compilationUnit;
-      }
-    }
-    CompilationUnitElementImpl compilationUnit =
-    new CompilationUnitElementImpl(fileName);
-    compilationUnit.librarySource =
-        compilationUnit.source = definingCompilationUnitSource;
-    LibraryElementImpl library = new LibraryElementImpl.forNode(
-        context, AstFactory.libraryIdentifier2([libraryName]));
-    library.definingCompilationUnit = compilationUnit;
-    library.parts = sourcedCompilationUnits;
-    return library;
-  }
-
-  Expression findTopLevelConstantExpression(
-      CompilationUnit compilationUnit, String name) =>
-      findTopLevelDeclaration(compilationUnit, name).initializer;
-
-  VariableDeclaration findTopLevelDeclaration(
-      CompilationUnit compilationUnit, String name) {
-    for (CompilationUnitMember member in compilationUnit.declarations) {
-      if (member is TopLevelVariableDeclaration) {
-        for (VariableDeclaration variable in member.variables.variables) {
-          if (variable.name.name == name) {
-            return variable;
-          }
-        }
-      }
-    }
-    return null;
-    // Not found
-  }
-
-  /**
-   * In the rare cases we want to group several tests into single "test_" method, so need a way to
-   * reset test instance to reuse it.
-   */
-  void reset() {
-    analysisContext2 = AnalysisContextFactory.contextWithCore();
-  }
-
-  /**
-   * Reset the analysis context to have the given options applied.
-   *
-   * @param options the analysis options to be applied to the context
-   */
-  void resetWithOptions(AnalysisOptions options) {
-    analysisContext2 =
-        AnalysisContextFactory.contextWithCoreAndOptions(options);
-  }
-
-  /**
-   * Given a library and all of its parts, resolve the contents of the library and the contents of
-   * the parts. This assumes that the sources for the library and its parts have already been added
-   * to the content provider using the method [addNamedSource].
-   *
-   * @param librarySource the source for the compilation unit that defines the library
-   * @return the element representing the resolved library
-   * @throws AnalysisException if the analysis could not be performed
-   */
-  LibraryElement resolve2(Source librarySource) =>
-      analysisContext2.computeLibraryElement(librarySource);
-
-  /**
-   * Return the resolved compilation unit corresponding to the given source in the given library.
-   *
-   * @param source the source of the compilation unit to be returned
-   * @param library the library in which the compilation unit is to be resolved
-   * @return the resolved compilation unit
-   * @throws Exception if the compilation unit could not be resolved
-   */
-  CompilationUnit resolveCompilationUnit(
-      Source source, LibraryElement library) =>
-      analysisContext2.resolveCompilationUnit(source, library);
-
-  CompilationUnit resolveSource(String sourceText) =>
-      resolveSource2("/test.dart", sourceText);
-
-  CompilationUnit resolveSource2(String fileName, String sourceText) {
-    Source source = addNamedSource(fileName, sourceText);
-    LibraryElement library = analysisContext.computeLibraryElement(source);
-    return analysisContext.resolveCompilationUnit(source, library);
-  }
-
-  Source resolveSources(List<String> sourceTexts) {
-    for (int i = 0; i < sourceTexts.length; i++) {
-      CompilationUnit unit =
-      resolveSource2("/lib${i + 1}.dart", sourceTexts[i]);
-      // reference the source if this is the last source
-      if (i + 1 == sourceTexts.length) {
-        return unit.element.source;
-      }
-    }
-    return null;
-  }
-
-  void resolveWithAndWithoutExperimental(
-      List<String> strSources,
-      List<ErrorCode> codesWithoutExperimental,
-      List<ErrorCode> codesWithExperimental) {
-    // Setup analysis context as non-experimental
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-//    options.enableDeferredLoading = false;
-    resetWithOptions(options);
-    // Analysis and assertions
-    Source source = resolveSources(strSources);
-    assertErrors(source, codesWithoutExperimental);
-    verify([source]);
-    // Setup analysis context as experimental
-    reset();
-    // Analysis and assertions
-    source = resolveSources(strSources);
-    assertErrors(source, codesWithExperimental);
-    verify([source]);
-  }
-
-  void resolveWithErrors(List<String> strSources, List<ErrorCode> codes) {
-    // Analysis and assertions
-    Source source = resolveSources(strSources);
-    assertErrors(source, codes);
-    verify([source]);
-  }
-
-  @override
-  void setUp() {
-    ElementFactory.flushStaticState();
-    super.setUp();
-    reset();
-  }
-
-  @override
-  void tearDown() {
-    analysisContext2 = null;
-    super.tearDown();
-  }
-
-  /**
-   * Verify that all of the identifiers in the compilation units associated with
-   * the given [sources] have been resolved.
-   */
-  void verify(List<Source> sources) {
-    ResolutionVerifier verifier = new ResolutionVerifier();
-    for (Source source in sources) {
-      List<Source> libraries = analysisContext2.getLibrariesContaining(source);
-      for (Source library in libraries) {
-        analysisContext2
-            .resolveCompilationUnit2(source, library)
-            .accept(verifier);
-      }
-    }
-    verifier.assertResolved();
-  }
-
-  /**
-   * @param code the code that assigns the value to the variable "v", no matter how. We check that
-   *          "v" has expected static and propagated type.
-   */
-  void assertPropagatedAssignedType(String code, DartType expectedStaticType,
-      DartType expectedPropagatedType) {
-    SimpleIdentifier identifier = findMarkedIdentifier(code, "v = ");
-    expect(identifier.staticType, same(expectedStaticType));
-    expect(identifier.propagatedType, same(expectedPropagatedType));
-  }
-
-  /**
-   * @param code the code that iterates using variable "v". We check that
-   *          "v" has expected static and propagated type.
-   */
-  void assertPropagatedIterationType(String code, DartType expectedStaticType,
-      DartType expectedPropagatedType) {
-    SimpleIdentifier identifier = findMarkedIdentifier(code, "v in ");
-    expect(identifier.staticType, same(expectedStaticType));
-    expect(identifier.propagatedType, same(expectedPropagatedType));
-  }
-
-  /**
-   * Check the static and propagated types of the expression marked with "; // marker" comment.
-   *
-   * @param code source code to analyze, with the expression to check marked with "// marker".
-   * @param expectedStaticType if non-null, check actual static type is equal to this.
-   * @param expectedPropagatedType if non-null, check actual static type is equal to this.
-   * @throws Exception
-   */
-  void assertTypeOfMarkedExpression(String code, DartType expectedStaticType,
-      DartType expectedPropagatedType) {
-    SimpleIdentifier identifier = findMarkedIdentifier(code, "; // marker");
-    if (expectedStaticType != null) {
-      expect(identifier.staticType, expectedStaticType);
-    }
-    expect(identifier.propagatedType, expectedPropagatedType);
-  }
-
-  /**
-   * Create a source object representing a file with the given [fileName] and
-   * give it an empty content. Return the source that was created.
-   */
-  FileBasedSource createNamedSource(String fileName) {
-    FileBasedSource source =
-    new FileBasedSource(FileUtilities2.createFile(fileName));
-    analysisContext2.setContents(source, "");
-    return source;
-  }
-
-  /**
-   * Return the `SimpleIdentifier` marked by `marker`. The source code must have no
-   * errors and be verifiable.
-   *
-   * @param code source code to analyze.
-   * @param marker marker identifying sought after expression in source code.
-   * @return expression marked by the marker.
-   * @throws Exception
-   */
-  SimpleIdentifier findMarkedIdentifier(String code, String marker) {
-    try {
-      Source source = addSource(code);
-      LibraryElement library = resolve2(source);
-      assertNoErrors(source);
-      verify([source]);
-      CompilationUnit unit = resolveCompilationUnit(source, library);
-      // Could generalize this further by making [SimpleIdentifier.class] a
-      // parameter.
-      return EngineTestCase.findNode(
-          unit, code, marker, (node) => node is SimpleIdentifier);
-    } catch (exception) {
-      // Is there a better exception to throw here? The point is that an
-      // assertion failure here should be a failure, in both "test_*" and
-      // "fail_*" tests. However, an assertion failure is success for the
-      // purpose of "fail_*" tests, so without catching them here "fail_*" tests
-      // can succeed by failing for the wrong reason.
-      throw new JavaException("Unexexpected assertion failure: $exception");
-    }
-  }
-}
-
 /**
  * An AST visitor used to verify that all of the nodes in an AST structure that
  * should have been resolved were resolved.
@@ -738,6 +297,446 @@
   }
 }
 
+class ResolverTestCase extends EngineTestCase {
+  /**
+   * The analysis context used to parse the compilation units being resolved.
+   */
+  InternalAnalysisContext analysisContext2;
+
+  /**
+   * Specifies if [assertErrors] should check for [HintCode.UNUSED_ELEMENT] and
+   * [HintCode.UNUSED_FIELD].
+   */
+  bool enableUnusedElement = false;
+
+  /**
+   * Specifies if [assertErrors] should check for [HintCode.UNUSED_LOCAL_VARIABLE].
+   */
+  bool enableUnusedLocalVariable = false;
+
+  AnalysisContext get analysisContext => analysisContext2;
+
+  /**
+   * Return a type provider that can be used to test the results of resolution.
+   *
+   * @return a type provider
+   * @throws AnalysisException if dart:core cannot be resolved
+   */
+  TypeProvider get typeProvider => analysisContext2.typeProvider;
+
+  /**
+   * Return a type system that can be used to test the results of resolution.
+   *
+   * @return a type system
+   */
+  TypeSystem get typeSystem => analysisContext2.typeSystem;
+
+  /**
+   * Add a source file to the content provider. The file path should be absolute.
+   *
+   * @param filePath the path of the file being added
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addNamedSource(String filePath, String contents) {
+    Source source = cacheSource(filePath, contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    analysisContext2.applyChanges(changeSet);
+    return source;
+  }
+
+  /**
+   * Add a source file to the content provider.
+   *
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the added file
+   */
+  Source addSource(String contents) => addNamedSource("/test.dart", contents);
+
+  /**
+   * Assert that the number of errors reported against the given source matches the number of errors
+   * that are given and that they have the expected error codes. The order in which the errors were
+   * gathered is ignored.
+   *
+   * @param source the source against which the errors should have been reported
+   * @param expectedErrorCodes the error codes of the errors that should have been reported
+   * @throws AnalysisException if the reported errors could not be computed
+   * @throws AssertionFailedError if a different number of errors have been reported than were
+   *           expected
+   */
+  void assertErrors(Source source,
+      [List<ErrorCode> expectedErrorCodes = ErrorCode.EMPTY_LIST]) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    for (AnalysisError error in analysisContext2.computeErrors(source)) {
+      expect(error.source, source);
+      ErrorCode errorCode = error.errorCode;
+      if (!enableUnusedElement &&
+          (errorCode == HintCode.UNUSED_ELEMENT ||
+              errorCode == HintCode.UNUSED_FIELD)) {
+        continue;
+      }
+      if (!enableUnusedLocalVariable &&
+          (errorCode == HintCode.UNUSED_CATCH_CLAUSE ||
+              errorCode == HintCode.UNUSED_CATCH_STACK ||
+              errorCode == HintCode.UNUSED_LOCAL_VARIABLE)) {
+        continue;
+      }
+      errorListener.onError(error);
+    }
+    errorListener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  /**
+   * Asserts that [code] verifies, but has errors with the given error codes.
+   *
+   * Like [assertErrors], but takes a string of source code.
+   */
+  // TODO(rnystrom): Use this in more tests that have the same structure.
+  void assertErrorsInCode(String code, List<ErrorCode> errors) {
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertErrors(source, errors);
+    verify([source]);
+  }
+
+  /**
+   * Asserts that [code] has errors with the given error codes.
+   *
+   * Like [assertErrors], but takes a string of source code.
+   */
+  void assertErrorsInUnverifiedCode(String code, List<ErrorCode> errors) {
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertErrors(source, errors);
+  }
+
+  /**
+   * Assert that no errors have been reported against the given source.
+   *
+   * @param source the source against which no errors should have been reported
+   * @throws AnalysisException if the reported errors could not be computed
+   * @throws AssertionFailedError if any errors have been reported
+   */
+  void assertNoErrors(Source source) {
+    assertErrors(source);
+  }
+
+  /**
+   * Asserts that [code] has no errors or warnings.
+   */
+  // TODO(rnystrom): Use this in more tests that have the same structure.
+  void assertNoErrorsInCode(String code) {
+    Source source = addSource(code);
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  /**
+   * @param code the code that assigns the value to the variable "v", no matter how. We check that
+   *          "v" has expected static and propagated type.
+   */
+  void assertPropagatedAssignedType(String code, DartType expectedStaticType,
+      DartType expectedPropagatedType) {
+    SimpleIdentifier identifier = findMarkedIdentifier(code, "v = ");
+    expect(identifier.staticType, same(expectedStaticType));
+    expect(identifier.propagatedType, same(expectedPropagatedType));
+  }
+
+  /**
+   * @param code the code that iterates using variable "v". We check that
+   *          "v" has expected static and propagated type.
+   */
+  void assertPropagatedIterationType(String code, DartType expectedStaticType,
+      DartType expectedPropagatedType) {
+    SimpleIdentifier identifier = findMarkedIdentifier(code, "v in ");
+    expect(identifier.staticType, same(expectedStaticType));
+    expect(identifier.propagatedType, same(expectedPropagatedType));
+  }
+
+  /**
+   * Check the static and propagated types of the expression marked with "; // marker" comment.
+   *
+   * @param code source code to analyze, with the expression to check marked with "// marker".
+   * @param expectedStaticType if non-null, check actual static type is equal to this.
+   * @param expectedPropagatedType if non-null, check actual static type is equal to this.
+   * @throws Exception
+   */
+  void assertTypeOfMarkedExpression(String code, DartType expectedStaticType,
+      DartType expectedPropagatedType) {
+    SimpleIdentifier identifier = findMarkedIdentifier(code, "; // marker");
+    if (expectedStaticType != null) {
+      expect(identifier.staticType, expectedStaticType);
+    }
+    expect(identifier.propagatedType, expectedPropagatedType);
+  }
+
+  /**
+   * Cache the source file content in the source factory but don't add the source to the analysis
+   * context. The file path should be absolute.
+   *
+   * @param filePath the path of the file being cached
+   * @param contents the contents to be returned by the content provider for the specified file
+   * @return the source object representing the cached file
+   */
+  Source cacheSource(String filePath, String contents) {
+    Source source = new FileBasedSource(FileUtilities2.createFile(filePath));
+    analysisContext2.setContents(source, contents);
+    return source;
+  }
+
+  /**
+   * Change the contents of the given [source] to the given [contents].
+   */
+  void changeSource(Source source, String contents) {
+    analysisContext2.setContents(source, contents);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.changedSource(source);
+    analysisContext2.applyChanges(changeSet);
+  }
+
+  /**
+   * Computes errors for the given [librarySource].
+   * This assumes that the given [librarySource] and its parts have already
+   * been added to the content provider using the method [addNamedSource].
+   */
+  void computeLibrarySourceErrors(Source librarySource) {
+    analysisContext.computeErrors(librarySource);
+  }
+
+  /**
+   * Create a library element that represents a library named `"test"` containing a single
+   * empty compilation unit.
+   *
+   * @return the library element that was created
+   */
+  LibraryElementImpl createDefaultTestLibrary() =>
+      createTestLibrary(AnalysisContextFactory.contextWithCore(), "test");
+
+  /**
+   * Create a source object representing a file with the given [fileName] and
+   * give it an empty content. Return the source that was created.
+   */
+  FileBasedSource createNamedSource(String fileName) {
+    FileBasedSource source =
+        new FileBasedSource(FileUtilities2.createFile(fileName));
+    analysisContext2.setContents(source, "");
+    return source;
+  }
+
+  /**
+   * Create a library element that represents a library with the given name containing a single
+   * empty compilation unit.
+   *
+   * @param libraryName the name of the library to be created
+   * @return the library element that was created
+   */
+  LibraryElementImpl createTestLibrary(
+      AnalysisContext context, String libraryName,
+      [List<String> typeNames]) {
+    String fileName = "$libraryName.dart";
+    FileBasedSource definingCompilationUnitSource = createNamedSource(fileName);
+    List<CompilationUnitElement> sourcedCompilationUnits;
+    if (typeNames == null) {
+      sourcedCompilationUnits = CompilationUnitElement.EMPTY_LIST;
+    } else {
+      int count = typeNames.length;
+      sourcedCompilationUnits = new List<CompilationUnitElement>(count);
+      for (int i = 0; i < count; i++) {
+        String typeName = typeNames[i];
+        ClassElementImpl type =
+            new ClassElementImpl.forNode(AstFactory.identifier3(typeName));
+        String fileName = "$typeName.dart";
+        CompilationUnitElementImpl compilationUnit =
+            new CompilationUnitElementImpl(fileName);
+        compilationUnit.source = createNamedSource(fileName);
+        compilationUnit.librarySource = definingCompilationUnitSource;
+        compilationUnit.types = <ClassElement>[type];
+        sourcedCompilationUnits[i] = compilationUnit;
+      }
+    }
+    CompilationUnitElementImpl compilationUnit =
+        new CompilationUnitElementImpl(fileName);
+    compilationUnit.librarySource =
+        compilationUnit.source = definingCompilationUnitSource;
+    LibraryElementImpl library = new LibraryElementImpl.forNode(
+        context, AstFactory.libraryIdentifier2([libraryName]));
+    library.definingCompilationUnit = compilationUnit;
+    library.parts = sourcedCompilationUnits;
+    return library;
+  }
+
+  /**
+   * Return the `SimpleIdentifier` marked by `marker`. The source code must have no
+   * errors and be verifiable.
+   *
+   * @param code source code to analyze.
+   * @param marker marker identifying sought after expression in source code.
+   * @return expression marked by the marker.
+   * @throws Exception
+   */
+  SimpleIdentifier findMarkedIdentifier(String code, String marker) {
+    try {
+      Source source = addSource(code);
+      LibraryElement library = resolve2(source);
+      assertNoErrors(source);
+      verify([source]);
+      CompilationUnit unit = resolveCompilationUnit(source, library);
+      // Could generalize this further by making [SimpleIdentifier.class] a
+      // parameter.
+      return EngineTestCase.findNode(
+          unit, code, marker, (node) => node is SimpleIdentifier);
+    } catch (exception) {
+      // Is there a better exception to throw here? The point is that an
+      // assertion failure here should be a failure, in both "test_*" and
+      // "fail_*" tests. However, an assertion failure is success for the
+      // purpose of "fail_*" tests, so without catching them here "fail_*" tests
+      // can succeed by failing for the wrong reason.
+      throw new JavaException("Unexexpected assertion failure: $exception");
+    }
+  }
+
+  Expression findTopLevelConstantExpression(
+          CompilationUnit compilationUnit, String name) =>
+      findTopLevelDeclaration(compilationUnit, name).initializer;
+
+  VariableDeclaration findTopLevelDeclaration(
+      CompilationUnit compilationUnit, String name) {
+    for (CompilationUnitMember member in compilationUnit.declarations) {
+      if (member is TopLevelVariableDeclaration) {
+        for (VariableDeclaration variable in member.variables.variables) {
+          if (variable.name.name == name) {
+            return variable;
+          }
+        }
+      }
+    }
+    return null;
+    // Not found
+  }
+
+  /**
+   * In the rare cases we want to group several tests into single "test_" method, so need a way to
+   * reset test instance to reuse it.
+   */
+  void reset() {
+    analysisContext2 = AnalysisContextFactory.contextWithCore();
+  }
+
+  /**
+   * Reset the analysis context to have the given options applied.
+   *
+   * @param options the analysis options to be applied to the context
+   */
+  void resetWithOptions(AnalysisOptions options) {
+    analysisContext2 =
+        AnalysisContextFactory.contextWithCoreAndOptions(options);
+  }
+
+  /**
+   * Given a library and all of its parts, resolve the contents of the library and the contents of
+   * the parts. This assumes that the sources for the library and its parts have already been added
+   * to the content provider using the method [addNamedSource].
+   *
+   * @param librarySource the source for the compilation unit that defines the library
+   * @return the element representing the resolved library
+   * @throws AnalysisException if the analysis could not be performed
+   */
+  LibraryElement resolve2(Source librarySource) =>
+      analysisContext2.computeLibraryElement(librarySource);
+
+  /**
+   * Return the resolved compilation unit corresponding to the given source in the given library.
+   *
+   * @param source the source of the compilation unit to be returned
+   * @param library the library in which the compilation unit is to be resolved
+   * @return the resolved compilation unit
+   * @throws Exception if the compilation unit could not be resolved
+   */
+  CompilationUnit resolveCompilationUnit(
+          Source source, LibraryElement library) =>
+      analysisContext2.resolveCompilationUnit(source, library);
+
+  CompilationUnit resolveSource(String sourceText) =>
+      resolveSource2("/test.dart", sourceText);
+
+  CompilationUnit resolveSource2(String fileName, String sourceText) {
+    Source source = addNamedSource(fileName, sourceText);
+    LibraryElement library = analysisContext.computeLibraryElement(source);
+    return analysisContext.resolveCompilationUnit(source, library);
+  }
+
+  Source resolveSources(List<String> sourceTexts) {
+    for (int i = 0; i < sourceTexts.length; i++) {
+      CompilationUnit unit =
+          resolveSource2("/lib${i + 1}.dart", sourceTexts[i]);
+      // reference the source if this is the last source
+      if (i + 1 == sourceTexts.length) {
+        return unit.element.source;
+      }
+    }
+    return null;
+  }
+
+  void resolveWithAndWithoutExperimental(
+      List<String> strSources,
+      List<ErrorCode> codesWithoutExperimental,
+      List<ErrorCode> codesWithExperimental) {
+    // Setup analysis context as non-experimental
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+//    options.enableDeferredLoading = false;
+    resetWithOptions(options);
+    // Analysis and assertions
+    Source source = resolveSources(strSources);
+    assertErrors(source, codesWithoutExperimental);
+    verify([source]);
+    // Setup analysis context as experimental
+    reset();
+    // Analysis and assertions
+    source = resolveSources(strSources);
+    assertErrors(source, codesWithExperimental);
+    verify([source]);
+  }
+
+  void resolveWithErrors(List<String> strSources, List<ErrorCode> codes) {
+    // Analysis and assertions
+    Source source = resolveSources(strSources);
+    assertErrors(source, codes);
+    verify([source]);
+  }
+
+  @override
+  void setUp() {
+    ElementFactory.flushStaticState();
+    super.setUp();
+    reset();
+  }
+
+  @override
+  void tearDown() {
+    analysisContext2 = null;
+    super.tearDown();
+  }
+
+  /**
+   * Verify that all of the identifiers in the compilation units associated with
+   * the given [sources] have been resolved.
+   */
+  void verify(List<Source> sources) {
+    ResolutionVerifier verifier = new ResolutionVerifier();
+    for (Source source in sources) {
+      List<Source> libraries = analysisContext2.getLibrariesContaining(source);
+      for (Source library in libraries) {
+        analysisContext2
+            .resolveCompilationUnit2(source, library)
+            .accept(verifier);
+      }
+    }
+    verifier.assertResolved();
+  }
+}
+
 /**
  * Shared infrastructure for [StaticTypeAnalyzer2Test] and
  * [StrongModeStaticTypeAnalyzer2Test].
@@ -800,7 +799,7 @@
   void expectInitializerType(String name, type, [propagatedType]) {
     SimpleIdentifier identifier = findIdentifier(name);
     VariableDeclaration declaration =
-    identifier.getAncestor((node) => node is VariableDeclaration);
+        identifier.getAncestor((node) => node is VariableDeclaration);
     Expression initializer = declaration.initializer;
     _expectType(initializer.staticType, type);
     if (propagatedType != null) {
@@ -808,20 +807,6 @@
     }
   }
 
-  /**
-   * Validates that [type] matches [expected].
-   *
-   * If [expected] is a string, validates that the type stringifies to that
-   * text. Otherwise, [expected] is used directly a [Matcher] to match the type.
-   */
-  _expectType(DartType type, expected) {
-    if (expected is String) {
-      expect(type.toString(), expected);
-    } else {
-      expect(type, expected);
-    }
-  }
-
   SimpleIdentifier findIdentifier(String search) {
     SimpleIdentifier identifier = EngineTestCase.findNode(
         testUnit, testCode, search, (node) => node is SimpleIdentifier);
@@ -836,4 +821,18 @@
     verify([testSource]);
     testUnit = resolveCompilationUnit(testSource, library);
   }
+
+  /**
+   * Validates that [type] matches [expected].
+   *
+   * If [expected] is a string, validates that the type stringifies to that
+   * text. Otherwise, [expected] is used directly a [Matcher] to match the type.
+   */
+  _expectType(DartType type, expected) {
+    if (expected is String) {
+      expect(type.toString(), expected);
+    } else {
+      expect(type, expected);
+    }
+  }
 }
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 12fc550..fcd3a5f 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -51,7 +51,7 @@
     // Verify that both the getter and setter for "x" in "new C().x" refer to
     // the accessors defined in M2.
     FunctionDeclaration main =
-    library.definingCompilationUnit.functions[0].computeNode();
+        library.definingCompilationUnit.functions[0].computeNode();
     BlockFunctionBody body = main.functionExpression.body;
     ExpressionStatement stmt = body.block.statements[0];
     AssignmentExpression assignment = stmt.expression;
@@ -196,7 +196,7 @@
       FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
       Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
       ExpressionStatement expressionStatement =
-      statement as ExpressionStatement;
+          statement as ExpressionStatement;
       assignment = expressionStatement.expression as AssignmentExpression;
     }
     // get parameter
@@ -232,7 +232,7 @@
       FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
       Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
       ExpressionStatement expressionStatement =
-      statement as ExpressionStatement;
+          statement as ExpressionStatement;
       assignment = expressionStatement.expression as AssignmentExpression;
     }
     // get parameter
@@ -265,7 +265,7 @@
       FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
       Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
       ExpressionStatement expressionStatement =
-      statement as ExpressionStatement;
+          statement as ExpressionStatement;
       assignment = expressionStatement.expression as AssignmentExpression;
     }
     // get parameter
@@ -300,7 +300,7 @@
       FunctionBody mainBody = mainElement.computeNode().functionExpression.body;
       Statement statement = (mainBody as BlockFunctionBody).block.statements[1];
       ExpressionStatement expressionStatement =
-      statement as ExpressionStatement;
+          statement as ExpressionStatement;
       assignment = expressionStatement.expression as AssignmentExpression;
     }
     // get parameter
@@ -331,7 +331,7 @@
     WhileStatement whileStatement = EngineTestCase.findNode(
         unit, text, 'while (true)', (n) => n is WhileStatement);
     ForStatement forStatement =
-    EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
     BreakStatement break1 = EngineTestCase.findNode(
         unit, text, 'break loop1', (n) => n is BreakStatement);
     BreakStatement break2 = EngineTestCase.findNode(
@@ -350,7 +350,7 @@
 ''';
     CompilationUnit unit = resolveSource(text);
     DoStatement doStatement =
-    EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
+        EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
     BreakStatement breakStatement = EngineTestCase.findNode(
         unit, text, 'break', (n) => n is BreakStatement);
     expect(breakStatement.target, same(doStatement));
@@ -366,7 +366,7 @@
 ''';
     CompilationUnit unit = resolveSource(text);
     ForStatement forStatement =
-    EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
     BreakStatement breakStatement = EngineTestCase.findNode(
         unit, text, 'break', (n) => n is BreakStatement);
     expect(breakStatement.target, same(forStatement));
@@ -517,7 +517,7 @@
     WhileStatement whileStatement = EngineTestCase.findNode(
         unit, text, 'while (true)', (n) => n is WhileStatement);
     ForStatement forStatement =
-    EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
     ContinueStatement continue1 = EngineTestCase.findNode(
         unit, text, 'continue loop1', (n) => n is ContinueStatement);
     ContinueStatement continue2 = EngineTestCase.findNode(
@@ -536,7 +536,7 @@
 ''';
     CompilationUnit unit = resolveSource(text);
     DoStatement doStatement =
-    EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
+        EngineTestCase.findNode(unit, text, 'do', (n) => n is DoStatement);
     ContinueStatement continueStatement = EngineTestCase.findNode(
         unit, text, 'continue', (n) => n is ContinueStatement);
     expect(continueStatement.target, same(doStatement));
@@ -552,7 +552,7 @@
 ''';
     CompilationUnit unit = resolveSource(text);
     ForStatement forStatement =
-    EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
+        EngineTestCase.findNode(unit, text, 'for', (n) => n is ForStatement);
     ContinueStatement continueStatement = EngineTestCase.findNode(
         unit, text, 'continue', (n) => n is ContinueStatement);
     expect(continueStatement.target, same(forStatement));
@@ -839,7 +839,7 @@
     // Verify that the getter for "x" in "new C().x" refers to the getter
     // defined in M2.
     FunctionDeclaration main =
-    library.definingCompilationUnit.functions[0].computeNode();
+        library.definingCompilationUnit.functions[0].computeNode();
     BlockFunctionBody body = main.functionExpression.body;
     VariableDeclarationStatement stmt = body.block.statements[0];
     PropertyAccess propertyAccess = stmt.variables.variables[0].initializer;
@@ -1197,7 +1197,7 @@
     LibraryElement library = resolve2(source);
     expect(library, isNotNull);
     CompilationUnit unit =
-    analysisContext.resolveCompilationUnit(source, library);
+        analysisContext.resolveCompilationUnit(source, library);
     expect(unit, isNotNull);
     List<bool> found = [false];
     List<CaughtException> thrownException = new List<CaughtException>(1);
@@ -1470,7 +1470,7 @@
     verify([source]);
     // Verify that the "f" in "new C().f()" refers to the "f" defined in M2.
     FunctionDeclaration main =
-    library.definingCompilationUnit.functions[0].computeNode();
+        library.definingCompilationUnit.functions[0].computeNode();
     BlockFunctionBody body = main.functionExpression.body;
     ExpressionStatement stmt = body.block.statements[0];
     MethodInvocation expr = stmt.expression;
@@ -1525,7 +1525,7 @@
     // Verify that the call to f() in "new C().f()" refers to the method
     // defined in M2.
     FunctionDeclaration main =
-    library.definingCompilationUnit.functions[0].computeNode();
+        library.definingCompilationUnit.functions[0].computeNode();
     BlockFunctionBody body = main.functionExpression.body;
     ExpressionStatement stmt = body.block.statements[0];
     MethodInvocation invocation = stmt.expression;
@@ -1642,7 +1642,7 @@
     // Verify that the setter for "x" in "new C().x" refers to the setter
     // defined in M2.
     FunctionDeclaration main =
-    library.definingCompilationUnit.functions[0].computeNode();
+        library.definingCompilationUnit.functions[0].computeNode();
     BlockFunctionBody body = main.functionExpression.body;
     ExpressionStatement stmt = body.block.statements[0];
     AssignmentExpression assignment = stmt.expression;
@@ -1708,9 +1708,9 @@
     CompilationUnit unit = resolveCompilationUnit(source, library);
     expect(unit, isNotNull);
     ClassDeclaration classDeclaration =
-    unit.declarations[0] as ClassDeclaration;
+        unit.declarations[0] as ClassDeclaration;
     MethodDeclaration methodDeclaration =
-    classDeclaration.members[0] as MethodDeclaration;
+        classDeclaration.members[0] as MethodDeclaration;
     Block block = (methodDeclaration.body as BlockFunctionBody).block;
     ExpressionStatement statement = block.statements[0] as ExpressionStatement;
     MethodInvocation invocation = statement.expression as MethodInvocation;
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 6191020..dd0d172 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -37,6 +37,143 @@
   runReflectiveTests(StaticTypeAnalyzer2Test);
 }
 
+/**
+ * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
+ */
+@reflectiveTest
+class StaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared {
+  void test_FunctionExpressionInvocation_block() {
+    String code = r'''
+main() {
+  var foo = (() { return 1; })();
+}
+''';
+    resolveTestUnit(code);
+    expectInitializerType('foo', 'dynamic', isNull);
+  }
+
+  void test_FunctionExpressionInvocation_curried() {
+    String code = r'''
+typedef int F();
+F f() => null;
+main() {
+  var foo = f()();
+}
+''';
+    resolveTestUnit(code);
+    expectInitializerType('foo', 'int', isNull);
+  }
+
+  void test_FunctionExpressionInvocation_expression() {
+    String code = r'''
+main() {
+  var foo = (() => 1)();
+}
+''';
+    resolveTestUnit(code);
+    expectInitializerType('foo', 'int', isNull);
+  }
+
+  void test_MethodInvocation_nameType_localVariable() {
+    String code = r"""
+typedef Foo();
+main() {
+  Foo foo;
+  foo();
+}
+""";
+    resolveTestUnit(code);
+    // "foo" should be resolved to the "Foo" type
+    expectIdentifierType("foo();", new isInstanceOf<FunctionType>());
+  }
+
+  void test_MethodInvocation_nameType_parameter_FunctionTypeAlias() {
+    String code = r"""
+typedef Foo();
+main(Foo foo) {
+  foo();
+}
+""";
+    resolveTestUnit(code);
+    // "foo" should be resolved to the "Foo" type
+    expectIdentifierType("foo();", new isInstanceOf<FunctionType>());
+  }
+
+  void test_MethodInvocation_nameType_parameter_propagatedType() {
+    String code = r"""
+typedef Foo();
+main(p) {
+  if (p is Foo) {
+    p();
+  }
+}
+""";
+    resolveTestUnit(code);
+    expectIdentifierType("p()", DynamicTypeImpl.instance,
+        predicate((type) => type.name == 'Foo'));
+  }
+
+  void test_staticMethods_classTypeParameters() {
+    String code = r'''
+class C<T> {
+  static void m() => null;
+}
+main() {
+  print(C.m);
+}
+''';
+    resolveTestUnit(code);
+    expectFunctionType('m);', '() → void');
+  }
+
+  void test_staticMethods_classTypeParameters_genericMethod() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableGenericMethods = true;
+    resetWithOptions(options);
+    String code = r'''
+class C<T> {
+  static void m<S>(S s) {
+    void f<U>(S s, U u) {}
+    print(f);
+  }
+}
+main() {
+  print(C.m);
+}
+''';
+    resolveTestUnit(code);
+    // C - m
+    TypeParameterType typeS;
+    {
+      expectFunctionType('m);', '<S>(S) → void',
+          elementTypeParams: '[S]', typeFormals: '[S]');
+
+      FunctionTypeImpl type = findIdentifier('m);').staticType;
+      typeS = type.typeFormals[0].type;
+      type = type.instantiate([DynamicTypeImpl.instance]);
+      expect(type.toString(), '(dynamic) → void');
+      expect(type.typeParameters.toString(), '[S]');
+      expect(type.typeArguments, [DynamicTypeImpl.instance]);
+      expect(type.typeFormals, isEmpty);
+    }
+    // C - m - f
+    {
+      expectFunctionType('f);', '<U>(S, U) → void',
+          elementTypeParams: '[U]',
+          typeParams: '[S]',
+          typeArgs: '[S]',
+          typeFormals: '[U]');
+
+      FunctionTypeImpl type = findIdentifier('f);').staticType;
+      type = type.instantiate([DynamicTypeImpl.instance]);
+      expect(type.toString(), '(S, dynamic) → void');
+      expect(type.typeParameters.toString(), '[S, U]');
+      expect(type.typeArguments, [typeS, DynamicTypeImpl.instance]);
+      expect(type.typeFormals, isEmpty);
+    }
+  }
+}
+
 @reflectiveTest
 class StaticTypeAnalyzerTest extends EngineTestCase {
   /**
@@ -89,7 +226,7 @@
   void test_flatten_derived() {
     // class Derived<T> extends Future<T> { ... }
     ClassElementImpl derivedClass =
-    ElementFactory.classElement2('Derived', ['T']);
+        ElementFactory.classElement2('Derived', ['T']);
     derivedClass.supertype = _typeProvider.futureType
         .instantiate([derivedClass.typeParameters[0].type]);
     InterfaceType intType = _typeProvider.intType;
@@ -97,7 +234,7 @@
     InterfaceType derivedIntType = derivedClass.type.instantiate([intType]);
     // flatten(Derived) = dynamic
     InterfaceType derivedDynamicType =
-    derivedClass.type.instantiate([dynamicType]);
+        derivedClass.type.instantiate([dynamicType]);
     expect(_flatten(derivedDynamicType), dynamicType);
     // flatten(Derived<int>) = int
     expect(_flatten(derivedIntType), intType);
@@ -128,19 +265,19 @@
     InterfaceType numType = _typeProvider.numType;
     // class Derived<T> extends Future<T>
     ClassElementImpl derivedClass =
-    ElementFactory.classElement2('Derived', ['T']);
+        ElementFactory.classElement2('Derived', ['T']);
     derivedClass.supertype = _typeProvider.futureType
         .instantiate([derivedClass.typeParameters[0].type]);
     InterfaceType derivedType = derivedClass.type;
     // class A extends Derived<int> implements Derived<num> { ... }
     ClassElementImpl classA =
-    ElementFactory.classElement('A', derivedType.instantiate([intType]));
+        ElementFactory.classElement('A', derivedType.instantiate([intType]));
     classA.interfaces = <InterfaceType>[
       derivedType.instantiate([numType])
     ];
     // class B extends Future<num> implements Future<int> { ... }
     ClassElementImpl classB =
-    ElementFactory.classElement('B', derivedType.instantiate([numType]));
+        ElementFactory.classElement('B', derivedType.instantiate([numType]));
     classB.interfaces = <InterfaceType>[
       derivedType.instantiate([intType])
     ];
@@ -157,13 +294,13 @@
     InterfaceType numType = _typeProvider.numType;
     // class A extends Future<int> implements Future<num> { ... }
     ClassElementImpl classA =
-    ElementFactory.classElement('A', futureType.instantiate([intType]));
+        ElementFactory.classElement('A', futureType.instantiate([intType]));
     classA.interfaces = <InterfaceType>[
       futureType.instantiate([numType])
     ];
     // class B extends Future<num> implements Future<int> { ... }
     ClassElementImpl classB =
-    ElementFactory.classElement('B', futureType.instantiate([numType]));
+        ElementFactory.classElement('B', futureType.instantiate([numType]));
     classB.interfaces = <InterfaceType>[
       futureType.instantiate([intType])
     ];
@@ -177,11 +314,11 @@
     DartType dynamicType = _typeProvider.dynamicType;
     InterfaceType futureDynamicType = _typeProvider.futureDynamicType;
     InterfaceType futureIntType =
-    _typeProvider.futureType.instantiate([intType]);
+        _typeProvider.futureType.instantiate([intType]);
     InterfaceType futureFutureDynamicType =
-    _typeProvider.futureType.instantiate([futureDynamicType]);
+        _typeProvider.futureType.instantiate([futureDynamicType]);
     InterfaceType futureFutureIntType =
-    _typeProvider.futureType.instantiate([futureIntType]);
+        _typeProvider.futureType.instantiate([futureIntType]);
     // flatten(int) = int
     expect(_flatten(intType), intType);
     // flatten(dynamic) = dynamic
@@ -202,13 +339,13 @@
     InterfaceType stringType = _typeProvider.stringType;
     // class A extends Future<int> implements Future<String> { ... }
     ClassElementImpl classA =
-    ElementFactory.classElement('A', futureType.instantiate([intType]));
+        ElementFactory.classElement('A', futureType.instantiate([intType]));
     classA.interfaces = <InterfaceType>[
       futureType.instantiate([stringType])
     ];
     // class B extends Future<String> implements Future<int> { ... }
     ClassElementImpl classB =
-    ElementFactory.classElement('B', futureType.instantiate([stringType]));
+        ElementFactory.classElement('B', futureType.instantiate([stringType]));
     classB.interfaces = <InterfaceType>[
       futureType.instantiate([intType])
     ];
@@ -283,11 +420,11 @@
     // await e, where e has type Future<Future<int>>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-    _typeProvider.futureType.instantiate(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     InterfaceType futureFutureIntType =
-    _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
+        _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
     Expression node =
-    AstFactory.awaitExpression(_resolvedVariable(futureFutureIntType, 'e'));
+        AstFactory.awaitExpression(_resolvedVariable(futureFutureIntType, 'e'));
     expect(_analyze(node), same(intType));
     _listener.assertNoErrors();
   }
@@ -296,9 +433,9 @@
     // await e, where e has type Future<int>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-    _typeProvider.futureType.instantiate(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     Expression node =
-    AstFactory.awaitExpression(_resolvedVariable(futureIntType, 'e'));
+        AstFactory.awaitExpression(_resolvedVariable(futureIntType, 'e'));
     expect(_analyze(node), same(intType));
     _listener.assertNoErrors();
   }
@@ -406,7 +543,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A");
     InterfaceType typeA = classA.type;
     MethodElement operator =
-    ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
+        ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
     classA.methods = <MethodElement>[operator];
     BinaryExpression node = AstFactory.binaryExpression(
         AstFactory.asExpression(
@@ -481,7 +618,7 @@
     BlockFunctionBody body = AstFactory.blockFunctionBody2();
     body.keyword = TokenFactory.tokenFromString('async');
     FunctionExpression node =
-    _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
     _assertFunctionType(
         _typeProvider.futureDynamicType, null, null, null, resultType);
@@ -492,12 +629,12 @@
     // () async => e, where e has type int
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-    _typeProvider.futureType.instantiate(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     Expression expression = _resolvedVariable(intType, 'e');
     ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
     body.keyword = TokenFactory.tokenFromString('async');
     FunctionExpression node =
-    _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
     _assertFunctionType(futureIntType, null, null, null, resultType);
     _listener.assertNoErrors();
@@ -507,12 +644,12 @@
     // () async => e, where e has type Future<int>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-    _typeProvider.futureType.instantiate(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     Expression expression = _resolvedVariable(futureIntType, 'e');
     ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
     body.keyword = TokenFactory.tokenFromString('async');
     FunctionExpression node =
-    _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
     _assertFunctionType(futureIntType, null, null, null, resultType);
     _listener.assertNoErrors();
@@ -522,14 +659,14 @@
     // () async => e, where e has type Future<Future<int>>
     InterfaceType intType = _typeProvider.intType;
     InterfaceType futureIntType =
-    _typeProvider.futureType.instantiate(<DartType>[intType]);
+        _typeProvider.futureType.instantiate(<DartType>[intType]);
     InterfaceType futureFutureIntType =
-    _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
+        _typeProvider.futureType.instantiate(<DartType>[futureIntType]);
     Expression expression = _resolvedVariable(futureFutureIntType, 'e');
     ExpressionFunctionBody body = AstFactory.expressionFunctionBody(expression);
     body.keyword = TokenFactory.tokenFromString('async');
     FunctionExpression node =
-    _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
     _assertFunctionType(futureIntType, null, null, null, resultType);
     _listener.assertNoErrors();
@@ -541,7 +678,7 @@
     body.keyword = TokenFactory.tokenFromString('async');
     body.star = TokenFactory.tokenFromType(TokenType.STAR);
     FunctionExpression node =
-    _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
     _assertFunctionType(
         _typeProvider.streamDynamicType, null, null, null, resultType);
@@ -554,7 +691,7 @@
     body.keyword = TokenFactory.tokenFromString('sync');
     body.star = TokenFactory.tokenFromType(TokenType.STAR);
     FunctionExpression node =
-    _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
+        _resolvedFunctionExpression(AstFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
     _assertFunctionType(
         _typeProvider.iterableDynamicType, null, null, null, resultType);
@@ -755,7 +892,7 @@
     InterfaceType listType = _typeProvider.listType;
     SimpleIdentifier identifier = _resolvedVariable(listType, "a");
     IndexExpression node =
-    AstFactory.indexExpression(identifier, _resolvedInteger(2));
+        AstFactory.indexExpression(identifier, _resolvedInteger(2));
     MethodElement indexMethod = listType.element.methods[0];
     node.staticElement = indexMethod;
     expect(_analyze(node), same(listType.typeArguments[0]));
@@ -768,7 +905,7 @@
     InterfaceType listType = _typeProvider.listType;
     SimpleIdentifier identifier = _resolvedVariable(listType, "a");
     IndexExpression node =
-    AstFactory.indexExpression(identifier, _resolvedInteger(2));
+        AstFactory.indexExpression(identifier, _resolvedInteger(2));
     MethodElement indexMethod = listType.element.methods[1];
     node.staticElement = indexMethod;
     AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
@@ -789,7 +926,7 @@
     identifier.staticType = listOfIntType;
     // list[0] has MethodElement element (int) -> E
     IndexExpression indexExpression =
-    AstFactory.indexExpression(identifier, AstFactory.integer(0));
+        AstFactory.indexExpression(identifier, AstFactory.integer(0));
     MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
     indexExpression.staticElement = indexMethod;
     // analyze and assert result of the index expression
@@ -810,7 +947,7 @@
     identifier.staticType = listOfIntType;
     // list[0] has MethodElement element (int) -> E
     IndexExpression indexExpression =
-    AstFactory.indexExpression(identifier, AstFactory.integer(0));
+        AstFactory.indexExpression(identifier, AstFactory.integer(0));
     MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
     indexExpression.staticElement = indexMethod;
     // list[0] should be in a setter context
@@ -826,7 +963,7 @@
     ClassElementImpl classElement = ElementFactory.classElement2("C");
     String constructorName = "m";
     ConstructorElementImpl constructor =
-    ElementFactory.constructorElement2(classElement, constructorName);
+        ElementFactory.constructorElement2(classElement, constructorName);
     constructor.returnType = classElement.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
     constructor.type = constructorType;
@@ -845,16 +982,16 @@
     ClassElementImpl elementC = ElementFactory.classElement2("C", ["E"]);
     ClassElementImpl elementI = ElementFactory.classElement2("I");
     ConstructorElementImpl constructor =
-    ElementFactory.constructorElement2(elementC, null);
+        ElementFactory.constructorElement2(elementC, null);
     elementC.constructors = <ConstructorElement>[constructor];
     constructor.returnType = elementC.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
     constructor.type = constructorType;
     TypeName typeName =
-    AstFactory.typeName(elementC, [AstFactory.typeName(elementI)]);
+        AstFactory.typeName(elementC, [AstFactory.typeName(elementI)]);
     typeName.type = elementC.type.instantiate(<DartType>[elementI.type]);
     InstanceCreationExpression node =
-    AstFactory.instanceCreationExpression2(null, typeName);
+        AstFactory.instanceCreationExpression2(null, typeName);
     node.staticElement = constructor;
     InterfaceType interfaceType = _analyze(node) as InterfaceType;
     List<DartType> typeArgs = interfaceType.typeArguments;
@@ -867,7 +1004,7 @@
     // new C()
     ClassElementImpl classElement = ElementFactory.classElement2("C");
     ConstructorElementImpl constructor =
-    ElementFactory.constructorElement2(classElement, null);
+        ElementFactory.constructorElement2(classElement, null);
     constructor.returnType = classElement.type;
     FunctionTypeImpl constructorType = new FunctionTypeImpl(constructor);
     constructor.type = constructorType;
@@ -986,7 +1123,7 @@
   void test_visitPostfixExpression_plusPlus() {
     // 0++
     PostfixExpression node =
-    AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS);
+        AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS);
     expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
@@ -994,7 +1131,7 @@
   void test_visitPrefixedIdentifier_getter() {
     DartType boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter =
-    ElementFactory.getterElement("b", false, boolType);
+        ElementFactory.getterElement("b", false, boolType);
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = getter;
     expect(_analyze(node), same(boolType));
@@ -1004,7 +1141,7 @@
   void test_visitPrefixedIdentifier_setter() {
     DartType boolType = _typeProvider.boolType;
     FieldElementImpl field =
-    ElementFactory.fieldElement("b", false, false, false, boolType);
+        ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = setter;
@@ -1024,7 +1161,7 @@
   void test_visitPrefixExpression_bang() {
     // !0
     PrefixExpression node =
-    AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0));
+        AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0));
     expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
@@ -1032,7 +1169,7 @@
   void test_visitPrefixExpression_minus() {
     // -0
     PrefixExpression node =
-    AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0));
+        AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
     expect(_analyze(node), same(_typeProvider.numType));
@@ -1042,7 +1179,7 @@
   void test_visitPrefixExpression_minusMinus() {
     // --0
     PrefixExpression node =
-    AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0));
+        AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
     expect(_analyze(node), same(_typeProvider.intType));
@@ -1060,7 +1197,7 @@
   void test_visitPrefixExpression_plusPlus() {
     // ++0
     PrefixExpression node =
-    AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0));
+        AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0));
     MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
     node.staticElement = plusMethod;
     expect(_analyze(node), same(_typeProvider.intType));
@@ -1070,7 +1207,7 @@
   void test_visitPrefixExpression_tilde() {
     // ~0
     PrefixExpression node =
-    AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0));
+        AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0));
     MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
     node.staticElement = tildeMethod;
     expect(_analyze(node), same(_typeProvider.intType));
@@ -1080,9 +1217,9 @@
   void test_visitPropertyAccess_propagated_getter() {
     DartType boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter =
-    ElementFactory.getterElement("b", false, boolType);
+        ElementFactory.getterElement("b", false, boolType);
     PropertyAccess node =
-    AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.propagatedElement = getter;
     expect(_analyze2(node, false), same(boolType));
     _listener.assertNoErrors();
@@ -1091,10 +1228,10 @@
   void test_visitPropertyAccess_propagated_setter() {
     DartType boolType = _typeProvider.boolType;
     FieldElementImpl field =
-    ElementFactory.fieldElement("b", false, false, false, boolType);
+        ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PropertyAccess node =
-    AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.propagatedElement = setter;
     expect(_analyze2(node, false), same(boolType));
     _listener.assertNoErrors();
@@ -1103,9 +1240,9 @@
   void test_visitPropertyAccess_static_getter() {
     DartType boolType = _typeProvider.boolType;
     PropertyAccessorElementImpl getter =
-    ElementFactory.getterElement("b", false, boolType);
+        ElementFactory.getterElement("b", false, boolType);
     PropertyAccess node =
-    AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.staticElement = getter;
     expect(_analyze(node), same(boolType));
     _listener.assertNoErrors();
@@ -1114,10 +1251,10 @@
   void test_visitPropertyAccess_static_setter() {
     DartType boolType = _typeProvider.boolType;
     FieldElementImpl field =
-    ElementFactory.fieldElement("b", false, false, false, boolType);
+        ElementFactory.fieldElement("b", false, false, false, boolType);
     PropertyAccessorElement setter = field.setter;
     PropertyAccess node =
-    AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
+        AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.staticElement = setter;
     expect(_analyze(node), same(boolType));
     _listener.assertNoErrors();
@@ -1340,13 +1477,13 @@
   StaticTypeAnalyzer _createAnalyzer() {
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     FileBasedSource source =
-    new FileBasedSource(FileUtilities2.createFile("/lib.dart"));
+        new FileBasedSource(FileUtilities2.createFile("/lib.dart"));
     CompilationUnitElementImpl definingCompilationUnit =
-    new CompilationUnitElementImpl("lib.dart");
+        new CompilationUnitElementImpl("lib.dart");
     definingCompilationUnit.librarySource =
         definingCompilationUnit.source = source;
     LibraryElementImpl definingLibrary =
-    new LibraryElementImpl.forNode(context, null);
+        new LibraryElementImpl.forNode(context, null);
     definingLibrary.definingCompilationUnit = definingCompilationUnit;
     _typeProvider = new TestTypeProvider(context);
     _visitor = new ResolverVisitor(
@@ -1374,7 +1511,7 @@
       InterfaceType type, String variableName) {
     SimpleIdentifier identifier = AstFactory.identifier3(variableName);
     VariableElementImpl element =
-    ElementFactory.localVariableElement(identifier);
+        ElementFactory.localVariableElement(identifier);
     element.type = type;
     identifier.staticType = _typeProvider.dynamicType;
     identifier.propagatedElement = element;
@@ -1409,7 +1546,7 @@
     List<ParameterElement> parameterElements = new List<ParameterElement>();
     for (FormalParameter parameter in parameters.parameters) {
       ParameterElementImpl element =
-      new ParameterElementImpl.forNode(parameter.identifier);
+          new ParameterElementImpl.forNode(parameter.identifier);
       element.parameterKind = parameter.kind;
       element.type = _typeProvider.dynamicType;
       parameter.identifier.staticElement = element;
@@ -1457,7 +1594,7 @@
   SimpleIdentifier _resolvedVariable(InterfaceType type, String variableName) {
     SimpleIdentifier identifier = AstFactory.identifier3(variableName);
     VariableElementImpl element =
-    ElementFactory.localVariableElement(identifier);
+        ElementFactory.localVariableElement(identifier);
     element.type = type;
     identifier.staticElement = element;
     identifier.staticType = type;
@@ -1480,140 +1617,3 @@
     (element as ParameterElementImpl).type = type;
   }
 }
-
-/**
- * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
- */
-@reflectiveTest
-class StaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared {
-  void test_FunctionExpressionInvocation_block() {
-    String code = r'''
-main() {
-  var foo = (() { return 1; })();
-}
-''';
-    resolveTestUnit(code);
-    expectInitializerType('foo', 'dynamic', isNull);
-  }
-
-  void test_FunctionExpressionInvocation_curried() {
-    String code = r'''
-typedef int F();
-F f() => null;
-main() {
-  var foo = f()();
-}
-''';
-    resolveTestUnit(code);
-    expectInitializerType('foo', 'int', isNull);
-  }
-
-  void test_FunctionExpressionInvocation_expression() {
-    String code = r'''
-main() {
-  var foo = (() => 1)();
-}
-''';
-    resolveTestUnit(code);
-    expectInitializerType('foo', 'int', isNull);
-  }
-
-  void test_MethodInvocation_nameType_localVariable() {
-    String code = r"""
-typedef Foo();
-main() {
-  Foo foo;
-  foo();
-}
-""";
-    resolveTestUnit(code);
-    // "foo" should be resolved to the "Foo" type
-    expectIdentifierType("foo();", new isInstanceOf<FunctionType>());
-  }
-
-  void test_MethodInvocation_nameType_parameter_FunctionTypeAlias() {
-    String code = r"""
-typedef Foo();
-main(Foo foo) {
-  foo();
-}
-""";
-    resolveTestUnit(code);
-    // "foo" should be resolved to the "Foo" type
-    expectIdentifierType("foo();", new isInstanceOf<FunctionType>());
-  }
-
-  void test_MethodInvocation_nameType_parameter_propagatedType() {
-    String code = r"""
-typedef Foo();
-main(p) {
-  if (p is Foo) {
-    p();
-  }
-}
-""";
-    resolveTestUnit(code);
-    expectIdentifierType("p()", DynamicTypeImpl.instance,
-        predicate((type) => type.name == 'Foo'));
-  }
-
-  void test_staticMethods_classTypeParameters() {
-    String code = r'''
-class C<T> {
-  static void m() => null;
-}
-main() {
-  print(C.m);
-}
-''';
-    resolveTestUnit(code);
-    expectFunctionType('m);', '() → void');
-  }
-
-  void test_staticMethods_classTypeParameters_genericMethod() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.enableGenericMethods = true;
-    resetWithOptions(options);
-    String code = r'''
-class C<T> {
-  static void m<S>(S s) {
-    void f<U>(S s, U u) {}
-    print(f);
-  }
-}
-main() {
-  print(C.m);
-}
-''';
-    resolveTestUnit(code);
-    // C - m
-    TypeParameterType typeS;
-    {
-      expectFunctionType('m);', '<S>(S) → void',
-          elementTypeParams: '[S]', typeFormals: '[S]');
-
-      FunctionTypeImpl type = findIdentifier('m);').staticType;
-      typeS = type.typeFormals[0].type;
-      type = type.instantiate([DynamicTypeImpl.instance]);
-      expect(type.toString(), '(dynamic) → void');
-      expect(type.typeParameters.toString(), '[S]');
-      expect(type.typeArguments, [DynamicTypeImpl.instance]);
-      expect(type.typeFormals, isEmpty);
-    }
-    // C - m - f
-        {
-      expectFunctionType('f);', '<U>(S, U) → void',
-          elementTypeParams: '[U]',
-          typeParams: '[S]',
-          typeArgs: '[S]',
-          typeFormals: '[U]');
-
-      FunctionTypeImpl type = findIdentifier('f);').staticType;
-      type = type.instantiate([DynamicTypeImpl.instance]);
-      expect(type.toString(), '(S, dynamic) → void');
-      expect(type.typeParameters.toString(), '[S, U]');
-      expect(type.typeArguments, [typeS, DynamicTypeImpl.instance]);
-      expect(type.typeFormals, isEmpty);
-    }
-  }
-}
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 02993c5..64bebe3 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -181,6 +181,111 @@
         [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
+  void test_awaitForIn_declaredVariableRightType() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  await for (int i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_declaredVariableWrongType() {
+    assertErrorsInCode(
+        '''
+import 'dart:async';
+f() async {
+  Stream<String> stream;
+  await for (int i in stream) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_awaitForIn_downcast() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<num> stream;
+  await for (int i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_dynamicStream() {
+    assertNoErrorsInCode('''
+f() async {
+  dynamic stream;
+  await for (int i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_dynamicVariable() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  await for (var i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_existingVariableRightType() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  int i;
+  await for (i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_existingVariableWrongType() {
+    assertErrorsInCode(
+        '''
+import 'dart:async';
+f() async {
+  Stream<String> stream;
+  int i;
+  await for (i in stream) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_awaitForIn_notStream() {
+    assertErrorsInCode(
+        '''
+f() async {
+  await for (var i in true) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
+  }
+
+  void test_awaitForIn_streamOfDynamic() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream stream;
+  await for (int i in stream) {}
+}
+''');
+  }
+
+  void test_awaitForIn_upcast() {
+    assertNoErrorsInCode('''
+import 'dart:async';
+f() async {
+  Stream<int> stream;
+  await for (num i in stream) {}
+}
+''');
+  }
+
   void test_bug21912() {
     assertErrorsInCode(
         '''
@@ -236,6 +341,135 @@
         [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
   }
 
+  void test_forIn_declaredVariableRightType() {
+    assertNoErrorsInCode('''
+f() {
+  for (int i in <int>[]) {}
+}
+''');
+  }
+
+  void test_forIn_declaredVariableWrongType() {
+    assertErrorsInCode(
+        '''
+f() {
+  for (int i in <String>[]) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_forIn_downcast() {
+    assertNoErrorsInCode('''
+f() {
+  for (int i in <num>[]) {}
+}
+''');
+  }
+
+  void test_forIn_dynamic() {
+    assertNoErrorsInCode('''
+f() {
+  dynamic d; // Could be [].
+  for (var i in d) {}
+}
+''');
+  }
+
+  void test_forIn_dynamicIterable() {
+    assertNoErrorsInCode('''
+f() {
+  dynamic iterable;
+  for (int i in iterable) {}
+}
+''');
+  }
+
+  void test_forIn_dynamicVariable() {
+    assertNoErrorsInCode('''
+f() {
+  for (var i in <int>[]) {}
+}
+''');
+  }
+
+  void test_forIn_existingVariableRightType() {
+    assertNoErrorsInCode('''
+f() {
+  int i;
+  for (i in <int>[]) {}
+}
+''');
+  }
+
+  void test_forIn_existingVariableWrongType() {
+    assertErrorsInCode(
+        '''
+f() {
+  int i;
+  for (i in <String>[]) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_forIn_iterableOfDynamic() {
+    assertNoErrorsInCode('''
+f() {
+  for (int i in []) {}
+}
+''');
+  }
+
+  void test_forIn_notIterable() {
+    assertErrorsInCode(
+        '''
+f() {
+  for (var i in true) {}
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
+  }
+
+  void test_forIn_object() {
+    assertNoErrorsInCode('''
+f() {
+  Object o; // Could be [].
+  for (var i in o) {}
+}
+''');
+  }
+
+  void test_forIn_typeBoundBad() {
+    assertErrorsInCode(
+        '''
+class Foo<T extends Iterable<int>> {
+  void method(T iterable) {
+    for (String i in iterable) {}
+  }
+}
+''',
+        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
+  }
+
+  void test_forIn_typeBoundGood() {
+    assertNoErrorsInCode('''
+class Foo<T extends Iterable<int>> {
+  void method(T iterable) {
+    for (var i in iterable) {}
+  }
+}
+''');
+  }
+
+  void test_forIn_upcast() {
+    assertNoErrorsInCode('''
+f() {
+  for (num i in <int>[]) {}
+}
+''');
+  }
+
   void test_illegal_return_type_async_function() {
     assertErrorsInCode(
         '''
@@ -646,6 +880,7 @@
         [StaticTypeWarningCode.NON_BOOL_CONDITION]);
   }
 
+  // https://github.com/dart-lang/sdk/issues/24713
   void test_nonBoolCondition_for() {
     assertErrorsInCode(
         r'''
@@ -856,7 +1091,6 @@
         [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
   }
 
-  // https://github.com/dart-lang/sdk/issues/24713
   void test_returnOfInvalidType_not_issued_for_valid_generic_return() {
     assertNoErrorsInCode(r'''
 abstract class F<T, U>  {
@@ -1907,242 +2141,6 @@
         [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
   }
 
-  void test_forIn_notIterable() {
-    assertErrorsInCode(
-        '''
-f() {
-  for (var i in true) {}
-}
-''',
-        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
-  }
-
-  void test_forIn_object() {
-    assertNoErrorsInCode(
-        '''
-f() {
-  Object o; // Could be [].
-  for (var i in o) {}
-}
-''');
-  }
-
-  void test_forIn_dynamic() {
-    assertNoErrorsInCode(
-        '''
-f() {
-  dynamic d; // Could be [].
-  for (var i in d) {}
-}
-''');
-  }
-
-  void test_forIn_declaredVariableWrongType() {
-    assertErrorsInCode(
-        '''
-f() {
-  for (int i in <String>[]) {}
-}
-''',
-        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
-  }
-
-  void test_forIn_existingVariableWrongType() {
-    assertErrorsInCode(
-        '''
-f() {
-  int i;
-  for (i in <String>[]) {}
-}
-''',
-        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
-  }
-
-  void test_forIn_declaredVariableRightType() {
-    assertNoErrorsInCode('''
-f() {
-  for (int i in <int>[]) {}
-}
-''');
-  }
-
-  void test_forIn_existingVariableRightType() {
-    assertNoErrorsInCode('''
-f() {
-  int i;
-  for (i in <int>[]) {}
-}
-''');
-  }
-
-  void test_forIn_dynamicVariable() {
-    assertNoErrorsInCode('''
-f() {
-  for (var i in <int>[]) {}
-}
-''');
-  }
-
-  void test_forIn_iterableOfDynamic() {
-    assertNoErrorsInCode('''
-f() {
-  for (int i in []) {}
-}
-''');
-  }
-
-  void test_forIn_dynamicIterable() {
-    assertNoErrorsInCode('''
-f() {
-  dynamic iterable;
-  for (int i in iterable) {}
-}
-''');
-  }
-
-  void test_forIn_upcast() {
-    assertNoErrorsInCode('''
-f() {
-  for (num i in <int>[]) {}
-}
-''');
-  }
-
-  void test_forIn_downcast() {
-    assertNoErrorsInCode('''
-f() {
-  for (int i in <num>[]) {}
-}
-''');
-  }
-
-  void test_forIn_typeBoundBad() {
-    assertErrorsInCode(
-        '''
-class Foo<T extends Iterable<int>> {
-  void method(T iterable) {
-    for (String i in iterable) {}
-  }
-}
-''',
-        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
-  }
-
-  void test_forIn_typeBoundGood() {
-    assertNoErrorsInCode('''
-class Foo<T extends Iterable<int>> {
-  void method(T iterable) {
-    for (var i in iterable) {}
-  }
-}
-''');
-  }
-
-  void test_awaitForIn_notStream() {
-    assertErrorsInCode(
-        '''
-f() async {
-  await for (var i in true) {}
-}
-''',
-        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
-  }
-
-  void test_awaitForIn_declaredVariableWrongType() {
-    assertErrorsInCode(
-        '''
-import 'dart:async';
-f() async {
-  Stream<String> stream;
-  await for (int i in stream) {}
-}
-''',
-        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
-  }
-
-  void test_awaitForIn_existingVariableWrongType() {
-    assertErrorsInCode(
-        '''
-import 'dart:async';
-f() async {
-  Stream<String> stream;
-  int i;
-  await for (i in stream) {}
-}
-''',
-        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
-  }
-
-  void test_awaitForIn_declaredVariableRightType() {
-    assertNoErrorsInCode('''
-import 'dart:async';
-f() async {
-  Stream<int> stream;
-  await for (int i in stream) {}
-}
-''');
-  }
-
-  void test_awaitForIn_existingVariableRightType() {
-    assertNoErrorsInCode('''
-import 'dart:async';
-f() async {
-  Stream<int> stream;
-  int i;
-  await for (i in stream) {}
-}
-''');
-  }
-
-  void test_awaitForIn_dynamicVariable() {
-    assertNoErrorsInCode('''
-import 'dart:async';
-f() async {
-  Stream<int> stream;
-  await for (var i in stream) {}
-}
-''');
-  }
-
-  void test_awaitForIn_streamOfDynamic() {
-    assertNoErrorsInCode('''
-import 'dart:async';
-f() async {
-  Stream stream;
-  await for (int i in stream) {}
-}
-''');
-  }
-
-  void test_awaitForIn_dynamicStream() {
-    assertNoErrorsInCode('''
-f() async {
-  dynamic stream;
-  await for (int i in stream) {}
-}
-''');
-  }
-
-  void test_awaitForIn_upcast() {
-    assertNoErrorsInCode('''
-import 'dart:async';
-f() async {
-  Stream<int> stream;
-  await for (num i in stream) {}
-}
-''');
-  }
-
-  void test_awaitForIn_downcast() {
-    assertNoErrorsInCode('''
-import 'dart:async';
-f() async {
-  Stream<num> stream;
-  await for (int i in stream) {}
-}
-''');
-  }
-
   void test_yield_async_to_basic_type() {
     assertErrorsInCode(
         '''
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 7e8e4f3..1445233 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -993,7 +993,8 @@
     assertErrors(source, [StaticWarningCode.CONFLICTING_DART_IMPORT]);
   }
 
-  void test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter() {
+  void
+      test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter() {
     Source source = addSource(r'''
 class A {
   static set v(x) {}
@@ -1007,7 +1008,8 @@
     verify([source]);
   }
 
-  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter() {
+  void
+      test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter() {
     Source source = addSource(r'''
 class A {
   static get v => 0;
@@ -1021,7 +1023,8 @@
     verify([source]);
   }
 
-  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method() {
+  void
+      test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method() {
     Source source = addSource(r'''
 class A {
   static v() {}
@@ -1035,7 +1038,8 @@
     verify([source]);
   }
 
-  void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter() {
+  void
+      test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter() {
     Source source = addSource(r'''
 class A {
   static set v(x) {}
@@ -2319,6 +2323,24 @@
     verify([source]);
   }
 
+  void test_missingEnumConstantInSwitch() {
+    Source source = addSource(r'''
+enum E { ONE, TWO, THREE, FOUR }
+bool odd(E e) {
+  switch (e) {
+    case E.ONE:
+    case E.THREE: return true;
+  }
+  return false;
+}''');
+    computeLibrarySourceErrors(source);
+    assertErrors(source, [
+      StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
+      StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH
+    ]);
+    verify([source]);
+  }
+
   void test_mixedReturnTypes_localFunction() {
     Source source = addSource(r'''
 class C {
@@ -2505,7 +2527,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() {
     // 15979
     Source source = addSource(r'''
 abstract class M {}
@@ -2534,7 +2557,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() {
     // 15979
     Source source = addSource(r'''
 class M {}
@@ -2548,7 +2572,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberOne_ensureCorrectFunctionSubtypeIsUsedInImplementation() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberOne_ensureCorrectFunctionSubtypeIsUsedInImplementation() {
     // 15028
     Source source = addSource(r'''
 class C {
@@ -2616,7 +2641,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount() {
     // 7640
     Source source = addSource(r'''
 abstract class A {
@@ -2683,7 +2709,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberOne_setter_and_implicitSetter() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberOne_setter_and_implicitSetter() {
     // test from language/override_inheritance_abstract_test_14.dart
     Source source = addSource(r'''
 abstract class A {
@@ -2744,7 +2771,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter() {
     // 16133
     Source source = addSource(r'''
 class I {
@@ -2759,7 +2787,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter() {
     // 16133
     Source source = addSource(r'''
 class I {
@@ -2803,7 +2832,8 @@
     verify([source]);
   }
 
-  void test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth() {
+  void
+      test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth() {
     // 16133
     Source source = addSource(r'''
 class I {
@@ -3189,7 +3219,8 @@
     ]);
   }
 
-  void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
+  void
+      test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
     resolveWithErrors(<String>[
       r'''
 library lib1;
@@ -3616,22 +3647,4 @@
     computeLibrarySourceErrors(source);
     assertErrors(source, [StaticWarningCode.VOID_RETURN_FOR_GETTER]);
   }
-
-  void test_missingEnumConstantInSwitch() {
-    Source source = addSource(r'''
-enum E { ONE, TWO, THREE, FOUR }
-bool odd(E e) {
-  switch (e) {
-    case E.ONE:
-    case E.THREE: return true;
-  }
-  return false;
-}''');
-    computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
-      StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH
-    ]);
-    verify([source]);
-  }
 }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 115d966..8a55212 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -39,13 +39,13 @@
   Asserter<DartType> _isString;
 
   AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, DartType>
-  _isFunction2Of;
+      _isFunction2Of;
   AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isFutureOf;
   AsserterBuilderBuilder<Asserter<DartType>, List<Asserter<DartType>>, DartType>
-  _isInstantiationOf;
+      _isInstantiationOf;
   AsserterBuilder<Asserter<DartType>, InterfaceType> _isListOf;
   AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, InterfaceType>
-  _isMapOf;
+      _isMapOf;
   AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isStreamOf;
   AsserterBuilder<DartType, DartType> _isType;
 
@@ -264,7 +264,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     CascadeExpression fetch(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -291,7 +291,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     ConstructorDeclaration constructor =
-    AstFinder.getConstructorInClass(unit, "A", null);
+        AstFinder.getConstructorInClass(unit, "A", null);
     ConstructorFieldInitializer assignment = constructor.initializers[0];
     Expression exp = assignment.expression;
     _isListOf(_isString)(exp.staticType);
@@ -307,7 +307,7 @@
     CompilationUnit unit = resolveSource(code);
 
     ConstructorDeclaration constructor =
-    AstFinder.getConstructorInClass(unit, "A", null);
+        AstFinder.getConstructorInClass(unit, "A", null);
     BlockFunctionBody body = constructor.body;
     ReturnStatement stmt = body.block.statements[0];
     InstanceCreationExpression exp = stmt.expression;
@@ -353,7 +353,7 @@
     assertListOfInt(body.expression.staticType);
 
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "test2");
+        AstFinder.getStatementsInTopLevelFunction(unit, "test2");
 
     FunctionDeclaration inner =
         (statements[0] as FunctionDeclarationStatement).functionDeclaration;
@@ -384,7 +384,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -412,7 +412,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -439,7 +439,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     Expression functionReturnValue(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -475,7 +475,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       ExpressionStatement stmt = statements[i];
       FunctionExpressionInvocation invk = stmt.expression;
@@ -505,7 +505,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       ExpressionStatement stmt = statements[i];
       FunctionExpressionInvocation invk = stmt.expression;
@@ -533,7 +533,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       ExpressionStatement stmt = statements[i];
       MethodInvocation invk = stmt.expression;
@@ -561,7 +561,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       ExpressionStatement stmt = statements[i];
       MethodInvocation invk = stmt.expression;
@@ -591,7 +591,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       ExpressionStatement stmt = statements[i];
       MethodInvocation invk = stmt.expression;
@@ -621,7 +621,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       ExpressionStatement stmt = statements[i];
       MethodInvocation invk = stmt.expression;
@@ -649,7 +649,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     Expression functionReturnValue(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -794,21 +794,21 @@
     Element elementF = AstFinder.getClass(unit, "F").element;
 
     AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf =
-    _isInstantiationOf(_hasElement(elementA));
+        _isInstantiationOf(_hasElement(elementA));
     AsserterBuilder<List<Asserter<DartType>>, DartType> assertBOf =
-    _isInstantiationOf(_hasElement(elementB));
+        _isInstantiationOf(_hasElement(elementB));
     AsserterBuilder<List<Asserter<DartType>>, DartType> assertCOf =
-    _isInstantiationOf(_hasElement(elementC));
+        _isInstantiationOf(_hasElement(elementC));
     AsserterBuilder<List<Asserter<DartType>>, DartType> assertDOf =
-    _isInstantiationOf(_hasElement(elementD));
+        _isInstantiationOf(_hasElement(elementD));
     AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf =
-    _isInstantiationOf(_hasElement(elementE));
+        _isInstantiationOf(_hasElement(elementE));
     AsserterBuilder<List<Asserter<DartType>>, DartType> assertFOf =
-    _isInstantiationOf(_hasElement(elementF));
+        _isInstantiationOf(_hasElement(elementF));
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test0");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test0");
 
       hasType(assertAOf([_isInt, _isString]), rhs(statements[0]));
       hasType(assertAOf([_isInt, _isString]), rhs(statements[0]));
@@ -821,14 +821,14 @@
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test1");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test1");
       hasType(assertAOf([_isInt, _isString]), rhs(statements[0]));
       hasType(assertAOf([_isInt, _isString]), rhs(statements[1]));
     }
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test2");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test2");
       hasType(assertBOf([_isString, _isInt]), rhs(statements[0]));
       hasType(assertBOf([_isString, _isInt]), rhs(statements[1]));
       hasType(assertBOf([_isString, _isInt]), rhs(statements[2]));
@@ -839,14 +839,14 @@
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test3");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test3");
       hasType(assertBOf([_isString, _isInt]), rhs(statements[0]));
       hasType(assertBOf([_isString, _isInt]), rhs(statements[1]));
     }
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test4");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test4");
       hasType(assertCOf([_isInt]), rhs(statements[0]));
       hasType(assertCOf([_isInt]), rhs(statements[1]));
       hasType(assertCOf([_isInt]), rhs(statements[2]));
@@ -857,7 +857,7 @@
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test5");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test5");
       hasType(assertCOf([_isInt]), rhs(statements[0]));
       hasType(assertCOf([_isInt]), rhs(statements[1]));
     }
@@ -867,7 +867,7 @@
       // context.  We could choose a tighter type, but currently
       // we just use dynamic.
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test6");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test6");
       hasType(assertDOf([_isDynamic, _isString]), rhs(statements[0]));
       hasType(assertDOf([_isDynamic, _isString]), rhs(statements[1]));
       hasType(assertDOf([_isInt, _isString]), rhs(statements[2]));
@@ -878,20 +878,20 @@
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test7");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test7");
       hasType(assertDOf([_isDynamic, _isString]), rhs(statements[0]));
       hasType(assertDOf([_isDynamic, _isString]), rhs(statements[1]));
     }
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test8");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test8");
       hasType(assertEOf([_isDynamic, _isDynamic]), rhs(statements[0]));
     }
 
     {
       List<Statement> statements =
-      AstFinder.getStatementsInTopLevelFunction(unit, "test9");
+          AstFinder.getStatementsInTopLevelFunction(unit, "test9");
       hasType(assertFOf([_isInt, _isString]), rhs(statements[0]));
       hasType(assertFOf([_isInt, _isString]), rhs(statements[1]));
       hasType(assertFOf([_isInt, _isString]), rhs(statements[2]));
@@ -912,7 +912,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     ListLiteral literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -944,7 +944,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -971,7 +971,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -998,7 +998,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -1023,7 +1023,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -1051,7 +1051,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     MapLiteral literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -1061,7 +1061,7 @@
 
     Asserter<InterfaceType> assertListOfString = _isListOf(_isString);
     Asserter<InterfaceType> assertMapOfIntToListOfString =
-    _isMapOf(_isInt, assertListOfString);
+        _isMapOf(_isInt, assertListOfString);
 
     assertMapOfIntToListOfString(literal(0).staticType);
     assertMapOfIntToListOfString(literal(1).staticType);
@@ -1087,7 +1087,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -1096,7 +1096,7 @@
     }
 
     Asserter<InterfaceType> assertMapOfIntToString =
-    _isMapOf(_isInt, _isString);
+        _isMapOf(_isInt, _isString);
 
     assertMapOfIntToString(literal(0));
     assertMapOfIntToString(literal(1));
@@ -1115,7 +1115,7 @@
    ''';
     CompilationUnit unit = resolveSource(code);
     List<Statement> statements =
-    AstFinder.getStatementsInTopLevelFunction(unit, "main");
+        AstFinder.getStatementsInTopLevelFunction(unit, "main");
     DartType literal(int i) {
       VariableDeclarationStatement stmt = statements[i];
       VariableDeclaration decl = stmt.variables.variables[0];
@@ -1124,7 +1124,7 @@
     }
 
     Asserter<InterfaceType> assertMapOfIntToDynamic =
-    _isMapOf(_isInt, _isDynamic);
+        _isMapOf(_isInt, _isDynamic);
 
     assertMapOfIntToDynamic(literal(0));
     assertMapOfIntToDynamic(literal(1));
@@ -1142,7 +1142,7 @@
     CompilationUnit unit = resolveSource(code);
     Expression methodReturnValue(String methodName) {
       MethodDeclaration method =
-      AstFinder.getMethodInClass(unit, "A", methodName);
+          AstFinder.getMethodInClass(unit, "A", methodName);
       FunctionBody body = method.body;
       if (body is ExpressionFunctionBody) {
         return body.expression;
@@ -1166,7 +1166,7 @@
     CompilationUnit unit = resolveSource(code);
 
     ConstructorDeclaration constructor =
-    AstFinder.getConstructorInClass(unit, "A", null);
+        AstFinder.getConstructorInClass(unit, "A", null);
     RedirectingConstructorInvocation invocation = constructor.initializers[0];
     Expression exp = invocation.argumentList.arguments[0];
     _isListOf(_isString)(exp.staticType);
@@ -1184,7 +1184,7 @@
     CompilationUnit unit = resolveSource(code);
 
     ConstructorDeclaration constructor =
-    AstFinder.getConstructorInClass(unit, "A", null);
+        AstFinder.getConstructorInClass(unit, "A", null);
     SuperConstructorInvocation invocation = constructor.initializers[0];
     Expression exp = invocation.argumentList.arguments[0];
     _isListOf(_isString)(exp.staticType);
@@ -1389,7 +1389,7 @@
 
     checkBody(String className) {
       List<Statement> statements =
-      AstFinder.getStatementsInMethod(testUnit, className, "g");
+          AstFinder.getStatementsInMethod(testUnit, className, "g");
 
       for (int i = 1; i <= 5; i++) {
         Expression exp = (statements[i] as ExpressionStatement).expression;
@@ -1725,7 +1725,7 @@
     expectFunctionType('f/*<T>*/(/*=T*/ x) => null; // from D', '<T>(T) → T',
         elementTypeParams: '[T]', typeFormals: '[T]');
     SimpleIdentifier f =
-    findIdentifier('f/*<T>*/(/*=T*/ x) => null; // from D');
+        findIdentifier('f/*<T>*/(/*=T*/ x) => null; // from D');
     MethodElementImpl e = f.staticElement;
     FunctionType ft = e.type.instantiate([typeProvider.stringType]);
     expect(ft.toString(), '(String) → String');
@@ -1967,10 +1967,7 @@
 set g(int x) => 42;
 ''');
     computeLibrarySourceErrors(source);
-    assertErrors(source, [
-      StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
-      StaticTypeWarningCode.RETURN_OF_INVALID_TYPE
-    ]);
+    assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 803ff8c..1168c8b 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -624,10 +624,6 @@
     throw new UnsupportedOperationException();
   }
 
-  Uri resolveRelativeUri(Uri uri) {
-    return new Uri(scheme: 'file', path: _name).resolveUri(uri);
-  }
-
   void setContents(String value) {
     generateExceptionOnRead = false;
     _modificationStamp = new DateTime.now().millisecondsSinceEpoch;
@@ -663,8 +659,4 @@
     }
     return false;
   }
-
-  Uri resolveRelativeUri(Uri uri) {
-    return this.uri.resolveUri(uri);
-  }
 }
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index fe69d2c..c164540 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
@@ -17,6 +18,7 @@
 
 import '../reflective_tests.dart';
 import '../utils.dart';
+import 'analysis_context_factory.dart';
 
 main() {
   initializeTestEnvironment();
@@ -24,6 +26,526 @@
   runReflectiveTests(StrongSubtypingTest);
   runReflectiveTests(StrongGenericFunctionInferenceTest);
   runReflectiveTests(LeastUpperBoundTest);
+  runReflectiveTests(StrongLeastUpperBoundTest);
+  runReflectiveTests(StrongGreatestLowerBoundTest);
+}
+
+/**
+ * Base class for testing LUB and GLB in spec and strong mode.
+ */
+abstract class BoundTestBase {
+  TypeProvider typeProvider;
+  TypeSystem typeSystem;
+  FunctionType simpleFunctionType;
+
+  DartType get bottomType => typeProvider.bottomType;
+  InterfaceType get doubleType => typeProvider.doubleType;
+  DartType get dynamicType => typeProvider.dynamicType;
+  InterfaceType get functionType => typeProvider.functionType;
+  InterfaceType get intType => typeProvider.intType;
+  InterfaceType get iterableType => typeProvider.iterableType;
+  InterfaceType get listType => typeProvider.listType;
+  InterfaceType get numType => typeProvider.numType;
+  InterfaceType get objectType => typeProvider.objectType;
+  InterfaceType get stringType => typeProvider.stringType;
+  StrongTypeSystemImpl get strongTypeSystem =>
+      typeSystem as StrongTypeSystemImpl;
+
+  DartType get voidType => VoidTypeImpl.instance;
+
+  void setUp() {
+    InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
+    typeProvider = context.typeProvider;
+    FunctionTypeAliasElementImpl typeAlias =
+        ElementFactory.functionTypeAliasElement('A');
+    typeAlias.parameters = [];
+    typeAlias.returnType = voidType;
+    simpleFunctionType = typeAlias.type;
+  }
+
+  void _checkGreatestLowerBound(
+      DartType type1, DartType type2, DartType expectedResult) {
+    DartType glb =
+        strongTypeSystem.getGreatestLowerBound(typeProvider, type1, type2);
+    expect(glb, expectedResult);
+    // Check that the result is a lower bound.
+    expect(typeSystem.isSubtypeOf(glb, type1), true);
+    expect(typeSystem.isSubtypeOf(glb, type2), true);
+    // Check for symmetry while we're at it.  Unfortunately,
+    // for function types, the current version of equality
+    // does not respect re-ordering of named parameters, so
+    // for function types we just check if they are mutual subtypes.
+    // https://github.com/dart-lang/sdk/issues/26126
+    // TODO(leafp): Fix this.
+    glb = strongTypeSystem.getGreatestLowerBound(typeProvider, type2, type1);
+    if (glb is FunctionTypeImpl) {
+      expect(typeSystem.isSubtypeOf(glb, expectedResult), true);
+      expect(typeSystem.isSubtypeOf(expectedResult, glb), true);
+    } else {
+      expect(glb, expectedResult);
+    }
+  }
+
+  void _checkLeastUpperBound(
+      DartType type1, DartType type2, DartType expectedResult) {
+    DartType lub = typeSystem.getLeastUpperBound(typeProvider, type1, type2);
+    expect(lub, expectedResult);
+    // Check that the result is an upper bound.
+    expect(typeSystem.isSubtypeOf(type1, lub), true);
+    expect(typeSystem.isSubtypeOf(type2, lub), true);
+
+    // Check for symmetry while we're at it.  Unfortunately,
+    // for function types, the current version of equality
+    // does not respect re-ordering of named parameters, so
+    // for function types we just check if they are mutual subtypes.
+    // https://github.com/dart-lang/sdk/issues/26126
+    // TODO(leafp): Fix this.
+    lub = typeSystem.getLeastUpperBound(typeProvider, type2, type1);
+    if (lub is FunctionTypeImpl) {
+      expect(typeSystem.isSubtypeOf(lub, expectedResult), true);
+      expect(typeSystem.isSubtypeOf(expectedResult, lub), true);
+    } else {
+      expect(lub, expectedResult);
+    }
+  }
+
+  /**
+   * Creates a function type with the given parameter and return types.
+   *
+   * The return type defaults to `void` if omitted.
+   */
+  FunctionType _functionType(List<DartType> required,
+      {List<DartType> optional,
+      Map<String, DartType> named,
+      DartType returns}) {
+    if (returns == null) {
+      returns = voidType;
+    }
+
+    return ElementFactory
+        .functionElement8(required, returns, optional: optional, named: named)
+        .type;
+  }
+}
+
+/**
+ * Tests LUB in spec mode.
+ *
+ * Tests defined in this class are ones whose behavior is spec mode-specific.
+ * In particular, function parameters are compared using LUB in spec mode, but
+ * GLB in strong mode.
+ */
+@reflectiveTest
+class LeastUpperBoundTest extends LeastUpperBoundTestBase {
+  void setUp() {
+    typeSystem = new TypeSystemImpl();
+    super.setUp();
+  }
+
+  void test_functionsLubNamedParams() {
+    FunctionType type1 =
+        _functionType([], named: {'a': stringType, 'b': intType});
+    FunctionType type2 = _functionType([], named: {'a': intType, 'b': numType});
+    FunctionType expected =
+        _functionType([], named: {'a': objectType, 'b': numType});
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_functionsLubPositionalParams() {
+    FunctionType type1 = _functionType([], optional: [stringType, intType]);
+    FunctionType type2 = _functionType([], optional: [intType, numType]);
+    FunctionType expected = _functionType([], optional: [objectType, numType]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_functionsLubRequiredParams() {
+    FunctionType type1 = _functionType([stringType, intType, intType]);
+    FunctionType type2 = _functionType([intType, doubleType, numType]);
+    FunctionType expected = _functionType([objectType, numType, numType]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_nestedNestedFunctionsLubInnermostParamTypes() {
+    FunctionType type1 = _functionType([
+      _functionType([
+        _functionType([stringType, intType, intType])
+      ])
+    ]);
+    FunctionType type2 = _functionType([
+      _functionType([
+        _functionType([intType, doubleType, numType])
+      ])
+    ]);
+    FunctionType expected = _functionType([
+      _functionType([
+        _functionType([objectType, numType, numType])
+      ])
+    ]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  /// Check least upper bound of the same class with different type parameters.
+  void test_typeParameters_different() {
+    // class List<int>
+    // class List<double>
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
+    InterfaceType listOfDoubleType =
+        listType.instantiate(<DartType>[doubleType]);
+    _checkLeastUpperBound(listOfIntType, listOfDoubleType, objectType);
+  }
+
+  /// Check least upper bound of two related classes with different
+  /// type parameters.
+  void test_typeParametersAndClass_different() {
+    // class List<int>
+    // class Iterable<double>
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
+    InterfaceType iterableOfDoubleType =
+        iterableType.instantiate(<DartType>[doubleType]);
+    _checkLeastUpperBound(listOfIntType, iterableOfDoubleType, objectType);
+  }
+}
+
+/**
+ * Base class for testing LUB in spec and strong mode.
+ * Defines helper functions and tests. Tests here are ones whose behavior is
+ * the same in strong and spec mode.
+ */
+abstract class LeastUpperBoundTestBase extends BoundTestBase {
+  void test_bottom_function() {
+    _checkLeastUpperBound(bottomType, simpleFunctionType, simpleFunctionType);
+  }
+
+  void test_bottom_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(bottomType, interfaceType, interfaceType);
+  }
+
+  void test_bottom_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkLeastUpperBound(bottomType, typeParam, typeParam);
+  }
+
+  void test_directInterfaceCase() {
+    // class A
+    // class B implements A
+    // class C implements B
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeB];
+    _checkLeastUpperBound(typeB, typeC, typeB);
+  }
+
+  void test_directSubclassCase() {
+    // class A
+    // class B extends A
+    // class C extends B
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    _checkLeastUpperBound(typeB, typeC, typeB);
+  }
+
+  void test_dynamic_bottom() {
+    _checkLeastUpperBound(dynamicType, bottomType, dynamicType);
+  }
+
+  void test_dynamic_function() {
+    _checkLeastUpperBound(dynamicType, simpleFunctionType, dynamicType);
+  }
+
+  void test_dynamic_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(dynamicType, interfaceType, dynamicType);
+  }
+
+  void test_dynamic_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkLeastUpperBound(dynamicType, typeParam, dynamicType);
+  }
+
+  void test_dynamic_void() {
+    _checkLeastUpperBound(dynamicType, voidType, dynamicType);
+  }
+
+  void test_functionsDifferentRequiredArity() {
+    FunctionType type1 = _functionType([intType, intType]);
+    FunctionType type2 = _functionType([intType, intType, intType]);
+    _checkLeastUpperBound(type1, type2, functionType);
+  }
+
+  void test_functionsIgnoreExtraNamedParams() {
+    FunctionType type1 = _functionType([], named: {'a': intType, 'b': intType});
+    FunctionType type2 = _functionType([], named: {'a': intType, 'c': intType});
+    FunctionType expected = _functionType([], named: {'a': intType});
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_functionsIgnoreExtraPositionalParams() {
+    FunctionType type1 =
+        _functionType([], optional: [intType, intType, stringType]);
+    FunctionType type2 = _functionType([], optional: [intType]);
+    FunctionType expected = _functionType([], optional: [intType]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_functionsLubReturnType() {
+    FunctionType type1 = _functionType([], returns: intType);
+    FunctionType type2 = _functionType([], returns: doubleType);
+    FunctionType expected = _functionType([], returns: numType);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_functionsSameType() {
+    FunctionType type1 = _functionType([stringType, intType, numType],
+        optional: [doubleType], named: {'n': numType}, returns: intType);
+    FunctionType type2 = _functionType([stringType, intType, numType],
+        optional: [doubleType], named: {'n': numType}, returns: intType);
+    FunctionType expected = _functionType([stringType, intType, numType],
+        optional: [doubleType], named: {'n': numType}, returns: intType);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_interface_function() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(interfaceType, simpleFunctionType, objectType);
+  }
+
+  void test_mixinCase() {
+    // class A
+    // class B extends A
+    // class C extends A
+    // class D extends B with M, N, O, P
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classA.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classD.mixins = <InterfaceType>[
+      ElementFactory.classElement2("M").type,
+      ElementFactory.classElement2("N").type,
+      ElementFactory.classElement2("O").type,
+      ElementFactory.classElement2("P").type
+    ];
+    _checkLeastUpperBound(typeD, typeC, typeA);
+  }
+
+  void test_nestedFunctionsLubInnerParamTypes() {
+    FunctionType type1 = _functionType([
+      _functionType([stringType, intType, intType])
+    ]);
+    FunctionType type2 = _functionType([
+      _functionType([intType, doubleType, numType])
+    ]);
+    FunctionType expected = _functionType([
+      _functionType([objectType, numType, numType])
+    ]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_object() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    DartType typeObject = typeA.element.supertype;
+    // assert that object does not have a super type
+    expect((typeObject.element as ClassElement).supertype, isNull);
+    // assert that both A and B have the same super type of Object
+    expect(typeB.element.supertype, typeObject);
+    // finally, assert that the only least upper bound of A and B is Object
+    _checkLeastUpperBound(typeA, typeB, typeObject);
+  }
+
+  void test_self() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+
+    List<DartType> types = [
+      dynamicType,
+      voidType,
+      bottomType,
+      typeParam,
+      interfaceType,
+      simpleFunctionType
+    ];
+
+    for (DartType type in types) {
+      _checkLeastUpperBound(type, type, type);
+    }
+  }
+
+  void test_sharedSuperclass1() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_sharedSuperclass2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classC.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeD = classD.type;
+    _checkLeastUpperBound(typeB, typeD, typeA);
+  }
+
+  void test_sharedSuperclass3() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    _checkLeastUpperBound(typeC, typeD, typeB);
+  }
+
+  void test_sharedSuperclass4() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA2 = ElementFactory.classElement2("A2");
+    ClassElement classA3 = ElementFactory.classElement2("A3");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
+    InterfaceType typeA = classA.type;
+    InterfaceType typeA2 = classA2.type;
+    InterfaceType typeA3 = classA3.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA2];
+    classC.interfaces = <InterfaceType>[typeA3];
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_sharedSuperinterface1() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeA];
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_sharedSuperinterface2() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeA];
+    classD.interfaces = <InterfaceType>[typeC];
+    _checkLeastUpperBound(typeB, typeD, typeA);
+  }
+
+  void test_sharedSuperinterface3() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    InterfaceType typeD = classD.type;
+    classB.interfaces = <InterfaceType>[typeA];
+    classC.interfaces = <InterfaceType>[typeB];
+    classD.interfaces = <InterfaceType>[typeB];
+    _checkLeastUpperBound(typeC, typeD, typeB);
+  }
+
+  void test_sharedSuperinterface4() {
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classA2 = ElementFactory.classElement2("A2");
+    ClassElement classA3 = ElementFactory.classElement2("A3");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    InterfaceType typeA = classA.type;
+    InterfaceType typeA2 = classA2.type;
+    InterfaceType typeA3 = classA3.type;
+    InterfaceType typeB = classB.type;
+    InterfaceType typeC = classC.type;
+    classB.interfaces = <InterfaceType>[typeA, typeA2];
+    classC.interfaces = <InterfaceType>[typeA, typeA3];
+    _checkLeastUpperBound(typeB, typeC, typeA);
+  }
+
+  void test_twoComparables() {
+    _checkLeastUpperBound(stringType, numType, objectType);
+  }
+
+  void test_typeParam_function_bounded() {
+    DartType typeA = ElementFactory.classElement('A', functionType).type;
+    TypeParameterElementImpl typeParamElement =
+        ElementFactory.typeParameterElement('T');
+    typeParamElement.bound = typeA;
+    DartType typeParam = typeParamElement.type;
+    _checkLeastUpperBound(typeParam, simpleFunctionType, functionType);
+  }
+
+  void test_typeParam_function_noBound() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkLeastUpperBound(typeParam, simpleFunctionType, objectType);
+  }
+
+  void test_typeParam_interface_bounded() {
+    DartType typeA = ElementFactory.classElement2('A', []).type;
+    DartType typeB = ElementFactory.classElement('B', typeA).type;
+    DartType typeC = ElementFactory.classElement('C', typeA).type;
+    TypeParameterElementImpl typeParamElement =
+        ElementFactory.typeParameterElement('T');
+    typeParamElement.bound = typeB;
+    DartType typeParam = typeParamElement.type;
+    _checkLeastUpperBound(typeParam, typeC, typeA);
+  }
+
+  void test_typeParam_interface_noBound() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkLeastUpperBound(typeParam, interfaceType, objectType);
+  }
+
+  void test_typeParameters_same() {
+    // List<int>
+    // List<int>
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
+    _checkLeastUpperBound(listOfIntType, listOfIntType, listOfIntType);
+  }
+
+  void test_void() {
+    List<DartType> types = [
+      bottomType,
+      simpleFunctionType,
+      ElementFactory.classElement2('A', []).type,
+      ElementFactory.typeParameterElement('T').type
+    ];
+    for (DartType type in types) {
+      _checkLeastUpperBound(
+          _functionType([], returns: voidType),
+          _functionType([], returns: type),
+          _functionType([], returns: voidType));
+    }
+  }
 }
 
 @reflectiveTest
@@ -527,6 +1049,359 @@
   }
 }
 
+/**
+ * Tests GLB, which only exists in strong mode.
+ */
+@reflectiveTest
+class StrongGreatestLowerBoundTest extends BoundTestBase {
+  void setUp() {
+    typeSystem = new StrongTypeSystemImpl();
+    super.setUp();
+  }
+
+  void test_bottom_function() {
+    _checkGreatestLowerBound(bottomType, simpleFunctionType, bottomType);
+  }
+
+  void test_bottom_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkGreatestLowerBound(bottomType, interfaceType, bottomType);
+  }
+
+  void test_bottom_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkGreatestLowerBound(bottomType, typeParam, bottomType);
+  }
+
+  void test_classAndSuperclass() {
+    // class A
+    // class B extends A
+    // class C extends B
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
+    _checkGreatestLowerBound(classA.type, classC.type, classC.type);
+  }
+
+  void test_classAndSuperinterface() {
+    // class A
+    // class B implements A
+    // class C implements B
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classB.type];
+    _checkGreatestLowerBound(classA.type, classC.type, classC.type);
+  }
+
+  void test_dynamic_bottom() {
+    _checkGreatestLowerBound(dynamicType, bottomType, bottomType);
+  }
+
+  void test_dynamic_function() {
+    _checkGreatestLowerBound(
+        dynamicType, simpleFunctionType, simpleFunctionType);
+  }
+
+  void test_dynamic_interface() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkGreatestLowerBound(dynamicType, interfaceType, interfaceType);
+  }
+
+  void test_dynamic_typeParam() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkGreatestLowerBound(dynamicType, typeParam, typeParam);
+  }
+
+  void test_dynamic_void() {
+    _checkGreatestLowerBound(dynamicType, voidType, voidType);
+  }
+
+  void test_functionsDifferentNamedTakeUnion() {
+    FunctionType type1 = _functionType([], named: {'a': intType, 'b': intType});
+    FunctionType type2 =
+        _functionType([], named: {'b': doubleType, 'c': stringType});
+    FunctionType expected =
+        _functionType([], named: {'a': intType, 'b': numType, 'c': stringType});
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsDifferentOptionalArityTakeMax() {
+    FunctionType type1 = _functionType([], optional: [intType]);
+    FunctionType type2 =
+        _functionType([], optional: [doubleType, stringType, objectType]);
+    FunctionType expected =
+        _functionType([], optional: [numType, stringType, objectType]);
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsDifferentRequiredArityBecomeOptional() {
+    FunctionType type1 = _functionType([intType]);
+    FunctionType type2 = _functionType([intType, intType, intType]);
+    FunctionType expected =
+        _functionType([intType], optional: [intType, intType]);
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsGlbReturnType() {
+    FunctionType type1 = _functionType([], returns: intType);
+    FunctionType type2 = _functionType([], returns: numType);
+    FunctionType expected = _functionType([], returns: intType);
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsLubNamedParams() {
+    FunctionType type1 =
+        _functionType([], named: {'a': stringType, 'b': intType});
+    FunctionType type2 = _functionType([], named: {'a': intType, 'b': numType});
+    FunctionType expected =
+        _functionType([], named: {'a': objectType, 'b': numType});
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsLubPositionalParams() {
+    FunctionType type1 = _functionType([], optional: [stringType, intType]);
+    FunctionType type2 = _functionType([], optional: [intType, numType]);
+    FunctionType expected = _functionType([], optional: [objectType, numType]);
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsLubRequiredParams() {
+    FunctionType type1 = _functionType([stringType, intType, intType]);
+    FunctionType type2 = _functionType([intType, doubleType, numType]);
+    FunctionType expected = _functionType([objectType, numType, numType]);
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsMixedOptionalAndRequiredBecomeOptional() {
+    FunctionType type1 = _functionType([intType, intType],
+        optional: [intType, intType, intType]);
+    FunctionType type2 = _functionType([intType], optional: [intType, intType]);
+    FunctionType expected = _functionType([intType],
+        optional: [intType, intType, intType, intType]);
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_functionsReturnBottomIfMixOptionalAndNamed() {
+    // Dart doesn't allow a function to have both optional and named parameters,
+    // so if we would have synthethized that, pick bottom instead.
+    FunctionType type1 = _functionType([intType], named: {'a': intType});
+    FunctionType type2 = _functionType([], named: {'a': intType});
+    _checkGreatestLowerBound(type1, type2, bottomType);
+  }
+
+  void test_functionsSameType() {
+    FunctionType type1 = _functionType([stringType, intType, numType],
+        optional: [doubleType], named: {'n': numType}, returns: intType);
+    FunctionType type2 = _functionType([stringType, intType, numType],
+        optional: [doubleType], named: {'n': numType}, returns: intType);
+    FunctionType expected = _functionType([stringType, intType, numType],
+        optional: [doubleType], named: {'n': numType}, returns: intType);
+    _checkGreatestLowerBound(type1, type2, expected);
+  }
+
+  void test_interface_function() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkGreatestLowerBound(interfaceType, simpleFunctionType, bottomType);
+  }
+
+  void test_mixin() {
+    // class A
+    // class B
+    // class C
+    // class D extends A with B, C
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement2("B");
+    ClassElement classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement("D", classA.type);
+    classD.mixins = <InterfaceType>[classB.type, classC.type];
+    _checkGreatestLowerBound(classA.type, classD.type, classD.type);
+    _checkGreatestLowerBound(classB.type, classD.type, classD.type);
+    _checkGreatestLowerBound(classC.type, classD.type, classD.type);
+  }
+
+  void test_self() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+
+    List<DartType> types = [
+      dynamicType,
+      voidType,
+      bottomType,
+      typeParam,
+      interfaceType,
+      simpleFunctionType
+    ];
+
+    for (DartType type in types) {
+      _checkGreatestLowerBound(type, type, type);
+    }
+  }
+
+  void test_typeParam_function_noBound() {
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    _checkGreatestLowerBound(typeParam, simpleFunctionType, bottomType);
+  }
+
+  void test_typeParam_interface_bounded() {
+    DartType typeA = ElementFactory.classElement2('A', []).type;
+    DartType typeB = ElementFactory.classElement('B', typeA).type;
+    DartType typeC = ElementFactory.classElement('C', typeB).type;
+    TypeParameterElementImpl typeParam =
+        ElementFactory.typeParameterElement('T');
+    typeParam.bound = typeB;
+    _checkGreatestLowerBound(typeParam.type, typeC, bottomType);
+  }
+
+  void test_typeParam_interface_noBound() {
+    // GLB(T, A) = ⊥
+    DartType typeParam = ElementFactory.typeParameterElement('T').type;
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    _checkGreatestLowerBound(typeParam, interfaceType, bottomType);
+  }
+
+  void test_typeParameters_different() {
+    // GLB(List<int>, List<double>) = ⊥
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
+    InterfaceType listOfDoubleType =
+        listType.instantiate(<DartType>[doubleType]);
+    // TODO(rnystrom): Can we do something better here?
+    _checkGreatestLowerBound(listOfIntType, listOfDoubleType, bottomType);
+  }
+
+  void test_typeParameters_same() {
+    // GLB(List<int>, List<int>) = List<int>
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
+    _checkGreatestLowerBound(listOfIntType, listOfIntType, listOfIntType);
+  }
+
+  void test_unrelatedClasses() {
+    // class A
+    // class B
+    // class C
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    _checkGreatestLowerBound(classA.type, classB.type, bottomType);
+  }
+
+  void test_void() {
+    List<DartType> types = [
+      bottomType,
+      simpleFunctionType,
+      ElementFactory.classElement2('A', []).type,
+      ElementFactory.typeParameterElement('T').type
+    ];
+    for (DartType type in types) {
+      _checkGreatestLowerBound(_functionType([], returns: voidType),
+          _functionType([], returns: type), _functionType([], returns: type));
+    }
+  }
+}
+
+/**
+ * Tests LUB in strong mode.
+ *
+ * Tests defined in this class are ones whose behavior is spec mode-specific.
+ * In particular, function parameters are compared using LUB in spec mode, but
+ * GLB in strong mode.
+ */
+@reflectiveTest
+class StrongLeastUpperBoundTest extends LeastUpperBoundTestBase {
+  void setUp() {
+    typeSystem = new StrongTypeSystemImpl();
+    super.setUp();
+  }
+
+  void test_functionsGlbNamedParams() {
+    FunctionType type1 =
+        _functionType([], named: {'a': stringType, 'b': intType});
+    FunctionType type2 = _functionType([], named: {'a': intType, 'b': numType});
+    FunctionType expected =
+        _functionType([], named: {'a': bottomType, 'b': intType});
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_functionsGlbPositionalParams() {
+    FunctionType type1 = _functionType([], optional: [stringType, intType]);
+    FunctionType type2 = _functionType([], optional: [intType, numType]);
+    FunctionType expected = _functionType([], optional: [bottomType, intType]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_functionsGlbRequiredParams() {
+    FunctionType type1 = _functionType([stringType, intType, intType]);
+    FunctionType type2 = _functionType([intType, doubleType, numType]);
+    FunctionType expected = _functionType([bottomType, bottomType, intType]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_nestedNestedFunctionsGlbInnermostParamTypes() {
+    FunctionType type1 = _functionType([
+      _functionType([
+        _functionType([stringType, intType, intType])
+      ])
+    ]);
+    FunctionType type2 = _functionType([
+      _functionType([
+        _functionType([intType, doubleType, numType])
+      ])
+    ]);
+    FunctionType expected = _functionType([
+      _functionType([
+        _functionType([bottomType, bottomType, intType])
+      ])
+    ]);
+    _checkLeastUpperBound(type1, type2, expected);
+  }
+
+  void test_typeParam_boundedByParam() {
+    TypeParameterElementImpl typeParamElementT =
+        ElementFactory.typeParameterElement('T');
+    TypeParameterElementImpl typeParamElementS =
+        ElementFactory.typeParameterElement('S');
+    DartType typeParamT = typeParamElementT.type;
+    DartType typeParamS = typeParamElementS.type;
+    typeParamElementT.bound = typeParamS;
+    _checkLeastUpperBound(typeParamT, typeParamS, typeParamS);
+  }
+
+  void test_typeParam_fBounded() {
+    ClassElementImpl AClass = ElementFactory.classElement2('A', ["Q"]);
+    InterfaceType AType = AClass.type;
+
+    DartType s = TypeBuilder.variable("S");
+    (s.element as TypeParameterElementImpl).bound = AType.instantiate([s]);
+    DartType u = TypeBuilder.variable("U");
+    (u.element as TypeParameterElementImpl).bound = AType.instantiate([u]);
+
+    _checkLeastUpperBound(s, u, AType.instantiate([objectType]));
+  }
+
+  /// Check least upper bound of the same class with different type parameters.
+  void test_typeParameters_different() {
+    // class List<int>
+    // class List<double>
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
+    InterfaceType listOfDoubleType =
+        listType.instantiate(<DartType>[doubleType]);
+    InterfaceType listOfNum = listType.instantiate(<DartType>[numType]);
+    _checkLeastUpperBound(listOfIntType, listOfDoubleType, listOfNum);
+  }
+
+  /// Check least upper bound of two related classes with different
+  /// type parameters.
+  void test_typeParametersAndClass_different() {
+    // class List<int>
+    // class Iterable<double>
+    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
+    InterfaceType iterableOfDoubleType =
+        iterableType.instantiate(<DartType>[doubleType]);
+    // TODO(leafp): this should be iterableOfNumType
+    _checkLeastUpperBound(listOfIntType, iterableOfDoubleType, objectType);
+  }
+}
+
 @reflectiveTest
 class StrongSubtypingTest {
   TypeProvider typeProvider;
@@ -923,428 +1798,3 @@
   static TypeParameterType variable(String name, {DartType bound}) =>
       ElementFactory.typeParameterWithType(name, bound).type;
 }
-
-@reflectiveTest
-class LeastUpperBoundTest {
-  TypeProvider typeProvider;
-  TypeSystem typeSystem;
-  FunctionType simpleFunctionType;
-
-  DartType get bottomType => typeProvider.bottomType;
-  InterfaceType get doubleType => typeProvider.doubleType;
-  DartType get dynamicType => typeProvider.dynamicType;
-  InterfaceType get functionType => typeProvider.functionType;
-  InterfaceType get intType => typeProvider.intType;
-  InterfaceType get listType => typeProvider.listType;
-  InterfaceType get numType => typeProvider.numType;
-  InterfaceType get objectType => typeProvider.objectType;
-  InterfaceType get stringType => typeProvider.stringType;
-  DartType get voidType => VoidTypeImpl.instance;
-
-  void setUp() {
-    typeProvider = new TestTypeProvider();
-    typeSystem = new TypeSystemImpl();
-    FunctionTypeAliasElementImpl typeAlias =
-        ElementFactory.functionTypeAliasElement('A');
-    typeAlias.parameters = [];
-    typeAlias.returnType = voidType;
-    simpleFunctionType = typeAlias.type;
-  }
-
-  void test_bottom_function() {
-    _checkLeastUpperBound(bottomType, simpleFunctionType, simpleFunctionType);
-  }
-
-  void test_bottom_interface() {
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-    _checkLeastUpperBound(bottomType, interfaceType, interfaceType);
-  }
-
-  void test_bottom_typeParam() {
-    DartType typeParam = ElementFactory.typeParameterElement('T').type;
-    _checkLeastUpperBound(bottomType, typeParam, typeParam);
-  }
-
-  void test_directInterfaceCase() {
-    //
-    // class A
-    // class B implements A
-    // class C implements B
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    classB.interfaces = <InterfaceType>[typeA];
-    classC.interfaces = <InterfaceType>[typeB];
-    _checkLeastUpperBound(typeB, typeC, typeB);
-  }
-
-  void test_directSubclassCase() {
-    //
-    // class A
-    // class B extends A
-    // class C extends B
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    _checkLeastUpperBound(typeB, typeC, typeB);
-  }
-
-  void test_dynamic_bottom() {
-    _checkLeastUpperBound(dynamicType, bottomType, dynamicType);
-  }
-
-  void test_dynamic_function() {
-    _checkLeastUpperBound(dynamicType, simpleFunctionType, dynamicType);
-  }
-
-  void test_dynamic_interface() {
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-    _checkLeastUpperBound(dynamicType, interfaceType, dynamicType);
-  }
-
-  void test_dynamic_typeParam() {
-    DartType typeParam = ElementFactory.typeParameterElement('T').type;
-    _checkLeastUpperBound(dynamicType, typeParam, dynamicType);
-  }
-
-  void test_dynamic_void() {
-    _checkLeastUpperBound(dynamicType, voidType, dynamicType);
-  }
-
-  void test_interface_function() {
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-    _checkLeastUpperBound(interfaceType, simpleFunctionType, objectType);
-  }
-
-  void test_mixinCase() {
-    //
-    // class A
-    // class B extends A
-    // class C extends A
-    // class D extends B with M, N, O, P
-    //
-    ClassElement classA = ElementFactory.classElement2("A");
-    ClassElement classB = ElementFactory.classElement("B", classA.type);
-    ClassElement classC = ElementFactory.classElement("C", classA.type);
-    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
-    InterfaceType typeA = classA.type;
-    InterfaceType typeC = classC.type;
-    InterfaceType typeD = classD.type;
-    classD.mixins = <InterfaceType>[
-      ElementFactory.classElement2("M").type,
-      ElementFactory.classElement2("N").type,
-      ElementFactory.classElement2("O").type,
-      ElementFactory.classElement2("P").type
-    ];
-    _checkLeastUpperBound(typeD, typeC, typeA);
-  }
-
-  void test_object() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    DartType typeObject = typeA.element.supertype;
-    // assert that object does not have a super type
-    expect((typeObject.element as ClassElement).supertype, isNull);
-    // assert that both A and B have the same super type of Object
-    expect(typeB.element.supertype, typeObject);
-    // finally, assert that the only least upper bound of A and B is Object
-    _checkLeastUpperBound(typeA, typeB, typeObject);
-  }
-
-  void test_self() {
-    DartType typeParam = ElementFactory.typeParameterElement('T').type;
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-
-    List<DartType> types = [
-      dynamicType,
-      voidType,
-      bottomType,
-      typeParam,
-      interfaceType,
-      simpleFunctionType
-    ];
-
-    for (DartType type in types) {
-      _checkLeastUpperBound(type, type, type);
-    }
-  }
-
-  void test_sharedSuperclass1() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_sharedSuperclass2() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
-    ClassElementImpl classD = ElementFactory.classElement("D", classC.type);
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeD = classD.type;
-    _checkLeastUpperBound(typeB, typeD, typeA);
-  }
-
-  void test_sharedSuperclass3() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    ClassElementImpl classC = ElementFactory.classElement("C", classB.type);
-    ClassElementImpl classD = ElementFactory.classElement("D", classB.type);
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    InterfaceType typeD = classD.type;
-    _checkLeastUpperBound(typeC, typeD, typeB);
-  }
-
-  void test_sharedSuperclass4() {
-    ClassElement classA = ElementFactory.classElement2("A");
-    ClassElement classA2 = ElementFactory.classElement2("A2");
-    ClassElement classA3 = ElementFactory.classElement2("A3");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    ClassElementImpl classC = ElementFactory.classElement("C", classA.type);
-    InterfaceType typeA = classA.type;
-    InterfaceType typeA2 = classA2.type;
-    InterfaceType typeA3 = classA3.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    classB.interfaces = <InterfaceType>[typeA2];
-    classC.interfaces = <InterfaceType>[typeA3];
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_sharedSuperinterface1() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    classB.interfaces = <InterfaceType>[typeA];
-    classC.interfaces = <InterfaceType>[typeA];
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_sharedSuperinterface2() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    ClassElementImpl classD = ElementFactory.classElement2("D");
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    InterfaceType typeD = classD.type;
-    classB.interfaces = <InterfaceType>[typeA];
-    classC.interfaces = <InterfaceType>[typeA];
-    classD.interfaces = <InterfaceType>[typeC];
-    _checkLeastUpperBound(typeB, typeD, typeA);
-  }
-
-  void test_sharedSuperinterface3() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    ClassElementImpl classD = ElementFactory.classElement2("D");
-    InterfaceType typeA = classA.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    InterfaceType typeD = classD.type;
-    classB.interfaces = <InterfaceType>[typeA];
-    classC.interfaces = <InterfaceType>[typeB];
-    classD.interfaces = <InterfaceType>[typeB];
-    _checkLeastUpperBound(typeC, typeD, typeB);
-  }
-
-  void test_sharedSuperinterface4() {
-    ClassElement classA = ElementFactory.classElement2("A");
-    ClassElement classA2 = ElementFactory.classElement2("A2");
-    ClassElement classA3 = ElementFactory.classElement2("A3");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    InterfaceType typeA = classA.type;
-    InterfaceType typeA2 = classA2.type;
-    InterfaceType typeA3 = classA3.type;
-    InterfaceType typeB = classB.type;
-    InterfaceType typeC = classC.type;
-    classB.interfaces = <InterfaceType>[typeA, typeA2];
-    classC.interfaces = <InterfaceType>[typeA, typeA3];
-    _checkLeastUpperBound(typeB, typeC, typeA);
-  }
-
-  void test_twoComparables() {
-    _checkLeastUpperBound(stringType, numType, objectType);
-  }
-
-  void test_typeParam_function_bounded() {
-    DartType typeA = ElementFactory.classElement('A', functionType).type;
-    TypeParameterElementImpl typeParamElement =
-        ElementFactory.typeParameterElement('T');
-    typeParamElement.bound = typeA;
-    DartType typeParam = typeParamElement.type;
-    _checkLeastUpperBound(typeParam, simpleFunctionType, functionType);
-  }
-
-  void test_typeParam_function_noBound() {
-    DartType typeParam = ElementFactory.typeParameterElement('T').type;
-    _checkLeastUpperBound(typeParam, simpleFunctionType, objectType);
-  }
-
-  void test_typeParam_interface_bounded() {
-    DartType typeA = ElementFactory.classElement2('A', []).type;
-    DartType typeB = ElementFactory.classElement('B', typeA).type;
-    DartType typeC = ElementFactory.classElement('C', typeA).type;
-    TypeParameterElementImpl typeParamElement =
-        ElementFactory.typeParameterElement('T');
-    typeParamElement.bound = typeB;
-    DartType typeParam = typeParamElement.type;
-    _checkLeastUpperBound(typeParam, typeC, typeA);
-  }
-
-  void test_typeParam_interface_noBound() {
-    DartType typeParam = ElementFactory.typeParameterElement('T').type;
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-    _checkLeastUpperBound(typeParam, interfaceType, objectType);
-  }
-
-  void test_typeParameters_different() {
-    //
-    // class List<int>
-    // class List<double>
-    //
-    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
-    InterfaceType listOfDoubleType =
-        listType.instantiate(<DartType>[doubleType]);
-    _checkLeastUpperBound(listOfIntType, listOfDoubleType, objectType);
-  }
-
-  void test_typeParameters_same() {
-    //
-    // List<int>
-    // List<int>
-    //
-    InterfaceType listOfIntType = listType.instantiate(<DartType>[intType]);
-    expect(
-        typeSystem.getLeastUpperBound(
-            typeProvider, listOfIntType, listOfIntType),
-        listOfIntType);
-  }
-
-  void test_void_bottom() {
-    _checkLeastUpperBound(voidType, bottomType, voidType);
-  }
-
-  void test_void_function() {
-    _checkLeastUpperBound(voidType, simpleFunctionType, voidType);
-  }
-
-  void test_void_interface() {
-    DartType interfaceType = ElementFactory.classElement2('A', []).type;
-    _checkLeastUpperBound(voidType, interfaceType, voidType);
-  }
-
-  void test_void_typeParam() {
-    DartType typeParam = ElementFactory.typeParameterElement('T').type;
-    _checkLeastUpperBound(voidType, typeParam, voidType);
-  }
-
-  void test_functionsSameType() {
-    FunctionType type1 = _functionType([stringType, intType, numType],
-        optional: [doubleType], named: {'n': numType}, returns: intType);
-    FunctionType type2 = _functionType([stringType, intType, numType],
-        optional: [doubleType], named: {'n': numType}, returns: intType);
-    FunctionType expected = _functionType([stringType, intType, numType],
-        optional: [doubleType], named: {'n': numType}, returns: intType);
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_functionsDifferentRequiredArity() {
-    FunctionType type1 = _functionType([intType, intType]);
-    FunctionType type2 = _functionType([intType, intType, intType]);
-    _checkLeastUpperBound(type1, type2, functionType);
-  }
-
-  void test_functionsLubRequiredParams() {
-    FunctionType type1 = _functionType([stringType, intType, intType]);
-    FunctionType type2 = _functionType([intType, doubleType, numType]);
-    FunctionType expected = _functionType([objectType, numType, numType]);
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_functionsLubPositionalParams() {
-    FunctionType type1 = _functionType([], optional: [stringType, intType]);
-    FunctionType type2 = _functionType([], optional: [intType, doubleType]);
-    FunctionType expected = _functionType([], optional: [objectType, numType]);
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_functionsIgnoreExtraPositionalParams() {
-    FunctionType type1 =
-        _functionType([], optional: [intType, intType, stringType]);
-    FunctionType type2 = _functionType([], optional: [doubleType]);
-    FunctionType expected = _functionType([], optional: [numType]);
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_functionsLubNamedParams() {
-    FunctionType type1 =
-        _functionType([], named: {'a': stringType, 'b': intType});
-    FunctionType type2 =
-        _functionType([], named: {'a': intType, 'b': doubleType});
-    FunctionType expected =
-        _functionType([], named: {'a': objectType, 'b': numType});
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_functionsIgnoreExtraNamedParams() {
-    FunctionType type1 = _functionType([], named: {'a': intType, 'b': intType});
-    FunctionType type2 =
-        _functionType([], named: {'a': doubleType, 'c': doubleType});
-    FunctionType expected = _functionType([], named: {'a': numType});
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  void test_functionsLubReturnType() {
-    FunctionType type1 = _functionType([], returns: intType);
-    FunctionType type2 = _functionType([], returns: doubleType);
-
-    FunctionType expected = _functionType([], returns: numType);
-    _checkLeastUpperBound(type1, type2, expected);
-  }
-
-  /**
-   * Creates a function type with the given parameter and return types.
-   *
-   * The return type defaults to `void` if omitted.
-   */
-  FunctionType _functionType(List<DartType> required,
-      {List<DartType> optional,
-      Map<String, DartType> named,
-      DartType returns}) {
-    if (returns == null) {
-      returns = voidType;
-    }
-
-    return ElementFactory
-        .functionElement8(required, returns, optional: optional, named: named)
-        .type;
-  }
-
-  void _checkLeastUpperBound(
-      DartType type1, DartType type2, DartType expectedResult) {
-    expect(typeSystem.getLeastUpperBound(typeProvider, type1, type2),
-        expectedResult);
-  }
-}
diff --git a/pkg/analyzer/test/parse_compilation_unit_test.dart b/pkg/analyzer/test/parse_compilation_unit_test.dart
index 9f9679d..c5313da 100644
--- a/pkg/analyzer/test/parse_compilation_unit_test.dart
+++ b/pkg/analyzer/test/parse_compilation_unit_test.dart
@@ -31,7 +31,9 @@
       parseCompilationUnit("void main() => print('Hello, world!')");
     }, throwsA(predicate((error) {
       return error is AnalyzerErrorGroup &&
-          error.toString().contains("Error in <unknown source>: Expected to find ';'");
+          error
+              .toString()
+              .contains("Error in <unknown source>: Expected to find ';'");
     })));
   });
 
diff --git a/pkg/analyzer/test/reflective_tests.dart b/pkg/analyzer/test/reflective_tests.dart
index 2391879..820cb16 100644
--- a/pkg/analyzer/test/reflective_tests.dart
+++ b/pkg/analyzer/test/reflective_tests.dart
@@ -11,6 +11,12 @@
 import 'package:unittest/unittest.dart';
 
 /**
+ * A marker annotation used to instruct dart2js to keep reflection information
+ * for the annotated classes.
+ */
+const ReflectiveTest reflectiveTest = const ReflectiveTest();
+
+/**
  * Runs test methods existing in the given [type].
  *
  * Methods with names starting with `test` are run using [test] function.
@@ -114,9 +120,3 @@
 class ReflectiveTest {
   const ReflectiveTest();
 }
-
-/**
- * A marker annotation used to instruct dart2js to keep reflection information
- * for the annotated classes.
- */
-const ReflectiveTest reflectiveTest = const ReflectiveTest();
diff --git a/pkg/analyzer/test/resource_utils.dart b/pkg/analyzer/test/resource_utils.dart
index fdf1e5a..5936144 100644
--- a/pkg/analyzer/test/resource_utils.dart
+++ b/pkg/analyzer/test/resource_utils.dart
@@ -12,7 +12,6 @@
 import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
 
-
 bool get isWindows => path.Style.platform == path.Style.windows;
 
 /**
@@ -32,6 +31,15 @@
 }
 
 /**
+ * Translate the given posixPath to a file URI appropriate for the
+ * platform on which the tests are executing.
+ */
+String posixToOSFileUri(String posixPath) {
+  expectPosixPath(posixPath);
+  return isWindows ? 'file:///C:$posixPath' : 'file://$posixPath';
+}
+
+/**
  * Translate the given posixPath to a path appropriate for the
  * platform on which the tests are executing.
  */
@@ -48,15 +56,6 @@
 }
 
 /**
- * Translate the given posixPath to a file URI appropriate for the
- * platform on which the tests are executing.
- */
-String posixToOSFileUri(String posixPath) {
-  expectPosixPath(posixPath);
-  return isWindows ? 'file:///C:$posixPath' : 'file://$posixPath';
-}
-
-/**
  * A convenience utility for setting up a test [MemoryResourceProvider].
  * All supplied paths are assumed to be in [path.posix] format
  * and are automatically translated to [path.context].
@@ -96,6 +95,9 @@
   AbsolutePathContext get absolutePathContext => _provider.absolutePathContext;
 
   @override
+  path.Context get pathContext => _provider.pathContext;
+
+  @override
   File getFile(String path) => _provider.getFile(_assertPath(path));
 
   @override
@@ -108,9 +110,6 @@
   Folder getStateLocation(String pluginId) =>
       _provider.getStateLocation(pluginId);
 
-  @override
-  path.Context get pathContext => _provider.pathContext;
-
   /**
    * Assert that the given path is valid for the OS platform on which the
    * tests are running.
diff --git a/pkg/analyzer/test/source/analysis_options_provider_test.dart b/pkg/analyzer/test/source/analysis_options_provider_test.dart
index 0b00a6d..ee9f0e0 100644
--- a/pkg/analyzer/test/source/analysis_options_provider_test.dart
+++ b/pkg/analyzer/test/source/analysis_options_provider_test.dart
@@ -4,15 +4,21 @@
 
 library analyzer.test.source.analysis_options_provider_test;
 
+import 'dart:core' hide Resource;
+
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/source/analysis_options_provider.dart';
 import 'package:unittest/unittest.dart';
 import 'package:yaml/yaml.dart';
 
+import '../reflective_tests.dart';
 import '../resource_utils.dart';
+import '../utils.dart';
 
 main() {
+  initializeTestEnvironment();
+  runReflectiveTests(AnalysisOptionsProviderTest);
   group('AnalysisOptionsProvider', () {
     void expectMergesTo(String defaults, String overrides, String expected) {
       var optionsProvider = new AnalysisOptionsProvider();
@@ -67,68 +73,6 @@
   });
 
   group('AnalysisOptionsProvider', () {
-    setUp(() {
-      buildResourceProvider();
-    });
-    tearDown(() {
-      clearResourceProvider();
-    });
-    test('test_simple', () {
-      var optionsProvider = new AnalysisOptionsProvider();
-      Map<String, YamlNode> options =
-          optionsProvider.getOptions(pathTranslator.getResource('/'));
-      expect(options, hasLength(1));
-      expect(options['analyzer'], isNotNull);
-      YamlMap analyzer = options['analyzer'];
-      expect(analyzer, hasLength(1));
-      expect(analyzer['ignore'], isNotNull);
-      YamlList ignore = analyzer['ignore'];
-      expect(ignore, hasLength(2));
-      expect(ignore[0], 'ignoreme.dart');
-      expect(ignore[1], 'sdk_ext/**');
-    });
-    test('test_doesnotexist', () {
-      var optionsProvider = new AnalysisOptionsProvider();
-      Map<String, YamlNode> options =
-          optionsProvider.getOptions(pathTranslator.getResource('/empty'));
-      expect(options, isEmpty);
-    });
-  });
-  group('AnalysisOptionsProvider', () {
-    setUp(() {
-      buildResourceProvider(emptyAnalysisOptions: true);
-    });
-    tearDown(() {
-      clearResourceProvider();
-    });
-    test('test_empty', () {
-      var optionsProvider = new AnalysisOptionsProvider();
-      Map<String, YamlNode> options =
-          optionsProvider.getOptions(pathTranslator.getResource('/'));
-      expect(options, isNotNull);
-    });
-  });
-  group('AnalysisOptionsProvider', () {
-    setUp(() {
-      buildResourceProvider(badAnalysisOptions: true);
-    });
-    tearDown(() {
-      clearResourceProvider();
-    });
-    test('test_invalid', () {
-      var optionsProvider = new AnalysisOptionsProvider();
-      bool exceptionCaught = false;
-      try {
-        Map<String, YamlNode> options =
-            optionsProvider.getOptions(pathTranslator.getResource('/'));
-        expect(options, isNotNull);
-      } catch (e) {
-        exceptionCaught = true;
-      }
-      expect(exceptionCaught, isTrue);
-    });
-  });
-  group('AnalysisOptionsProvider', () {
     test('test_bad_yaml (1)', () {
       var src = '''
     analyzer: # <= bang
@@ -155,21 +99,90 @@
   });
 }
 
-ResourceProvider resourceProvider;
-TestPathTranslator pathTranslator;
+@reflectiveTest
+class AnalysisOptionsProviderTest {
+  TestPathTranslator pathTranslator;
+  ResourceProvider resourceProvider;
 
-buildResourceProvider(
-    {bool emptyAnalysisOptions: false, bool badAnalysisOptions: false}) {
-  var rawProvider = new MemoryResourceProvider(isWindows: isWindows);
-  resourceProvider = new TestResourceProvider(rawProvider);
-  pathTranslator = new TestPathTranslator(rawProvider)
-    ..newFolder('/empty')
-    ..newFolder('/tmp');
-  if (badAnalysisOptions) {
-    pathTranslator.newFile('/.analysis_options', r''':''');
-  } else if (emptyAnalysisOptions) {
+  AnalysisOptionsProvider provider = new AnalysisOptionsProvider();
+
+  void setUp() {
+    var rawProvider = new MemoryResourceProvider(isWindows: isWindows);
+    resourceProvider = new TestResourceProvider(rawProvider);
+    pathTranslator = new TestPathTranslator(rawProvider);
+  }
+
+  void test_getOptions_crawlUp_hasInFolder() {
+    pathTranslator.newFolder('/foo/bar');
+    pathTranslator.newFile(
+        '/foo/.analysis_options',
+        r'''
+analyzer:
+  ignore:
+    - foo
+''');
+    pathTranslator.newFile(
+        '/foo/bar/.analysis_options',
+        r'''
+analyzer:
+  ignore:
+    - bar
+''');
+    Map<String, YamlNode> options = _getOptions('/foo/bar', crawlUp: true);
+    expect(options, hasLength(1));
+    {
+      YamlMap analyzer = options['analyzer'];
+      expect(analyzer, isNotNull);
+      expect(analyzer['ignore'], unorderedEquals(['bar']));
+    }
+  }
+
+  void test_getOptions_crawlUp_hasInParent() {
+    pathTranslator.newFolder('/foo/bar/baz');
+    pathTranslator.newFile(
+        '/foo/.analysis_options',
+        r'''
+analyzer:
+  ignore:
+    - foo
+''');
+    pathTranslator.newFile(
+        '/foo/bar/.analysis_options',
+        r'''
+analyzer:
+  ignore:
+    - bar
+''');
+    Map<String, YamlNode> options = _getOptions('/foo/bar/baz', crawlUp: true);
+    expect(options, hasLength(1));
+    {
+      YamlMap analyzer = options['analyzer'];
+      expect(analyzer, isNotNull);
+      expect(analyzer['ignore'], unorderedEquals(['bar']));
+    }
+  }
+
+  void test_getOptions_doesNotExist() {
+    pathTranslator.newFolder('/notFile');
+    Map<String, YamlNode> options = _getOptions('/notFile');
+    expect(options, isEmpty);
+  }
+
+  void test_getOptions_empty() {
     pathTranslator.newFile('/.analysis_options', r'''#empty''');
-  } else {
+    Map<String, YamlNode> options = _getOptions('/');
+    expect(options, isNotNull);
+    expect(options, isEmpty);
+  }
+
+  void test_getOptions_invalid() {
+    pathTranslator.newFile('/.analysis_options', r''':''');
+    expect(() {
+      _getOptions('/');
+    }, throws);
+  }
+
+  void test_getOptions_simple() {
     pathTranslator.newFile(
         '/.analysis_options',
         r'''
@@ -178,9 +191,22 @@
     - ignoreme.dart
     - 'sdk_ext/**'
 ''');
+    Map<String, YamlNode> options = _getOptions('/');
+    expect(options, hasLength(1));
+    {
+      YamlMap analyzer = options['analyzer'];
+      expect(analyzer, hasLength(1));
+      {
+        YamlList ignore = analyzer['ignore'];
+        expect(ignore, hasLength(2));
+        expect(ignore[0], 'ignoreme.dart');
+        expect(ignore[1], 'sdk_ext/**');
+      }
+    }
   }
-}
 
-clearResourceProvider() {
-  resourceProvider = null;
+  Map<String, YamlNode> _getOptions(String posixPath, {bool crawlUp: false}) {
+    Resource resource = pathTranslator.getResource(posixPath);
+    return provider.getOptions(resource, crawlUp: crawlUp);
+  }
 }
diff --git a/pkg/analyzer/test/source/embedder_test.dart b/pkg/analyzer/test/source/embedder_test.dart
index 448fdb0..898aa1f 100644
--- a/pkg/analyzer/test/source/embedder_test.dart
+++ b/pkg/analyzer/test/source/embedder_test.dart
@@ -138,8 +138,8 @@
   });
 }
 
-ResourceProvider resourceProvider;
 TestPathTranslator pathTranslator;
+ResourceProvider resourceProvider;
 
 buildResourceProvider() {
   var rawProvider = new MemoryResourceProvider(isWindows: isWindows);
diff --git a/pkg/analyzer/test/src/abstract_single_unit.dart b/pkg/analyzer/test/src/abstract_single_unit.dart
index 1955d6e..787ac21 100644
--- a/pkg/analyzer/test/src/abstract_single_unit.dart
+++ b/pkg/analyzer/test/src/abstract_single_unit.dart
@@ -24,9 +24,10 @@
   CompilationUnitElement testUnitElement;
   LibraryElement testLibraryElement;
 
-  void addTestSource(String code, [Uri uri]) {
+  Source addTestSource(String code, [Uri uri]) {
     testCode = code;
     testSource = addSource(testFile, code);
+    return testSource;
   }
 
   void assertNoErrorsInSource(Source source) {
diff --git a/pkg/analyzer/test/src/context/abstract_context.dart b/pkg/analyzer/test/src/context/abstract_context.dart
index b0b7a01..be85eff 100644
--- a/pkg/analyzer/test/src/context/abstract_context.dart
+++ b/pkg/analyzer/test/src/context/abstract_context.dart
@@ -45,9 +45,12 @@
 typedef void _ElementVisitorFunction(Element element);
 
 class AbstractContextTest {
+  static final MockSdk SHARED_MOCK_SDK = new MockSdk();
+  static final MockSdk SHARED_STRONG_MOCK_SDK = new MockSdk();
+
   MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
-  DartSdk sdk = new MockSdk();
+  DartSdk sdk;
   SourceFactory sourceFactory;
   AnalysisContextImpl context;
   AnalysisCache analysisCache;
@@ -120,6 +123,8 @@
     return new AnalysisContextImpl();
   }
 
+  DartSdk createDartSdk() => new MockSdk();
+
   Source newSource(String path, [String content = '']) {
     File file = resourceProvider.newFile(path, content);
     return file.createSource();
@@ -135,6 +140,7 @@
   }
 
   void prepareAnalysisContext([AnalysisOptions options]) {
+    sdk = createDartSdk();
     sdkResolver = new DartUriResolver(sdk);
     resourceResolver = new ResourceUriResolver(resourceProvider);
     sourceFactory =
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 63130a5..b2e1f04 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -1397,6 +1397,22 @@
     expect(analysisResult.changeNotices, isNotNull);
   }
 
+  void test_handleContentsChanged_incremental_newContentsNull() {
+    context.analysisOptions = new AnalysisOptionsImpl()..incremental = true;
+    ContentCache contentCache = new ContentCache();
+    context.contentCache = contentCache;
+    // old contents
+    String oldContents = 'foo() {}';
+    Source source = resourceProvider.getFile('/test.dart').createSource();
+    contentCache.setContents(source, oldContents);
+    expect(context.computeLibraryElement(source), isNotNull);
+    // new contents
+    String newContents = null;
+    contentCache.setContents(source, newContents);
+    context.handleContentsChanged(source, oldContents, newContents, true);
+    expect(context.getLibraryElement(source), isNull);
+  }
+
   Future test_implicitAnalysisEvents_added() async {
     AnalyzedSourcesListener listener = new AnalyzedSourcesListener();
     context.implicitAnalysisEvents.listen(listener.onData);
diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart
index 8103e12..a28f4b8 100644
--- a/pkg/analyzer/test/src/context/mock_sdk.dart
+++ b/pkg/analyzer/test/src/context/mock_sdk.dart
@@ -113,6 +113,14 @@
   num operator -(num other);
   num operator *(num other);
   num operator /(num other);
+  int operator ^(int other);
+  int operator &(int other);
+  int operator |(int other);
+  int operator <<(int other);
+  int operator >>(int other);
+  int operator ~/(int other);
+  int operator %(int other);
+  int operator ~();
   int toInt();
   double toDouble();
   num abs();
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 17f71cc..ebee2d6 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -30,6 +30,7 @@
   runReflectiveTests(FieldElementImplTest);
   runReflectiveTests(FunctionTypeImplTest);
   runReflectiveTests(InterfaceTypeImplTest);
+  runReflectiveTests(LocalVariableElementImplTest);
   runReflectiveTests(TypeParameterTypeImplTest);
   runReflectiveTests(VoidTypeImplTest);
   runReflectiveTests(ClassElementImplTest);
@@ -3770,6 +3771,45 @@
 }
 
 @reflectiveTest
+class LocalVariableElementImplTest extends EngineTestCase {
+  void test_computeNode_declaredIdentifier() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+main() {
+  for (int v in <int>[1, 2, 3]) {}
+}''');
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    FunctionElement mainElement = libraryElement.units[0].functions[0];
+    LocalVariableElement element = mainElement.localVariables[0];
+    DeclaredIdentifier node = element.computeNode() as DeclaredIdentifier;
+    expect(node, isNotNull);
+    expect(node.identifier.name, 'v');
+    expect(node.element, same(element));
+  }
+
+  void test_computeNode_variableDeclaration() {
+    AnalysisContextHelper contextHelper = new AnalysisContextHelper();
+    AnalysisContext context = contextHelper.context;
+    Source source = contextHelper.addSource(
+        "/test.dart",
+        r'''
+main() {
+  int v = 0;
+}''');
+    LibraryElement libraryElement = context.computeLibraryElement(source);
+    FunctionElement mainElement = libraryElement.units[0].functions[0];
+    LocalVariableElement element = mainElement.localVariables[0];
+    VariableDeclaration node = element.computeNode() as VariableDeclaration;
+    expect(node, isNotNull);
+    expect(node.name.name, 'v');
+    expect(node.element, same(element));
+  }
+}
+
+@reflectiveTest
 class MethodElementImplTest extends EngineTestCase {
   void test_computeNode() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
diff --git a/pkg/analyzer/test/src/summary/in_summary_source_test.dart b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
new file mode 100644
index 0000000..f45602c
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/in_summary_source_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.src.summary.in_summary_source_test;
+
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(InSummarySourceTest);
+}
+
+@reflectiveTest
+class InSummarySourceTest extends ReflectiveTest {
+  test_fallbackPath() {
+    String fooFallbackPath = absolute('path', 'to', 'foo.dart');
+    var sourceFactory = new SourceFactory([
+      new InSummaryPackageUriResolver(new MockSummaryDataStore.fake(
+          {'package:foo/foo.dart': 'foo.sum',},
+          uriToFallbackModePath: {'package:foo/foo.dart': fooFallbackPath}))
+    ]);
+
+    InSummarySource source = sourceFactory.forUri('package:foo/foo.dart');
+    expect(source, new isInstanceOf<FileBasedSource>());
+    expect(source.fullName, fooFallbackPath);
+  }
+
+  test_InSummarySource() {
+    var sourceFactory = new SourceFactory([
+      new InSummaryPackageUriResolver(new MockSummaryDataStore.fake({
+        'package:foo/foo.dart': 'foo.sum',
+        'package:foo/src/foo_impl.dart': 'foo.sum',
+        'package:bar/baz.dart': 'bar.sum',
+      }))
+    ]);
+
+    InSummarySource source = sourceFactory.forUri('package:foo/foo.dart');
+    expect(source, isNot(new isInstanceOf<FileBasedSource>()));
+    expect(source.summaryPath, 'foo.sum');
+
+    source = sourceFactory.forUri('package:foo/src/foo_impl.dart');
+    expect(source, isNot(new isInstanceOf<FileBasedSource>()));
+    expect(source.summaryPath, 'foo.sum');
+
+    source = sourceFactory.forUri('package:bar/baz.dart');
+    expect(source, isNot(new isInstanceOf<FileBasedSource>()));
+    expect(source.summaryPath, 'bar.sum');
+  }
+}
+
+class MockSummaryDataStore implements SummaryDataStore {
+  final Map<String, LinkedLibrary> linkedMap;
+  final Map<String, UnlinkedUnit> unlinkedMap;
+  final Map<String, String> uriToSummaryPath;
+
+  MockSummaryDataStore(this.linkedMap, this.unlinkedMap, this.uriToSummaryPath);
+
+  factory MockSummaryDataStore.fake(Map<String, String> uriToSummary,
+      {Map<String, String> uriToFallbackModePath: const {}}) {
+    // Create fake unlinked map.
+    // We don't populate the values as it is not needed for the test.
+    var unlinkedMap = new Map<String, UnlinkedUnit>.fromIterable(
+        uriToSummary.keys,
+        value: (uri) => new UnlinkedUnitBuilder(
+            fallbackModePath: uriToFallbackModePath[uri]));
+    return new MockSummaryDataStore(null, unlinkedMap, uriToSummary);
+  }
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
diff --git a/pkg/analyzer/test/src/summary/index_unit_test.dart b/pkg/analyzer/test/src/summary/index_unit_test.dart
index f9639e2..cb18d02 100644
--- a/pkg/analyzer/test/src/summary/index_unit_test.dart
+++ b/pkg/analyzer/test/src/summary/index_unit_test.dart
@@ -99,6 +99,11 @@
     _assertDefinedName('A', IndexNameKind.topLevel, 'A {}');
   }
 
+  void test_definedName_topLevel_class2() {
+    _indexTestUnit('class A {}', declOnly: true);
+    _assertDefinedName('A', IndexNameKind.topLevel, 'A {}');
+  }
+
   void test_definedName_topLevel_classAlias() {
     _indexTestUnit('''
 class M {}
@@ -1169,10 +1174,14 @@
     return _getStringId(str);
   }
 
-  void _indexTestUnit(String code) {
+  void _indexTestUnit(String code, {bool declOnly: false}) {
     resolveTestUnit(code);
     PackageIndexAssembler assembler = new PackageIndexAssembler();
-    assembler.index(testUnit);
+    if (declOnly) {
+      assembler.indexDeclarations(testUnit);
+    } else {
+      assembler.indexUnit(testUnit);
+    }
     // assemble, write and read
     PackageIndexBuilder indexBuilder = assembler.assemble();
     List<int> indexBytes = indexBuilder.toBuffer();
diff --git a/pkg/analyzer/test/src/summary/name_filter_test.dart b/pkg/analyzer/test/src/summary/name_filter_test.dart
index 5f5ca4f..3646720 100644
--- a/pkg/analyzer/test/src/summary/name_filter_test.dart
+++ b/pkg/analyzer/test/src/summary/name_filter_test.dart
@@ -113,8 +113,8 @@
 
   test_merge_hides_hides() {
     NameFilter filter = new NameFilter.forUnlinkedCombinator(
-        new UnlinkedCombinatorBuilder(hides: ['foo'])).merge(
-        new NameFilter.forUnlinkedCombinator(
+            new UnlinkedCombinatorBuilder(hides: ['foo']))
+        .merge(new NameFilter.forUnlinkedCombinator(
             new UnlinkedCombinatorBuilder(hides: ['bar'])));
     expect(filter.accepts('foo'), isFalse);
     expect(filter.accepts('bar'), isFalse);
@@ -138,8 +138,8 @@
 
   test_merge_hides_shows() {
     NameFilter filter = new NameFilter.forUnlinkedCombinator(
-        new UnlinkedCombinatorBuilder(hides: ['bar', 'baz'])).merge(
-        new NameFilter.forUnlinkedCombinator(
+            new UnlinkedCombinatorBuilder(hides: ['bar', 'baz']))
+        .merge(new NameFilter.forUnlinkedCombinator(
             new UnlinkedCombinatorBuilder(shows: ['foo', 'bar'])));
     expect(filter.accepts('foo'), isTrue);
     expect(filter.accepts('bar'), isFalse);
@@ -183,8 +183,8 @@
 
   test_merge_shows_hides() {
     NameFilter filter = new NameFilter.forUnlinkedCombinator(
-        new UnlinkedCombinatorBuilder(shows: ['foo', 'bar'])).merge(
-        new NameFilter.forUnlinkedCombinator(
+            new UnlinkedCombinatorBuilder(shows: ['foo', 'bar']))
+        .merge(new NameFilter.forUnlinkedCombinator(
             new UnlinkedCombinatorBuilder(hides: ['bar', 'baz'])));
     expect(filter.accepts('foo'), isTrue);
     expect(filter.accepts('bar'), isFalse);
@@ -208,8 +208,8 @@
 
   test_merge_shows_shows() {
     NameFilter filter = new NameFilter.forUnlinkedCombinator(
-        new UnlinkedCombinatorBuilder(shows: ['foo', 'bar'])).merge(
-        new NameFilter.forUnlinkedCombinator(
+            new UnlinkedCombinatorBuilder(shows: ['foo', 'bar']))
+        .merge(new NameFilter.forUnlinkedCombinator(
             new UnlinkedCombinatorBuilder(shows: ['bar', 'baz'])));
     expect(filter.accepts('foo'), isFalse);
     expect(filter.accepts('bar'), isTrue);
@@ -221,8 +221,8 @@
 
   test_merge_shows_shows_emptyResult() {
     NameFilter filter = new NameFilter.forUnlinkedCombinator(
-        new UnlinkedCombinatorBuilder(shows: ['foo'])).merge(
-        new NameFilter.forUnlinkedCombinator(
+            new UnlinkedCombinatorBuilder(shows: ['foo']))
+        .merge(new NameFilter.forUnlinkedCombinator(
             new UnlinkedCombinatorBuilder(shows: ['bar'])));
     expect(filter.accepts('foo'), isFalse);
     expect(filter.accepts('bar'), isFalse);
diff --git a/pkg/analyzer/test/src/summary/prelinker_test.dart b/pkg/analyzer/test/src/summary/prelinker_test.dart
index 4453ab0..b4d4098 100644
--- a/pkg/analyzer/test/src/summary/prelinker_test.dart
+++ b/pkg/analyzer/test/src/summary/prelinker_test.dart
@@ -75,7 +75,8 @@
     }
     UnlinkedPublicNamespace getImport(String relativeUri) {
       String absoluteUri = resolveToAbsoluteUri(library, relativeUri);
-      UnlinkedPublicNamespace namespace = sdkPublicNamespace[absoluteUri];
+      UnlinkedPublicNamespace namespace = SerializedMockSdk
+          .instance.uriToUnlinkedUnit[absoluteUri]?.publicNamespace;
       if (namespace == null) {
         namespace = uriToPublicNamespace[absoluteUri];
       }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
new file mode 100644
index 0000000..c0077e2
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -0,0 +1,156 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.src.summary.resynthesize_ast_test;
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/prelink.dart';
+import 'package:analyzer/src/summary/resynthesize.dart';
+import 'package:analyzer/src/summary/summarize_ast.dart';
+import 'package:analyzer/src/summary/summarize_elements.dart'
+    show PackageBundleAssembler;
+import 'package:analyzer/task/dart.dart' show PARSED_UNIT;
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'resynthesize_test.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(ResynthesizeAstTest);
+}
+
+@reflectiveTest
+class ResynthesizeAstTest extends ResynthesizeTest {
+  final Set<Source> serializedSources = new Set<Source>();
+  final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler();
+  final Map<Uri, UnlinkedUnitBuilder> uriToUnit = <Uri, UnlinkedUnitBuilder>{};
+
+  @override
+  bool get checkPropagatedTypes => false;
+
+  @override
+  void checkLibrary(String text,
+      {bool allowErrors: false, bool dumpSummaries: false}) {
+    Source source = addTestSource(text);
+    SummaryResynthesizer resynthesizer = _encodeLibrary(source);
+    LibraryElementImpl resynthesized =
+        resynthesizer.getLibraryElement(source.uri.toString());
+    LibraryElementImpl original = context.computeLibraryElement(source);
+    checkLibraryElements(original, resynthesized);
+  }
+
+  @override
+  TestSummaryResynthesizer encodeDecodeLibrarySource(Source source) {
+    return _encodeLibrary(source);
+  }
+
+  @override
+  void test_const_invokeConstructor_named() {
+    // TODO(scheglov) fix me
+  }
+
+  @override
+  void test_constructor_withCycles_const() {
+    // TODO(scheglov) fix me
+  }
+
+  @override
+  void test_inferred_function_type_in_generic_class_constructor() {
+    // TODO(scheglov) fix me
+  }
+
+  @override
+  void test_metadata_constructor_call_named() {
+    // TODO(scheglov) fix me
+  }
+
+  @override
+  void test_metadata_constructor_call_named_prefixed() {
+    // TODO(scheglov) fix me
+  }
+
+  @override
+  void test_metadata_constructor_call_unnamed() {
+    // TODO(scheglov) fix me
+  }
+
+  @override
+  void test_metadata_constructor_call_with_args() {
+    // TODO(scheglov) fix me
+  }
+
+  @override
+  void test_type_reference_to_import_part_in_subdir() {
+    // TODO(scheglov) fix me
+  }
+
+  TestSummaryResynthesizer _encodeLibrary(Source source) {
+    addLibrary('dart:core');
+    _serializeLibrary(source);
+
+    PackageBundle bundle =
+        new PackageBundle.fromBuffer(bundleAssembler.assemble().toBuffer());
+
+    Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{};
+    Map<String, LinkedLibrary> linkedSummaries = <String, LinkedLibrary>{};
+    for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) {
+      String uri = bundle.unlinkedUnitUris[i];
+      unlinkedSummaries[uri] = bundle.unlinkedUnits[i];
+    }
+    for (int i = 0; i < bundle.linkedLibraryUris.length; i++) {
+      String uri = bundle.linkedLibraryUris[i];
+      linkedSummaries[uri] = bundle.linkedLibraries[i];
+    }
+
+    return new TestSummaryResynthesizer(
+        null, context, unlinkedSummaries, linkedSummaries);
+  }
+
+  UnlinkedUnitBuilder _getUnlinkedUnit(Source source) {
+    return uriToUnit.putIfAbsent(source.uri, () {
+      CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
+      UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
+      bundleAssembler.addUnlinkedUnit(source, unlinkedUnit);
+      return unlinkedUnit;
+    });
+  }
+
+  void _serializeLibrary(Source librarySource) {
+    if (!serializedSources.add(librarySource)) {
+      return;
+    }
+
+    Source resolveRelativeUri(String relativeUri) {
+      Source resolvedSource =
+          context.sourceFactory.resolveUri(librarySource, relativeUri);
+      if (resolvedSource == null) {
+        throw new StateError('Could not resolve $relativeUri in the context of '
+            '$librarySource (${librarySource.runtimeType})');
+      }
+      return resolvedSource;
+    }
+
+    UnlinkedUnitBuilder getPart(String relativeUri) {
+      return _getUnlinkedUnit(resolveRelativeUri(relativeUri));
+    }
+
+    UnlinkedPublicNamespace getImport(String relativeUri) {
+      return getPart(relativeUri).publicNamespace;
+    }
+
+    UnlinkedUnitBuilder definingUnit = _getUnlinkedUnit(librarySource);
+    LinkedLibraryBuilder linkedLibrary =
+        prelink(definingUnit, getPart, getImport);
+    bundleAssembler.addLinkedLibrary(
+        librarySource.uri.toString(), linkedLibrary);
+    linkedLibrary.dependencies.skip(1).forEach((LinkedDependency d) {
+      _serializeLibrary(resolveRelativeUri(d.uri));
+    });
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart b/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart
index 37c2f4a..c52b604 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart
@@ -5,18 +5,22 @@
 library analyzer.test.src.summary.resynthesize_strong_test;
 
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../reflective_tests.dart';
+import '../context/abstract_context.dart';
 import 'resynthesize_test.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ResynthStrongTest);
+  runReflectiveTests(ResynthesizeStrongTest);
 }
 
 @reflectiveTest
-class ResynthStrongTest extends ResynthTest {
+class ResynthesizeStrongTest extends ResynthesizeElementTest {
+  DartSdk createDartSdk() => AbstractContextTest.SHARED_STRONG_MOCK_SDK;
+
   @override
   AnalysisOptionsImpl createOptions() =>
       super.createOptions()..strongMode = true;
diff --git a/pkg/analyzer/test/src/summary/resynthesize_test.dart b/pkg/analyzer/test/src/summary/resynthesize_test.dart
index 0d810b4..dc8fd6d 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_test.dart
@@ -16,8 +16,10 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/resolver.dart'
     show Namespace, TypeProvider;
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -25,26 +27,155 @@
 import 'package:analyzer/src/summary/summarize_elements.dart';
 import 'package:unittest/unittest.dart';
 
-import '../../generated/resolver_test_case.dart';
+import '../../generated/test_support.dart';
 import '../../reflective_tests.dart';
+import '../abstract_single_unit.dart';
+import '../context/abstract_context.dart';
 import 'summary_common.dart' show canonicalize;
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(ResynthTest);
+  runReflectiveTests(ResynthesizeElementTest);
 }
 
 @reflectiveTest
-class ResynthTest extends ResolverTestCase {
+class ResynthesizeElementTest extends ResynthesizeTest {
+  @override
+  void checkLibrary(String text,
+      {bool allowErrors: false, bool dumpSummaries: false}) {
+    Source source = addTestSource(text);
+    LibraryElementImpl original = context.computeLibraryElement(source);
+    LibraryElementImpl resynthesized = resynthesizeLibraryElement(
+        encodeLibrary(original,
+            allowErrors: allowErrors, dumpSummaries: dumpSummaries),
+        source.uri.toString(),
+        original);
+    checkLibraryElements(original, resynthesized);
+  }
+
+  @override
+  SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource) {
+    LibraryElement libraryElement =
+        context.computeLibraryElement(librarySource);
+    return encodeLibrary(libraryElement);
+  }
+
+  /**
+   * Serialize the given [library] into a summary.  Then create a
+   * [TestSummaryResynthesizer] which can deserialize it, along with any
+   * references it makes to `dart:core`.
+   *
+   * Errors will lead to a test failure unless [allowErrors] is `true`.
+   */
+  TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library,
+      {bool allowErrors: false, bool dumpSummaries: false}) {
+    if (!allowErrors) {
+      assertNoErrors(library.source);
+    }
+    addLibrary('dart:core');
+    addLibrary('dart:async');
+    addLibrary('dart:math');
+    return encodeLibraryElement(library, dumpSummaries: dumpSummaries);
+  }
+
+  /**
+   * Convert the library element [library] into a summary, and then create a
+   * [TestSummaryResynthesizer] which can deserialize it.
+   *
+   * Caller is responsible for checking the library for errors, and adding any
+   * dependent libraries using [addLibrary].
+   */
+  TestSummaryResynthesizer encodeLibraryElement(LibraryElementImpl library,
+      {bool dumpSummaries: false}) {
+    Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{};
+    LinkedLibrary getLinkedSummaryFor(LibraryElement lib) {
+      LibrarySerializationResult serialized = serializeLibrary(
+          lib, context.typeProvider, context.analysisOptions.strongMode);
+      for (int i = 0; i < serialized.unlinkedUnits.length; i++) {
+        unlinkedSummaries[serialized.unitUris[i]] =
+            new UnlinkedUnit.fromBuffer(serialized.unlinkedUnits[i].toBuffer());
+      }
+      return new LinkedLibrary.fromBuffer(serialized.linked.toBuffer());
+    }
+    Map<String, LinkedLibrary> linkedSummaries = <String, LinkedLibrary>{
+      library.source.uri.toString(): getLinkedSummaryFor(library)
+    };
+    for (Source source in otherLibrarySources) {
+      LibraryElement original = context.computeLibraryElement(source);
+      String uri = source.uri.toString();
+      linkedSummaries[uri] = getLinkedSummaryFor(original);
+    }
+    if (dumpSummaries) {
+      unlinkedSummaries.forEach((String path, UnlinkedUnit unit) {
+        print('Unlinked $path: ${JSON.encode(canonicalize(unit))}');
+      });
+      linkedSummaries.forEach((String path, LinkedLibrary lib) {
+        print('Linked $path: ${JSON.encode(canonicalize(lib))}');
+      });
+    }
+    return new TestSummaryResynthesizer(
+        null, context, unlinkedSummaries, linkedSummaries);
+  }
+
+  /**
+   * Resynthesize the library element associated with [uri] using
+   * [resynthesizer], and verify that it only had to consult one summary in
+   * order to do so.  [original] is consulted merely to verify that no
+   * unnecessary resynthesis work was performed.
+   */
+  LibraryElementImpl resynthesizeLibraryElement(
+      TestSummaryResynthesizer resynthesizer,
+      String uri,
+      LibraryElement original) {
+    LibraryElementImpl resynthesized = resynthesizer.getLibraryElement(uri);
+    checkMinimalResynthesisWork(resynthesizer, original);
+    return resynthesized;
+  }
+
+  test_core() {
+    addLibrary('dart:async');
+    addLibrary('dart:math');
+    String uri = 'dart:core';
+    LibraryElementImpl original =
+        context.computeLibraryElement(context.sourceFactory.forUri(uri));
+    LibraryElementImpl resynthesized = resynthesizeLibraryElement(
+        encodeLibraryElement(original), uri, original);
+    checkLibraryElements(original, resynthesized);
+  }
+}
+
+@reflectiveTest
+abstract class ResynthesizeTest extends AbstractSingleUnitTest {
   Set<Source> otherLibrarySources = new Set<Source>();
   bool constantInitializersAreInvalid = false;
 
+  bool get checkPropagatedTypes => true;
+
   void addLibrary(String uri) {
-    otherLibrarySources.add(analysisContext2.sourceFactory.forUri(uri));
+    otherLibrarySources.add(context.sourceFactory.forUri(uri));
   }
 
   void addLibrarySource(String filePath, String contents) {
-    otherLibrarySources.add(addNamedSource(filePath, contents));
+    otherLibrarySources.add(addSource(filePath, contents));
+  }
+
+  void assertNoErrors(Source source) {
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    for (AnalysisError error in context.computeErrors(source)) {
+      expect(error.source, source);
+      ErrorCode errorCode = error.errorCode;
+      if (errorCode == HintCode.UNUSED_ELEMENT ||
+          errorCode == HintCode.UNUSED_FIELD) {
+        continue;
+      }
+      if (errorCode == HintCode.UNUSED_CATCH_CLAUSE ||
+          errorCode == HintCode.UNUSED_CATCH_STACK ||
+          errorCode == HintCode.UNUSED_LOCAL_VARIABLE) {
+        continue;
+      }
+      errorListener.onError(error);
+    }
+    errorListener.assertNoErrors();
   }
 
   /**
@@ -59,16 +190,7 @@
   }
 
   void checkLibrary(String text,
-      {bool allowErrors: false, bool dumpSummaries: false}) {
-    Source source = addSource(text);
-    LibraryElementImpl original = resolve2(source);
-    LibraryElementImpl resynthesized = resynthesizeLibraryElement(
-        encodeLibrary(original,
-            allowErrors: allowErrors, dumpSummaries: dumpSummaries),
-        source.uri.toString(),
-        original);
-    checkLibraryElements(original, resynthesized);
-  }
+      {bool allowErrors: false, bool dumpSummaries: false});
 
   void checkLibraryElements(
       LibraryElementImpl original, LibraryElementImpl resynthesized) {
@@ -121,7 +243,7 @@
    * resynthesizing [library].
    */
   void checkMinimalResynthesisWork(
-      _TestSummaryResynthesizer resynthesizer, LibraryElement library) {
+      TestSummaryResynthesizer resynthesizer, LibraryElement library) {
     // Check that no other summaries needed to be resynthesized to resynthesize
     // the library element.
     expect(resynthesizer.resynthesisCount, 1);
@@ -179,57 +301,48 @@
   }
 
   void compareClassElements(
-      ClassElementImpl resynthesized, ClassElementImpl original, String desc) {
-    compareElements(resynthesized, original, desc);
-    expect(resynthesized.fields.length, original.fields.length,
-        reason: '$desc fields.length');
-    for (int i = 0; i < resynthesized.fields.length; i++) {
-      String name = original.fields[i].name;
-      compareFieldElements(
-          resynthesized.fields[i], original.fields[i], '$desc.field $name');
+      ClassElement resynthesized, ClassElement original, String desc) {
+    ClassElementImpl r = getActualElement(resynthesized, desc);
+    ClassElementImpl o = getActualElement(original, desc);
+    compareElements(r, o, desc);
+    expect(r.fields.length, o.fields.length, reason: '$desc fields.length');
+    for (int i = 0; i < r.fields.length; i++) {
+      String name = o.fields[i].name;
+      compareFieldElements(r.fields[i], o.fields[i], '$desc.field $name');
     }
-    compareTypes(
-        resynthesized.supertype, original.supertype, '$desc supertype');
-    expect(resynthesized.interfaces.length, original.interfaces.length);
-    for (int i = 0; i < resynthesized.interfaces.length; i++) {
-      compareTypes(resynthesized.interfaces[i], original.interfaces[i],
-          '$desc interface ${original.interfaces[i].name}');
+    compareTypes(r.supertype, o.supertype, '$desc supertype');
+    expect(r.interfaces.length, o.interfaces.length);
+    for (int i = 0; i < r.interfaces.length; i++) {
+      compareTypes(r.interfaces[i], o.interfaces[i],
+          '$desc interface ${o.interfaces[i].name}');
     }
-    expect(resynthesized.mixins.length, original.mixins.length);
-    for (int i = 0; i < resynthesized.mixins.length; i++) {
-      compareTypes(resynthesized.mixins[i], original.mixins[i],
-          '$desc mixin ${original.mixins[i].name}');
+    expect(r.mixins.length, o.mixins.length);
+    for (int i = 0; i < r.mixins.length; i++) {
+      compareTypes(r.mixins[i], o.mixins[i], '$desc mixin ${o.mixins[i].name}');
     }
-    expect(resynthesized.typeParameters.length, original.typeParameters.length);
-    for (int i = 0; i < resynthesized.typeParameters.length; i++) {
-      compareTypeParameterElements(
-          resynthesized.typeParameters[i],
-          original.typeParameters[i],
-          '$desc type parameter ${original.typeParameters[i].name}');
+    expect(r.typeParameters.length, o.typeParameters.length);
+    for (int i = 0; i < r.typeParameters.length; i++) {
+      compareTypeParameterElements(r.typeParameters[i], o.typeParameters[i],
+          '$desc type parameter ${o.typeParameters[i].name}');
     }
-    expect(resynthesized.constructors.length, original.constructors.length,
+    expect(r.constructors.length, o.constructors.length,
         reason: '$desc constructors.length');
-    for (int i = 0; i < resynthesized.constructors.length; i++) {
-      compareConstructorElements(
-          resynthesized.constructors[i],
-          original.constructors[i],
-          '$desc constructor ${original.constructors[i].name}');
+    for (int i = 0; i < r.constructors.length; i++) {
+      compareConstructorElements(r.constructors[i], o.constructors[i],
+          '$desc constructor ${o.constructors[i].name}');
     }
-    expect(resynthesized.accessors.length, original.accessors.length);
-    for (int i = 0; i < resynthesized.accessors.length; i++) {
-      comparePropertyAccessorElements(
-          resynthesized.accessors[i],
-          original.accessors[i],
-          '$desc accessor ${original.accessors[i].name}');
+    expect(r.accessors.length, o.accessors.length);
+    for (int i = 0; i < r.accessors.length; i++) {
+      comparePropertyAccessorElements(r.accessors[i], o.accessors[i],
+          '$desc accessor ${o.accessors[i].name}');
     }
-    expect(resynthesized.methods.length, original.methods.length);
-    for (int i = 0; i < resynthesized.methods.length; i++) {
-      compareMethodElements(resynthesized.methods[i], original.methods[i],
-          '$desc.${original.methods[i].name}');
+    expect(r.methods.length, o.methods.length);
+    for (int i = 0; i < r.methods.length; i++) {
+      compareMethodElements(
+          r.methods[i], o.methods[i], '$desc.${o.methods[i].name}');
     }
-    compareTypes(resynthesized.type, original.type, desc);
-    expect(resynthesized.hasBeenInferred, original.hasBeenInferred,
-        reason: desc);
+    compareTypes(r.type, o.type, desc);
+    expect(r.hasBeenInferred, o.hasBeenInferred, reason: desc);
   }
 
   void compareCompilationUnitElements(CompilationUnitElementImpl resynthesized,
@@ -654,8 +767,10 @@
     compareElements(resynthesized, original, desc);
     compareParameterElementLists(
         resynthesized.parameters, original.parameters, desc);
-    compareTypes(
-        resynthesized.returnType, original.returnType, '$desc return type');
+    if (checkPropagatedTypes || !original.hasImplicitReturnType) {
+      compareTypes(
+          resynthesized.returnType, original.returnType, '$desc return type');
+    }
     if (!shallow) {
       compareTypes(resynthesized.type, original.type, desc);
     }
@@ -880,7 +995,9 @@
       PropertyInducingElementImpl original,
       String desc) {
     compareVariableElements(resynthesized, original, desc);
-    compareTypes(resynthesized.propagatedType, original.propagatedType, desc);
+    if (checkPropagatedTypes) {
+      compareTypes(resynthesized.propagatedType, original.propagatedType, desc);
+    }
     if (original.getter == null) {
       expect(resynthesized.getter, isNull);
     } else {
@@ -1033,6 +1150,8 @@
     checkPossibleLocalElements(resynthesized, original);
   }
 
+  DartSdk createDartSdk() => AbstractContextTest.SHARED_MOCK_SDK;
+
   /**
    * Determine the analysis options that should be used for this test.
    */
@@ -1040,34 +1159,42 @@
       new AnalysisOptionsImpl()..enableGenericMethods = true;
 
   /**
+   * Return a [SummaryResynthesizer] to resynthesize the library with the
+   * given [librarySource].
+   */
+  SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource);
+
+  /**
    * Serialize the given [library] into a summary.  Then create a
-   * [_TestSummaryResynthesizer] which can deserialize it, along with any
+   * [TestSummaryResynthesizer] which can deserialize it, along with any
    * references it makes to `dart:core`.
    *
    * Errors will lead to a test failure unless [allowErrors] is `true`.
    */
-  _TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library,
+  TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library,
       {bool allowErrors: false, bool dumpSummaries: false}) {
     if (!allowErrors) {
       assertNoErrors(library.source);
     }
     addLibrary('dart:core');
+    addLibrary('dart:async');
+    addLibrary('dart:math');
     return encodeLibraryElement(library, dumpSummaries: dumpSummaries);
   }
 
   /**
    * Convert the library element [library] into a summary, and then create a
-   * [_TestSummaryResynthesizer] which can deserialize it.
+   * [TestSummaryResynthesizer] which can deserialize it.
    *
    * Caller is responsible for checking the library for errors, and adding any
    * dependent libraries using [addLibrary].
    */
-  _TestSummaryResynthesizer encodeLibraryElement(LibraryElementImpl library,
+  TestSummaryResynthesizer encodeLibraryElement(LibraryElementImpl library,
       {bool dumpSummaries: false}) {
     Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{};
     LinkedLibrary getLinkedSummaryFor(LibraryElement lib) {
       LibrarySerializationResult serialized = serializeLibrary(
-          lib, typeProvider, analysisContext.analysisOptions.strongMode);
+          lib, context.typeProvider, context.analysisOptions.strongMode);
       for (int i = 0; i < serialized.unlinkedUnits.length; i++) {
         unlinkedSummaries[serialized.unitUris[i]] =
             new UnlinkedUnit.fromBuffer(serialized.unlinkedUnits[i].toBuffer());
@@ -1078,7 +1205,7 @@
       library.source.uri.toString(): getLinkedSummaryFor(library)
     };
     for (Source source in otherLibrarySources) {
-      LibraryElement original = resolve2(source);
+      LibraryElement original = context.computeLibraryElement(source);
       String uri = source.uri.toString();
       linkedSummaries[uri] = getLinkedSummaryFor(original);
     }
@@ -1090,14 +1217,8 @@
         print('Linked $path: ${JSON.encode(canonicalize(lib))}');
       });
     }
-    return new _TestSummaryResynthesizer(
-        null,
-        analysisContext,
-        analysisContext.typeProvider,
-        analysisContext.sourceFactory,
-        unlinkedSummaries,
-        linkedSummaries,
-        createOptions().strongMode);
+    return new TestSummaryResynthesizer(
+        null, context, unlinkedSummaries, linkedSummaries);
   }
 
   fail_library_hasExtUri() {
@@ -1124,25 +1245,10 @@
     }
   }
 
-  /**
-   * Resynthesize the library element associated with [uri] using
-   * [resynthesizer], and verify that it only had to consult one summary in
-   * order to do so.  [original] is consulted merely to verify that no
-   * unnecessary resynthesis work was performed.
-   */
-  LibraryElementImpl resynthesizeLibraryElement(
-      _TestSummaryResynthesizer resynthesizer,
-      String uri,
-      LibraryElement original) {
-    LibraryElementImpl resynthesized = resynthesizer.getLibraryElement(uri);
-    checkMinimalResynthesisWork(resynthesizer, original);
-    return resynthesized;
-  }
-
   @override
   void setUp() {
     super.setUp();
-    resetWithOptions(createOptions());
+    prepareAnalysisContext(createOptions());
   }
 
   test_class_abstract() {
@@ -2025,6 +2131,15 @@
 ''');
   }
 
+  test_const_reference_type_functionType() {
+    checkLibrary(r'''
+typedef F();
+class C {
+  final f = <F>[];
+}
+''');
+  }
+
   test_const_reference_type_imported() {
     addLibrarySource(
         '/a.dart',
@@ -2057,6 +2172,14 @@
 ''');
   }
 
+  test_const_reference_type_typeParameter() {
+    checkLibrary(r'''
+class C<T> {
+  final f = <T>[];
+}
+''');
+  }
+
   test_const_reference_unresolved_prefix0() {
     checkLibrary(
         r'''
@@ -2548,20 +2671,6 @@
 ''');
   }
 
-  test_core() {
-    if (createOptions().strongMode) {
-      // The fake `dart:core` library is always in spec mode, so don't bother
-      // trying to check that it resynthesizes properly; it won't.
-      return;
-    }
-    String uri = 'dart:core';
-    LibraryElementImpl original =
-        resolve2(analysisContext2.sourceFactory.forUri(uri));
-    LibraryElementImpl resynthesized = resynthesizeLibraryElement(
-        encodeLibraryElement(original), uri, original);
-    checkLibraryElements(original, resynthesized);
-  }
-
   test_enum_documented() {
     checkLibrary('''
 // Extra comment so doc comment offset != 0
@@ -2712,7 +2821,7 @@
   }
 
   test_field_propagatedType_final_dep_inPart() {
-    addNamedSource('/a.dart', 'part of lib; final a = 1;');
+    addSource('/a.dart', 'part of lib; final a = 1;');
     checkLibrary('''
 library lib;
 part "a.dart";
@@ -2759,7 +2868,7 @@
   }
 
   test_function_entry_point_in_part() {
-    addNamedSource('/a.dart', 'part of my.lib; main() {}');
+    addSource('/a.dart', 'part of my.lib; main() {}');
     checkLibrary('library my.lib; part "a.dart";');
   }
 
@@ -2812,12 +2921,12 @@
   }
 
   test_function_type_parameter() {
-    resetWithOptions(createOptions()..enableGenericMethods = true);
+    prepareAnalysisContext(createOptions()..enableGenericMethods = true);
     checkLibrary('T f<T, U>(U u) => null;');
   }
 
   test_function_type_parameter_with_function_typed_parameter() {
-    resetWithOptions(createOptions()..enableGenericMethods = true);
+    prepareAnalysisContext(createOptions()..enableGenericMethods = true);
     checkLibrary('void f<T, U>(T x(U u)) {}');
   }
 
@@ -2826,7 +2935,7 @@
   }
 
   test_generic_gClass_gMethodStatic() {
-    resetWithOptions(createOptions()..enableGenericMethods = true);
+    prepareAnalysisContext(createOptions()..enableGenericMethods = true);
     checkLibrary('''
 class C<T, U> {
   static void m<V, W>(V v, W w) {
@@ -2838,73 +2947,89 @@
   }
 
   test_getElement_constructor_named() {
-    ConstructorElement original = resolve2(addSource('class C { C.named(); }'))
+    String text = 'class C { C.named(); }';
+    ConstructorElement original = context
+        .computeLibraryElement(addTestSource(text))
         .getType('C')
         .getNamedConstructor('named');
     expect(original, isNotNull);
-    ConstructorElement resynthesized = validateGetElement(original);
+    ConstructorElement resynthesized = validateGetElement(text, original);
     compareConstructorElements(resynthesized, original, 'C.constructor named');
   }
 
   test_getElement_constructor_unnamed() {
-    ConstructorElement original =
-        resolve2(addSource('class C { C(); }')).getType('C').unnamedConstructor;
+    String text = 'class C { C(); }';
+    ConstructorElement original = context
+        .computeLibraryElement(addTestSource(text))
+        .getType('C')
+        .unnamedConstructor;
     expect(original, isNotNull);
-    ConstructorElement resynthesized = validateGetElement(original);
+    ConstructorElement resynthesized = validateGetElement(text, original);
     compareConstructorElements(resynthesized, original, 'C.constructor');
   }
 
   test_getElement_field() {
-    FieldElement original =
-        resolve2(addSource('class C { var f; }')).getType('C').getField('f');
+    String text = 'class C { var f; }';
+    FieldElement original = context
+        .computeLibraryElement(addTestSource(text))
+        .getType('C')
+        .getField('f');
     expect(original, isNotNull);
-    FieldElement resynthesized = validateGetElement(original);
+    FieldElement resynthesized = validateGetElement(text, original);
     compareFieldElements(resynthesized, original, 'C.field f');
   }
 
   test_getElement_getter() {
-    PropertyAccessorElement original =
-        resolve2(addSource('class C { get f => null; }'))
-            .getType('C')
-            .getGetter('f');
+    String text = 'class C { get f => null; }';
+    PropertyAccessorElement original = context
+        .computeLibraryElement(addTestSource(text))
+        .getType('C')
+        .getGetter('f');
     expect(original, isNotNull);
-    PropertyAccessorElement resynthesized = validateGetElement(original);
+    PropertyAccessorElement resynthesized = validateGetElement(text, original);
     comparePropertyAccessorElements(resynthesized, original, 'C.getter f');
   }
 
   test_getElement_method() {
-    MethodElement original =
-        resolve2(addSource('class C { f() {} }')).getType('C').getMethod('f');
+    String text = 'class C { f() {} }';
+    MethodElement original = context
+        .computeLibraryElement(addTestSource(text))
+        .getType('C')
+        .getMethod('f');
     expect(original, isNotNull);
-    MethodElement resynthesized = validateGetElement(original);
+    MethodElement resynthesized = validateGetElement(text, original);
     compareMethodElements(resynthesized, original, 'C.method f');
   }
 
   test_getElement_operator() {
-    MethodElement original =
-        resolve2(addSource('class C { operator+(x) => null; }'))
-            .getType('C')
-            .getMethod('+');
+    String text = 'class C { operator+(x) => null; }';
+    MethodElement original = context
+        .computeLibraryElement(addTestSource(text))
+        .getType('C')
+        .getMethod('+');
     expect(original, isNotNull);
-    MethodElement resynthesized = validateGetElement(original);
+    MethodElement resynthesized = validateGetElement(text, original);
     compareMethodElements(resynthesized, original, 'C.operator+');
   }
 
   test_getElement_setter() {
-    PropertyAccessorElement original =
-        resolve2(addSource('class C { void set f(value) {} }'))
-            .getType('C')
-            .getSetter('f');
+    String text = 'class C { void set f(value) {} }';
+    PropertyAccessorElement original = context
+        .computeLibraryElement(addTestSource(text))
+        .getType('C')
+        .getSetter('f');
     expect(original, isNotNull);
-    PropertyAccessorElement resynthesized = validateGetElement(original);
+    PropertyAccessorElement resynthesized = validateGetElement(text, original);
     comparePropertyAccessorElements(resynthesized, original, 'C.setter f');
   }
 
   test_getElement_unit() {
-    Source source = addSource('class C { f() {} }');
-    CompilationUnitElement original = resolve2(source).definingCompilationUnit;
+    String text = 'class C { f() {} }';
+    Source source = addTestSource(text);
+    CompilationUnitElement original =
+        context.computeLibraryElement(source).definingCompilationUnit;
     expect(original, isNotNull);
-    CompilationUnitElement resynthesized = validateGetElement(original);
+    CompilationUnitElement resynthesized = validateGetElement(text, original);
     compareCompilationUnitElements(resynthesized, original);
   }
 
@@ -3426,7 +3551,7 @@
   }
 
   test_metadata_partDirective() {
-    addNamedSource('/foo.dart', 'part of L;');
+    addSource('/foo.dart', 'part of L;');
     checkLibrary('library L; @a part "foo.dart"; const a = null;');
   }
 
@@ -3501,17 +3626,17 @@
   }
 
   test_method_type_parameter() {
-    resetWithOptions(createOptions()..enableGenericMethods = true);
+    prepareAnalysisContext(createOptions()..enableGenericMethods = true);
     checkLibrary('class C { T f<T, U>(U u) => null; }');
   }
 
   test_method_type_parameter_in_generic_class() {
-    resetWithOptions(createOptions()..enableGenericMethods = true);
+    prepareAnalysisContext(createOptions()..enableGenericMethods = true);
     checkLibrary('class C<T, U> { V f<V, W>(T t, U u, W w) => null; }');
   }
 
   test_method_type_parameter_with_function_typed_parameter() {
-    resetWithOptions(createOptions()..enableGenericMethods = true);
+    prepareAnalysisContext(createOptions()..enableGenericMethods = true);
     checkLibrary('class C { void f<T, U>(T x(U u)) {} }');
   }
 
@@ -3644,8 +3769,8 @@
   }
 
   test_parts() {
-    addNamedSource('/a.dart', 'part of my.lib;');
-    addNamedSource('/b.dart', 'part of my.lib;');
+    addSource('/a.dart', 'part of my.lib;');
+    addSource('/b.dart', 'part of my.lib;');
     checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
   }
 
@@ -3781,26 +3906,24 @@
   }
 
   test_type_reference_lib_to_part() {
-    addNamedSource(
-        '/a.dart', 'part of l; class C {} enum E { v } typedef F();');
+    addSource('/a.dart', 'part of l; class C {} enum E { v } typedef F();');
     checkLibrary('library l; part "a.dart"; C c; E e; F f;');
   }
 
   test_type_reference_part_to_lib() {
-    addNamedSource('/a.dart', 'part of l; C c; E e; F f;');
+    addSource('/a.dart', 'part of l; C c; E e; F f;');
     checkLibrary(
         'library l; part "a.dart"; class C {} enum E { v } typedef F();');
   }
 
   test_type_reference_part_to_other_part() {
-    addNamedSource(
-        '/a.dart', 'part of l; class C {} enum E { v } typedef F();');
-    addNamedSource('/b.dart', 'part of l; C c; E e; F f;');
+    addSource('/a.dart', 'part of l; class C {} enum E { v } typedef F();');
+    addSource('/b.dart', 'part of l; C c; E e; F f;');
     checkLibrary('library l; part "a.dart"; part "b.dart";');
   }
 
   test_type_reference_part_to_part() {
-    addNamedSource('/a.dart',
+    addSource('/a.dart',
         'part of l; class C {} enum E { v } typedef F(); C c; E e; F f;');
     checkLibrary('library l; part "a.dart";');
   }
@@ -3854,22 +3977,20 @@
 
   test_type_reference_to_import_part() {
     addLibrarySource('/a.dart', 'library l; part "b.dart";');
-    addNamedSource(
-        '/b.dart', 'part of l; class C {} enum E { v } typedef F();');
+    addSource('/b.dart', 'part of l; class C {} enum E { v } typedef F();');
     checkLibrary('import "a.dart"; C c; E e; F f;');
   }
 
   test_type_reference_to_import_part2() {
     addLibrarySource('/a.dart', 'library l; part "p1.dart"; part "p2.dart";');
-    addNamedSource('/p1.dart', 'part of l; class C1 {}');
-    addNamedSource('/p2.dart', 'part of l; class C2 {}');
+    addSource('/p1.dart', 'part of l; class C1 {}');
+    addSource('/p2.dart', 'part of l; class C2 {}');
     checkLibrary('import "a.dart"; C1 c1; C2 c2;');
   }
 
   test_type_reference_to_import_part_in_subdir() {
     addLibrarySource('/a/b.dart', 'library l; part "c.dart";');
-    addNamedSource(
-        '/a/c.dart', 'part of l; class C {} enum E { v } typedef F();');
+    addSource('/a/c.dart', 'part of l; class C {} enum E { v } typedef F();');
     checkLibrary('import "a/b.dart"; C c; E e; F f;');
   }
 
@@ -3985,18 +4106,18 @@
   }
 
   test_variable_getterInLib_setterInPart() {
-    addNamedSource('/a.dart', 'part of my.lib; void set x(int _) {}');
+    addSource('/a.dart', 'part of my.lib; void set x(int _) {}');
     checkLibrary('library my.lib; part "a.dart"; int get x => 42;');
   }
 
   test_variable_getterInPart_setterInLib() {
-    addNamedSource('/a.dart', 'part of my.lib; int get x => 42;');
+    addSource('/a.dart', 'part of my.lib; int get x => 42;');
     checkLibrary('library my.lib; part "a.dart"; void set x(int _) {}');
   }
 
   test_variable_getterInPart_setterInPart() {
-    addNamedSource('/a.dart', 'part of my.lib; int get x => 42;');
-    addNamedSource('/b.dart', 'part of my.lib; void set x(int _) {}');
+    addSource('/a.dart', 'part of my.lib; int get x => 42;');
+    addSource('/b.dart', 'part of my.lib; void set x(int _) {}');
     checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
   }
 
@@ -4018,7 +4139,7 @@
   }
 
   test_variable_propagatedType_final_dep_inPart() {
-    addNamedSource('/a.dart', 'part of lib; final a = 1;');
+    addSource('/a.dart', 'part of lib; final a = 1;');
     checkLibrary('library lib; part "a.dart"; final b = a / 2;');
   }
 
@@ -4034,8 +4155,8 @@
   }
 
   test_variable_setterInPart_getterInPart() {
-    addNamedSource('/a.dart', 'part of my.lib; void set x(int _) {}');
-    addNamedSource('/b.dart', 'part of my.lib; int get x => 42;');
+    addSource('/a.dart', 'part of my.lib; void set x(int _) {}');
+    addSource('/b.dart', 'part of my.lib; int get x => 42;');
     checkLibrary('library my.lib; part "a.dart"; part "b.dart";');
   }
 
@@ -4045,11 +4166,12 @@
 
   /**
    * Encode the library containing [original] into a summary and then use
-   * [_TestSummaryResynthesizer.getElement] to retrieve just the original
+   * [TestSummaryResynthesizer.getElement] to retrieve just the original
    * element from the resynthesized summary.
    */
-  Element validateGetElement(Element original) {
-    _TestSummaryResynthesizer resynthesizer = encodeLibrary(original.library);
+  Element validateGetElement(String text, Element original) {
+    SummaryResynthesizer resynthesizer =
+        encodeDecodeLibrarySource(original.library.source);
     ElementLocationImpl location = original.location;
     Element result = resynthesizer.getElement(location);
     checkMinimalResynthesisWork(resynthesizer, original.library);
@@ -4067,7 +4189,7 @@
   }
 }
 
-class _TestSummaryResynthesizer extends SummaryResynthesizer {
+class TestSummaryResynthesizer extends SummaryResynthesizer {
   final Map<String, UnlinkedUnit> unlinkedSummaries;
   final Map<String, LinkedLibrary> linkedSummaries;
 
@@ -4083,15 +4205,10 @@
    */
   final Set<String> linkedSummariesRequested = new Set<String>();
 
-  _TestSummaryResynthesizer(
-      SummaryResynthesizer parent,
-      AnalysisContext context,
-      TypeProvider typeProvider,
-      SourceFactory sourceFactory,
-      this.unlinkedSummaries,
-      this.linkedSummaries,
-      bool strongMode)
-      : super(parent, context, typeProvider, sourceFactory, strongMode);
+  TestSummaryResynthesizer(SummaryResynthesizer parent, AnalysisContext context,
+      this.unlinkedSummaries, this.linkedSummaries)
+      : super(parent, context, context.typeProvider, context.sourceFactory,
+            context.analysisOptions.strongMode);
 
   @override
   LinkedLibrary getLinkedSummary(String uri) {
diff --git a/pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart b/pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart
new file mode 100644
index 0000000..7784cae
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart
@@ -0,0 +1,224 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.src.summary.summarize_ast_test;
+
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'summarize_ast_test.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(LinkedSummarizeAstStrongTest);
+}
+
+/**
+ * Override of [LinkedSummarizeAstTest] which uses strong mode.
+ */
+@reflectiveTest
+class LinkedSummarizeAstStrongTest extends LinkedSummarizeAstTest {
+  @override
+  bool get strongMode => true;
+
+  @override
+  test_bottom_reference_shared() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_closure_executable_with_imported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_closure_executable_with_return_type_from_closure() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_closure_executable_with_unimported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_field_formal_param_inferred_type_explicit() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_field_formal_param_inferred_type_implicit() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_field_inferred_type_nonstatic_implicit_initialized() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_field_inferred_type_nonstatic_implicit_uninitialized() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_field_inferred_type_static_implicit_initialized() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_field_propagated_type_final_immediate() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_fully_linked_references_follow_other_references() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_getter_inferred_type_nonstatic_implicit_return() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_implicit_dependencies_follow_other_dependencies() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_inferred_type_refers_to_bound_type_param() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_inferred_type_refers_to_function_typed_parameter_type_generic_class() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_inferred_type_refers_to_function_typed_parameter_type_other_lib() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_inferred_type_refers_to_method_function_typed_parameter_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_inferred_type_refers_to_setter_function_typed_parameter_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_bottom_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_imported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_return_type_from_closure() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_return_type_from_closure_field() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_return_type_from_closure_local() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_unimported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_linked_reference_reuse() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_linked_type_dependency_reuse() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_method_inferred_type_nonstatic_implicit_param() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_method_inferred_type_nonstatic_implicit_return() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_setter_inferred_type_nonstatic_implicit_param() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_setter_inferred_type_nonstatic_implicit_return() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_genericClosure() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_genericClosure_inGenericFunction() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_inGenericClass() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_inGenericFunction() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_noArguments() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_withArguments() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_variable_inferred_type_implicit_initialized() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_variable_propagated_type_final_immediate() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_variable_propagated_type_new_reference() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_variable_propagated_type_omit_dynamic() {
+    // TODO(paulberry): fix.
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/summarize_ast_test.dart b/pkg/analyzer/test/src/summary/summarize_ast_test.dart
index 4e4cc1e..60ec0cb 100644
--- a/pkg/analyzer/test/src/summary/summarize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/summarize_ast_test.dart
@@ -12,7 +12,7 @@
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary/prelink.dart';
+import 'package:analyzer/src/summary/link.dart';
 import 'package:analyzer/src/summary/summarize_ast.dart';
 import 'package:unittest/unittest.dart';
 
@@ -21,15 +21,136 @@
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(UnlinkedSummarizeAstTest);
+  runReflectiveTests(LinkedSummarizeAstSpecTest);
+}
+
+@reflectiveTest
+class LinkedSummarizeAstSpecTest extends LinkedSummarizeAstTest {
+  @override
+  bool get strongMode => false;
+
+  @override
+  test_bottom_reference_shared() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_closure_executable_with_bottom_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_closure_executable_with_imported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_closure_executable_with_return_type_from_closure() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_closure_executable_with_unimported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_field_propagated_type_final_immediate() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_fully_linked_references_follow_other_references() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_implicit_dependencies_follow_other_dependencies() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_bottom_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_imported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_return_type_from_closure() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_return_type_from_closure_field() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_return_type_from_closure_local() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_initializer_executable_with_unimported_return_type() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_linked_reference_reuse() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_linked_type_dependency_reuse() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_inGenericClass() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_inGenericFunction() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_noArguments() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_syntheticFunctionType_withArguments() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_variable_propagated_type_final_immediate() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_variable_propagated_type_new_reference() {
+    // TODO(paulberry): fix.
+  }
+
+  @override
+  test_variable_propagated_type_omit_dynamic() {
+    // TODO(paulberry): fix.
+  }
 }
 
 /**
- * Override of [SummaryTest] which creates unlinked summaries directly from the
+ * Override of [SummaryTest] which creates linked summaries directly from the
  * AST.
  */
 @reflectiveTest
-class UnlinkedSummarizeAstTest extends Object with SummaryTest {
+abstract class LinkedSummarizeAstTest extends Object with SummaryTest {
   @override
   LinkedLibrary linked;
 
@@ -49,10 +170,7 @@
   bool get expectAbsoluteUrisInDependencies => false;
 
   @override
-  bool get skipFullyLinkedData => true;
-
-  @override
-  bool get strongMode => false;
+  bool get skipFullyLinkedData => false;
 
   @override
   addNamedSource(String filePath, String contents) {
@@ -65,39 +183,36 @@
   @override
   void serializeLibraryText(String text, {bool allowErrors: false}) {
     Uri testDartUri = Uri.parse(absUri('/test.dart'));
-    String resolveToAbsoluteUri(String relativeUri) =>
-        testDartUri.resolve(relativeUri).toString();
     CompilationUnit unit = _parseText(text);
     UnlinkedUnit definingUnit =
         new UnlinkedUnit.fromBuffer(serializeAstUnlinked(unit).toBuffer());
-    UnlinkedUnit getPart(String relativeUri) {
-      String absoluteUri = resolveToAbsoluteUri(relativeUri);
-      UnlinkedUnit unit = uriToUnit[absoluteUri];
+    uriToUnit[testDartUri.toString()] = definingUnit;
+    LinkedLibrary getDependency(String absoluteUri) {
+      Map<String, LinkedLibrary> sdkLibraries =
+          SerializedMockSdk.instance.uriToLinkedLibrary;
+      LinkedLibrary linkedLibrary = sdkLibraries[absoluteUri];
+      if (linkedLibrary == null && !allowMissingFiles) {
+        fail('Linker unexpectedly requested LinkedLibrary for "$absoluteUri".'
+            '  Libraries available: ${sdkLibraries.keys}');
+      }
+      return linkedLibrary;
+    }
+    UnlinkedUnit getUnit(String absoluteUri) {
+      UnlinkedUnit unit = uriToUnit[absoluteUri] ??
+          SerializedMockSdk.instance.uriToUnlinkedUnit[absoluteUri];
       if (unit == null && !allowMissingFiles) {
-        fail('Prelinker unexpectedly requested unit for "$relativeUri"'
-            ' (resolves to "$absoluteUri").');
+        fail('Linker unexpectedly requested unit for "$absoluteUri".');
       }
       return unit;
     }
-    UnlinkedPublicNamespace getImport(String relativeUri) {
-      String absoluteUri = resolveToAbsoluteUri(relativeUri);
-      UnlinkedPublicNamespace namespace = sdkPublicNamespace[absoluteUri];
-      if (namespace == null) {
-        namespace = uriToUnit[absoluteUri]?.publicNamespace;
-      }
-      if (namespace == null && !allowMissingFiles) {
-        fail('Prelinker unexpectedly requested namespace for "$relativeUri"'
-            ' (resolves to "$absoluteUri").'
-            '  Namespaces available: ${uriToUnit.keys}');
-      }
-      return namespace;
-    }
-    linked = new LinkedLibrary.fromBuffer(
-        prelink(definingUnit, getPart, getImport).toBuffer());
+    linked = link(uriToUnit.keys.toSet(), getDependency, getUnit)[
+        testDartUri.toString()];
+    expect(linked, isNotNull);
     validateLinkedLibrary(linked);
     unlinkedUnits = <UnlinkedUnit>[definingUnit];
     for (String relativeUri in definingUnit.publicNamespace.parts) {
-      UnlinkedUnit unit = uriToUnit[resolveToAbsoluteUri(relativeUri)];
+      UnlinkedUnit unit = uriToUnit[
+          resolveRelativeUri(testDartUri, Uri.parse(relativeUri)).toString()];
       if (unit == null) {
         if (!allowMissingFiles) {
           fail('Test referred to unknown unit $relativeUri');
@@ -108,6 +223,13 @@
     }
   }
 
+  test_class_no_superclass() {
+    UnlinkedClass cls = serializeClassText('part of dart.core; class Object {}',
+        className: 'Object');
+    expect(cls.supertype, isNull);
+    expect(cls.hasNoSupertype, isTrue);
+  }
+
   CompilationUnit _parseText(String text) {
     CharSequenceReader reader = new CharSequenceReader(text);
     Scanner scanner =
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index ae3d8ec..c690ab8 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -26,40 +26,6 @@
 import '../../generated/analysis_context_factory.dart';
 
 /**
- * The public namespaces of the sdk are computed once so that we don't bog
- * down the test.  Structured as a map from absolute URI to the corresponding
- * public namespace.
- *
- * Note: should an exception occur during computation of this variable, it
- * will silently be set to null to allow other tests to run.
- */
-final Map<String, UnlinkedPublicNamespace> sdkPublicNamespace = () {
-  try {
-    AnalysisContext analysisContext = AnalysisContextFactory.contextWithCore();
-    Map<String, UnlinkedPublicNamespace> uriToNamespace =
-        <String, UnlinkedPublicNamespace>{};
-    List<LibraryElement> libraries = [
-      analysisContext.typeProvider.objectType.element.library,
-      analysisContext.typeProvider.futureType.element.library
-    ];
-    for (LibraryElement library in libraries) {
-      summarize_elements.LibrarySerializationResult serializedLibrary =
-          summarize_elements.serializeLibrary(
-              library, analysisContext.typeProvider, false);
-      for (int i = 0; i < serializedLibrary.unlinkedUnits.length; i++) {
-        uriToNamespace[serializedLibrary.unitUris[i]] =
-            new UnlinkedUnit.fromBuffer(
-                    serializedLibrary.unlinkedUnits[i].toBuffer())
-                .publicNamespace;
-      }
-    }
-    return uriToNamespace;
-  } catch (_) {
-    return null;
-  }
-}();
-
-/**
  * Convert a summary object (or a portion of one) into a canonical form that
  * can be easily compared using [expect].  If [orderByName] is true, and the
  * object is a [List], it is sorted by the `name` field of its elements.
@@ -116,6 +82,51 @@
 typedef void _EntityRefValidator(EntityRef entityRef);
 
 /**
+ * [SerializedMockSdk] is a singleton class representing the result of
+ * serializing the mock SDK to summaries.  It is computed once and then shared
+ * among test invocations so that we don't bog down the tests.
+ *
+ * Note: should an exception occur during computation of [instance], it will
+ * silently be set to null to allow other tests to complete quickly.
+ */
+class SerializedMockSdk {
+  static final SerializedMockSdk instance = _serializeMockSdk();
+
+  final Map<String, UnlinkedUnit> uriToUnlinkedUnit;
+
+  final Map<String, LinkedLibrary> uriToLinkedLibrary;
+  SerializedMockSdk._(this.uriToUnlinkedUnit, this.uriToLinkedLibrary);
+
+  static SerializedMockSdk _serializeMockSdk() {
+    try {
+      AnalysisContext analysisContext =
+          AnalysisContextFactory.contextWithCore();
+      Map<String, UnlinkedUnit> uriToUnlinkedUnit = <String, UnlinkedUnit>{};
+      Map<String, LinkedLibrary> uriToLinkedLibrary = <String, LinkedLibrary>{};
+      List<LibraryElement> libraries = [
+        analysisContext.typeProvider.objectType.element.library,
+        analysisContext.typeProvider.futureType.element.library
+      ];
+      for (LibraryElement library in libraries) {
+        summarize_elements.LibrarySerializationResult serializedLibrary =
+            summarize_elements.serializeLibrary(
+                library, analysisContext.typeProvider, false);
+        uriToLinkedLibrary[library.source.uri.toString()] =
+            new LinkedLibrary.fromBuffer(serializedLibrary.linked.toBuffer());
+        for (int i = 0; i < serializedLibrary.unlinkedUnits.length; i++) {
+          uriToUnlinkedUnit[serializedLibrary.unitUris[i]] =
+              new UnlinkedUnit.fromBuffer(
+                  serializedLibrary.unlinkedUnits[i].toBuffer());
+        }
+      }
+      return new SerializedMockSdk._(uriToUnlinkedUnit, uriToLinkedLibrary);
+    } catch (_) {
+      return null;
+    }
+  }
+}
+
+/**
  * Base class containing most summary tests.  This allows summary tests to be
  * re-used to exercise all the different ways in which summaries can be
  * generated (e.g. direct from the AST, from the element model, from a
@@ -200,6 +211,21 @@
     ]);
   }
 
+  void checkConstCycle(String className,
+      {String name: '', bool hasCycle: true}) {
+    UnlinkedClass cls = findClass(className);
+    int constCycleSlot =
+        findExecutable(name, executables: cls.executables).constCycleSlot;
+    expect(constCycleSlot, isNot(0));
+    if (!skipFullyLinkedData) {
+      expect(
+          definingUnit.constCycles,
+          hasCycle
+              ? contains(constCycleSlot)
+              : isNot(contains(constCycleSlot)));
+    }
+  }
+
   /**
    * Verify that the [dependency]th element of the dependency table represents
    * a file reachable via the given [absoluteUri] and [relativeUri].
@@ -2604,6 +2630,82 @@
     ]);
   }
 
+  test_constExpr_pushReference_enumValue() {
+    UnlinkedVariable variable = serializeVariableText('''
+enum C {V1, V2, V3}
+const v = C.V1;
+''');
+    _assertUnlinkedConst(variable.constExpr, operators: [
+      UnlinkedConstOperation.pushReference
+    ], referenceValidators: [
+      (EntityRef r) => checkTypeRef(r, null, null, 'V1',
+              expectedKind: ReferenceKind.propertyAccessor,
+              prefixExpectations: [
+                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
+              ])
+    ]);
+  }
+
+  test_constExpr_pushReference_enumValue_viaImport() {
+    addNamedSource(
+        '/a.dart',
+        '''
+enum C {V1, V2, V3}
+''');
+    UnlinkedVariable variable = serializeVariableText('''
+import 'a.dart';
+const v = C.V1;
+''');
+    _assertUnlinkedConst(variable.constExpr, operators: [
+      UnlinkedConstOperation.pushReference
+    ], referenceValidators: [
+      (EntityRef r) => checkTypeRef(r, null, null, 'V1',
+              expectedKind: ReferenceKind.propertyAccessor,
+              prefixExpectations: [
+                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+              ])
+    ]);
+  }
+
+  test_constExpr_pushReference_enumValues() {
+    UnlinkedVariable variable = serializeVariableText('''
+enum C {V1, V2, V3}
+const v = C.values;
+''');
+    _assertUnlinkedConst(variable.constExpr, operators: [
+      UnlinkedConstOperation.pushReference
+    ], referenceValidators: [
+      (EntityRef r) => checkTypeRef(r, null, null, 'values',
+              expectedKind: ReferenceKind.propertyAccessor,
+              prefixExpectations: [
+                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
+              ])
+    ]);
+  }
+
+  test_constExpr_pushReference_enumValues_viaImport() {
+    addNamedSource(
+        '/a.dart',
+        '''
+enum C {V1, V2, V3}
+''');
+    UnlinkedVariable variable = serializeVariableText('''
+import 'a.dart';
+const v = C.values;
+''');
+    _assertUnlinkedConst(variable.constExpr, operators: [
+      UnlinkedConstOperation.pushReference
+    ], referenceValidators: [
+      (EntityRef r) => checkTypeRef(r, null, null, 'values',
+              expectedKind: ReferenceKind.propertyAccessor,
+              prefixExpectations: [
+                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+              ])
+    ]);
+  }
+
   test_constExpr_pushReference_field() {
     UnlinkedVariable variable = serializeVariableText('''
 class C {
@@ -3338,6 +3440,7 @@
     expect(parameter.kind, UnlinkedParamKind.named);
     expect(parameter.initializer, isNotNull);
     expect(parameter.defaultValueCode, '42');
+    _assertCodeRange(parameter.codeRange, 13, 10);
     _assertUnlinkedConst(parameter.defaultValue,
         operators: [UnlinkedConstOperation.pushInt], ints: [42]);
   }
@@ -3369,6 +3472,7 @@
     expect(parameter.kind, UnlinkedParamKind.positional);
     expect(parameter.initializer, isNotNull);
     expect(parameter.defaultValueCode, '42');
+    _assertCodeRange(parameter.codeRange, 13, 11);
     _assertUnlinkedConst(parameter.defaultValue,
         operators: [UnlinkedConstOperation.pushInt], ints: [42]);
   }
@@ -3413,6 +3517,7 @@
     expect(executable.nameOffset, text.indexOf('foo'));
     expect(executable.periodOffset, text.indexOf('.foo'));
     expect(executable.nameEnd, text.indexOf('()'));
+    _assertCodeRange(executable.codeRange, 10, 8);
   }
 
   test_constructor_non_const() {
@@ -3820,17 +3925,9 @@
   const E() : x = null;
 }
 ''');
-    int classCConstCycleSlot = findClass('C').executables[0].constCycleSlot;
-    expect(classCConstCycleSlot, isNot(0));
-    int classDConstCycleSlot = findClass('D').executables[0].constCycleSlot;
-    expect(classDConstCycleSlot, isNot(0));
-    int classEConstCycleSlot = findClass('E').executables[0].constCycleSlot;
-    expect(classEConstCycleSlot, isNot(0));
-    if (!skipFullyLinkedData) {
-      expect(definingUnit.constCycles, contains(classCConstCycleSlot));
-      expect(definingUnit.constCycles, contains(classDConstCycleSlot));
-      expect(definingUnit.constCycles, isNot(contains(classEConstCycleSlot)));
-    }
+    checkConstCycle('C');
+    checkConstCycle('D');
+    checkConstCycle('E', hasCycle: false);
   }
 
   test_constructor_withCycles_nonConst() {
@@ -3848,6 +3945,516 @@
     expect(findClass('D').executables[0].constCycleSlot, 0);
   }
 
+  test_constructorCycle_redirectToImplicitConstructor() {
+    serializeLibraryText(
+        '''
+class C {
+  const factory C() = D;
+}
+class D extends C {}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_redirectToNonConstConstructor() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    serializeLibraryText(
+        '''
+class C {
+  const factory C() = D;
+}
+class D extends C {
+  D();
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_redirectToSymbolConstructor() {
+    // The symbol constructor has some special case behaviors in analyzer.
+    // Make sure those special case behaviors don't cause problems.
+    serializeLibraryText(
+        '''
+class C {
+  const factory C(String name) = Symbol;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToClass() {
+    serializeLibraryText('''
+class C {
+  final x;
+  const C() : x = C;
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToEnum() {
+    serializeLibraryText('''
+enum E { v }
+class C {
+  final x;
+  const C() : x = E;
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToEnumValue() {
+    serializeLibraryText('''
+enum E { v }
+class C {
+  final x;
+  const C() : x = E.v;
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToEnumValues() {
+    serializeLibraryText('''
+enum E { v }
+class C {
+  final x;
+  const C() : x = E.values;
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToGenericParameter() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    serializeLibraryText(
+        '''
+class C<T> {
+  final x;
+  const C() : x = T;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToGenericParameter_asSupertype() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    serializeLibraryText(
+        '''
+class C<T> extends T {
+  const C();
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToStaticMethod_inOtherClass() {
+    serializeLibraryText('''
+class C {
+  final x;
+  const C() : x = D.f;
+}
+class D {
+  static void f() {}
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToStaticMethod_inSameClass() {
+    serializeLibraryText('''
+class C {
+  final x;
+  static void f() {}
+  const C() : x = f;
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToTopLevelFunction() {
+    serializeLibraryText('''
+void f() {}
+class C {
+  final x;
+  const C() : x = f;
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToTypedef() {
+    serializeLibraryText('''
+typedef F();
+class C {
+  final x;
+  const C() : x = F;
+}
+''');
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToUndefinedName() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    serializeLibraryText(
+        '''
+class C {
+  final x;
+  const C() : x = foo;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToUndefinedName_viaPrefix() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    addNamedSource('/a.dart', '');
+    serializeLibraryText(
+        '''
+import 'a.dart' as a;
+class C {
+  final x;
+  const C() : x = a.foo;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_referenceToUndefinedName_viaPrefix_nonExistentFile() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    allowMissingFiles = true;
+    serializeLibraryText(
+        '''
+import 'a.dart' as a;
+class C {
+  final x;
+  const C() : x = a.foo;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_trivial() {
+    serializeLibraryText(
+        '''
+class C {
+  const C() : this();
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaFactoryRedirect() {
+    serializeLibraryText(
+        '''
+class C {
+  const C();
+  const factory C.named() = D;
+}
+class D extends C {
+  final x;
+  const D() : x = y;
+}
+const y = const C.named();
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+    checkConstCycle('C', name: 'named');
+    checkConstCycle('D');
+  }
+
+  test_constructorCycle_viaFinalField() {
+    serializeLibraryText(
+        '''
+class C {
+  final x = const C();
+  const C();
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaLength() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    serializeLibraryText(
+        '''
+class C {
+  final x;
+  const C() : x = y.length;
+}
+const y = const C();
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaNamedConstructor() {
+    serializeLibraryText('''
+class C {
+  final x;
+  const C() : x = const D.named();
+}
+class D {
+  final x;
+  const D.named() : x = const C();
+}
+''');
+    checkConstCycle('C');
+    checkConstCycle('D', name: 'named');
+  }
+
+  test_constructorCycle_viaOrdinaryRedirect() {
+    serializeLibraryText('''
+class C {
+  final x;
+  const C() : this.named();
+  const C.named() : x = const C();
+}
+''');
+    checkConstCycle('C');
+    checkConstCycle('C', name: 'named');
+  }
+
+  test_constructorCycle_viaOrdinaryRedirect_suppressSupertype() {
+    // Since C redirects to C.named, it doesn't implicitly refer to B's unnamed
+    // constructor.  Therefore there is no cycle.
+    serializeLibraryText('''
+class B {
+  final x;
+  const B() : x = const C();
+  const B.named() : x = null;
+}
+class C extends B {
+  const C() : this.named();
+  const C.named() : super.named();
+}
+''');
+    checkConstCycle('B', hasCycle: false);
+    checkConstCycle('B', name: 'named', hasCycle: false);
+    checkConstCycle('C', hasCycle: false);
+    checkConstCycle('C', name: 'named', hasCycle: false);
+  }
+
+  test_constructorCycle_viaRedirectArgument() {
+    serializeLibraryText(
+        '''
+class C {
+  final x;
+  const C() : this.named(y);
+  const C.named(this.x);
+}
+const y = const C();
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+    checkConstCycle('C', name: 'named', hasCycle: false);
+  }
+
+  test_constructorCycle_viaStaticField_inOtherClass() {
+    serializeLibraryText(
+        '''
+class C {
+  final x;
+  const C() : x = D.y;
+}
+class D {
+  static const y = const C();
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaStaticField_inSameClass() {
+    serializeLibraryText(
+        '''
+class C {
+  final x;
+  static const y = const C();
+  const C() : x = y;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaSuperArgument() {
+    serializeLibraryText(
+        '''
+class B {
+  final x;
+  const B(this.x);
+}
+class C extends B {
+  const C() : super(y);
+}
+const y = const C();
+''',
+        allowErrors: true);
+    checkConstCycle('B', hasCycle: false);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaSupertype() {
+    serializeLibraryText('''
+class C {
+  final x;
+  const C() : x = const D();
+}
+class D extends C {
+  const D();
+}
+''');
+    checkConstCycle('C');
+    checkConstCycle('D');
+  }
+
+  test_constructorCycle_viaSupertype_Enum() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    serializeLibraryText(
+        '''
+enum E { v }
+class C extends E {
+  const C();
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+  }
+
+  test_constructorCycle_viaSupertype_explicit() {
+    serializeLibraryText('''
+class C {
+  final x;
+  const C() : x = const D();
+  const C.named() : x = const D.named();
+}
+class D extends C {
+  const D() : super();
+  const D.named() : super.named();
+}
+''');
+    checkConstCycle('C');
+    checkConstCycle('C', name: 'named');
+    checkConstCycle('D');
+    checkConstCycle('D', name: 'named');
+  }
+
+  test_constructorCycle_viaSupertype_explicit_undefined() {
+    // It's not valid Dart but we need to make sure it doesn't crash
+    // summary generation.
+    serializeLibraryText(
+        '''
+class C {
+  final x;
+  const C() : x = const D();
+}
+class D extends C {
+  const D() : super.named();
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C', hasCycle: false);
+    checkConstCycle('D', hasCycle: false);
+  }
+
+  test_constructorCycle_viaSupertype_withDefaultTypeArgument() {
+    serializeLibraryText('''
+class C<T> {
+  final x;
+  const C() : x = const D();
+}
+class D extends C {
+  const D();
+}
+''');
+    checkConstCycle('C');
+    checkConstCycle('D');
+  }
+
+  test_constructorCycle_viaSupertype_withTypeArgument() {
+    serializeLibraryText('''
+class C<T> {
+  final x;
+  const C() : x = const D();
+}
+class D extends C<int> {
+  const D();
+}
+''');
+    checkConstCycle('C');
+    checkConstCycle('D');
+  }
+
+  test_constructorCycle_viaTopLevelVariable() {
+    serializeLibraryText(
+        '''
+class C {
+  final x;
+  const C() : x = y;
+}
+const y = const C();
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaTopLevelVariable_imported() {
+    addNamedSource(
+        '/a.dart',
+        '''
+import 'test.dart';
+const y = const C();
+    ''');
+    serializeLibraryText(
+        '''
+import 'a.dart';
+class C {
+  final x;
+  const C() : x = y;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
+  test_constructorCycle_viaTopLevelVariable_importedViaPrefix() {
+    addNamedSource(
+        '/a.dart',
+        '''
+import 'test.dart';
+const y = const C();
+    ''');
+    serializeLibraryText(
+        '''
+import 'a.dart' as a;
+class C {
+  final x;
+  const C() : x = a.y;
+}
+''',
+        allowErrors: true);
+    checkConstCycle('C');
+  }
+
   test_dependencies_export_to_export_unused() {
     addNamedSource('/a.dart', 'export "b.dart";');
     addNamedSource('/b.dart', '');
@@ -4021,6 +4628,19 @@
         ReferenceKind.classOrEnum);
     expect(unlinkedUnits[0].publicNamespace.names[0].name, 'E');
     expect(unlinkedUnits[0].publicNamespace.names[0].numTypeParameters, 0);
+    expect(unlinkedUnits[0].publicNamespace.names[0].members, hasLength(2));
+    expect(unlinkedUnits[0].publicNamespace.names[0].members[0].kind,
+        ReferenceKind.propertyAccessor);
+    expect(unlinkedUnits[0].publicNamespace.names[0].members[0].name, 'values');
+    expect(
+        unlinkedUnits[0].publicNamespace.names[0].members[0].numTypeParameters,
+        0);
+    expect(unlinkedUnits[0].publicNamespace.names[0].members[1].kind,
+        ReferenceKind.propertyAccessor);
+    expect(unlinkedUnits[0].publicNamespace.names[0].members[1].name, 'v1');
+    expect(
+        unlinkedUnits[0].publicNamespace.names[0].members[1].numTypeParameters,
+        0);
   }
 
   test_enum_documented() {
@@ -4060,6 +4680,13 @@
     checkDocumentationComment(value.documentationComment, text);
   }
 
+  test_enum_value_private() {
+    serializeEnumText('enum E { _v }', 'E');
+    expect(unlinkedUnits[0].publicNamespace.names, hasLength(1));
+    expect(unlinkedUnits[0].publicNamespace.names[0].members, hasLength(1));
+    expect(unlinkedUnits[0].publicNamespace.names[0].members[0].name, 'values');
+  }
+
   test_executable_abstract() {
     UnlinkedExecutable executable =
         serializeClassText('abstract class C { f(); }').executables[0];
@@ -4198,12 +4825,14 @@
   bbb: switch (42) {
     ccc: case 0:
       break;
+    ddd: default:
+      break;
   }
 }
 ''';
     UnlinkedExecutable executable = serializeExecutableText(code);
     List<UnlinkedLabel> labels = executable.localLabels;
-    expect(labels, hasLength(3));
+    expect(labels, hasLength(4));
     {
       UnlinkedLabel aaa = labels.singleWhere((l) => l.name == 'aaa');
       expect(aaa, isNotNull);
@@ -4222,6 +4851,12 @@
       expect(ccc.isOnSwitchMember, isTrue);
       expect(ccc.isOnSwitchStatement, isFalse);
     }
+    {
+      UnlinkedLabel ccc = labels.singleWhere((l) => l.name == 'ddd');
+      expect(ccc, isNotNull);
+      expect(ccc.isOnSwitchMember, isTrue);
+      expect(ccc.isOnSwitchStatement, isFalse);
+    }
   }
 
   test_executable_localLabels_inTopLevelGetter() {
@@ -4249,6 +4884,56 @@
     }
   }
 
+  test_executable_localLabels_namedExpressionLabel() {
+    String code = r'''
+f() {
+  foo(p: 42);
+}
+foo({int p}) {}
+''';
+    UnlinkedExecutable executable = serializeExecutableText(code);
+    List<UnlinkedLabel> labels = executable.localLabels;
+    expect(labels, isEmpty);
+  }
+
+  test_executable_localVariables_catch() {
+    String code = r'''
+f() { // 1
+  try {
+    throw 42;
+  } on int catch (e, st) { // 2
+    print(e);
+    print(st);
+  } // 3
+} // 4
+''';
+    UnlinkedExecutable executable = serializeExecutableText(code);
+    List<UnlinkedVariable> variables = executable.localVariables;
+    expect(variables, hasLength(2));
+    {
+      UnlinkedVariable e = variables.singleWhere((v) => v.name == 'e');
+      _assertVariableVisible(code, e, 'on int catch (', '} // 3');
+      checkTypeRef(e.type, 'dart:core', 'dart:core', 'int');
+    }
+    {
+      UnlinkedVariable st = variables.singleWhere((v) => v.name == 'st');
+      _assertVariableVisible(code, st, 'on int catch (', '} // 3');
+    }
+  }
+
+  test_executable_localVariables_catch_noVariables() {
+    String code = r'''
+f() {
+  try {
+    throw 42;
+  } on int {}
+}
+''';
+    UnlinkedExecutable executable = serializeExecutableText(code);
+    List<UnlinkedVariable> variables = executable.localVariables;
+    expect(variables, isEmpty);
+  }
+
   test_executable_localVariables_empty() {
     UnlinkedExecutable executable = serializeExecutableText(r'''
 f() {
@@ -4257,6 +4942,58 @@
     expect(executable.localVariables, isEmpty);
   }
 
+  test_executable_localVariables_forEachLoop() {
+    String code = r'''
+f() { // 1
+  for (int i in <int>[]) { // 2
+    print(i);
+  } // 3
+} // 4
+''';
+    UnlinkedExecutable executable = serializeExecutableText(code);
+    List<UnlinkedVariable> variables = executable.localVariables;
+    expect(variables, hasLength(1));
+    {
+      UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i');
+      _assertVariableVisible(code, i, 'for', '} // 3');
+      checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+    }
+  }
+
+  test_executable_localVariables_forLoop() {
+    String code = r'''
+f() { // 1
+  for (int i = 0, j = 0; i < 10; i++, j++) { // 2
+    print(i);
+  } // 3
+} // 4
+''';
+    UnlinkedExecutable executable = serializeExecutableText(code);
+    List<UnlinkedVariable> variables = executable.localVariables;
+    expect(variables, hasLength(2));
+    {
+      UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i');
+      _assertVariableVisible(code, i, 'for', '} // 3');
+      checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+    }
+    {
+      UnlinkedVariable i = variables.singleWhere((v) => v.name == 'j');
+      _assertVariableVisible(code, i, 'for', '} // 3');
+      checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+    }
+  }
+
+  test_executable_localVariables_forLoop_noVariables() {
+    String code = r'''
+f() {
+  for (; true;) {}
+}
+''';
+    UnlinkedExecutable executable = serializeExecutableText(code);
+    List<UnlinkedVariable> variables = executable.localVariables;
+    expect(variables, isEmpty);
+  }
+
   test_executable_localVariables_inConstructor() {
     String code = r'''
 class C {
@@ -4521,6 +5258,14 @@
     expect(executable.isExternal, false);
   }
 
+  test_executable_operator_abstract() {
+    UnlinkedExecutable executable =
+        serializeClassText('class C { C operator+(C c); }', allowErrors: true)
+            .executables[0];
+    expect(executable.isAbstract, true);
+    expect(executable.isExternal, false);
+  }
+
   test_executable_operator_equal() {
     UnlinkedExecutable executable = serializeClassText(
             'class C { bool operator==(Object other) => false; }')
@@ -4532,6 +5277,7 @@
     UnlinkedExecutable executable =
         serializeClassText('class C { external C operator+(C c); }')
             .executables[0];
+    expect(executable.isAbstract, false);
     expect(executable.isExternal, true);
   }
 
@@ -4677,6 +5423,7 @@
     expect(param.kind, UnlinkedParamKind.named);
     expect(param.initializer, isNotNull);
     expect(param.defaultValueCode, '42');
+    _assertCodeRange(param.codeRange, 3, 5);
     _assertUnlinkedConst(param.defaultValue,
         operators: [UnlinkedConstOperation.pushInt], ints: [42]);
   }
@@ -4696,6 +5443,7 @@
     expect(param.kind, UnlinkedParamKind.positional);
     expect(param.initializer, isNotNull);
     expect(param.defaultValueCode, '42');
+    _assertCodeRange(param.codeRange, 3, 6);
     _assertUnlinkedConst(param.defaultValue,
         operators: [UnlinkedConstOperation.pushInt], ints: [42]);
   }
@@ -5145,6 +5893,18 @@
     _assertUnlinkedConst(variable.constExpr, isInvalid: true);
   }
 
+  test_field_final_typeParameter() {
+    UnlinkedVariable variable = serializeClassText(r'''
+class C<T> {
+  final f = <T>[];
+}''').fields[0];
+    expect(variable.isFinal, isTrue);
+    _assertUnlinkedConst(variable.constExpr,
+        operators: [UnlinkedConstOperation.makeTypedList],
+        ints: [0],
+        referenceValidators: [(EntityRef r) => checkParamTypeRef(r, 1)]);
+  }
+
   test_field_formal_param_inferred_type_explicit() {
     UnlinkedClass cls = serializeClassText(
         'class C extends D { var v; C(int this.v); }'
@@ -6600,14 +7360,12 @@
 final v = f() ? /*<T>*/(T t) => 0 : /*<T>*/(T t) => 1;
 bool f() => true;
 ''');
-    // The inferred type of `v` is currently `(Object) -> int` due to
-    // dartbug.com/25802.  TODO(paulberry): fix this test when the bug is fixed.
     EntityRef inferredType = getTypeRefForSlot(variable.inferredTypeSlot);
     checkLinkedTypeRef(
         inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
     expect(inferredType.syntheticParams, hasLength(1));
-    checkLinkedTypeRef(inferredType.syntheticParams[0].type, 'dart:core',
-        'dart:core', 'Object');
+    checkLinkedTypeRef(
+        inferredType.syntheticParams[0].type, null, null, '*bottom*');
   }
 
   test_syntheticFunctionType_genericClosure_inGenericFunction() {
@@ -6628,16 +7386,14 @@
   final v = b ? /*<V>*/(T t, U u, V v) => 0 : /*<V>*/(T t, U u, V v) => 1;
 }
 ''').localVariables[0];
-    // The inferred type of `v` is currently `(T, U, Object) -> int` due to
-    // dartbug.com/25802.  TODO(paulberry): fix this test when the bug is fixed.
     EntityRef inferredType = getTypeRefForSlot(variable.inferredTypeSlot);
     checkLinkedTypeRef(
         inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
     expect(inferredType.syntheticParams, hasLength(3));
     checkParamTypeRef(inferredType.syntheticParams[0].type, 2);
     checkParamTypeRef(inferredType.syntheticParams[1].type, 1);
-    checkLinkedTypeRef(inferredType.syntheticParams[2].type, 'dart:core',
-        'dart:core', 'Object');
+    checkLinkedTypeRef(
+        inferredType.syntheticParams[2].type, null, null, '*bottom*');
   }
 
   test_syntheticFunctionType_inGenericClass() {
diff --git a/pkg/analyzer/test/src/summary/test_all.dart b/pkg/analyzer/test/src/summary/test_all.dart
index 08af93d..0943a6e 100644
--- a/pkg/analyzer/test/src/summary/test_all.dart
+++ b/pkg/analyzer/test/src/summary/test_all.dart
@@ -8,10 +8,12 @@
 
 import '../../utils.dart';
 import 'flat_buffers_test.dart' as flat_buffers_test;
+import 'in_summary_source_test.dart' as in_summary_source_test;
 import 'incremental_cache_test.dart' as incremental_cache_test;
 import 'index_unit_test.dart' as index_unit_test;
 import 'name_filter_test.dart' as name_filter_test;
 import 'prelinker_test.dart' as prelinker_test;
+import 'resynthesize_ast_test.dart' as resynthesize_ast_test;
 import 'resynthesize_strong_test.dart' as resynthesize_strong_test;
 import 'resynthesize_test.dart' as resynthesize_test;
 import 'summarize_ast_test.dart' as summarize_ast_test;
@@ -23,10 +25,12 @@
   initializeTestEnvironment();
   group('summary tests', () {
     flat_buffers_test.main();
+    in_summary_source_test.main();
     incremental_cache_test.main();
     index_unit_test.main();
     name_filter_test.main();
     prelinker_test.main();
+    resynthesize_ast_test.main();
     resynthesize_strong_test.main();
     resynthesize_test.main();
     summarize_ast_test.main();
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index 205dc90..c07689b 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -1076,17 +1076,14 @@
 
 @reflectiveTest
 class BuildTypeProviderTaskTest_noAsync extends _AbstractDartTaskTest {
+  DartSdk createDartSdk() => new MockSdk(dartAsync: false);
+
   void prepareAnalysisContext([AnalysisOptions options]) {
     AnalysisOptionsImpl newOptions = new AnalysisOptionsImpl();
     newOptions.enableAsync = false;
     super.prepareAnalysisContext(newOptions);
   }
 
-  void setUp() {
-    sdk = new MockSdk(dartAsync: false);
-    super.setUp();
-  }
-
   test_perform_noAsync() {
     expect(context, isNotNull);
     computeResult(AnalysisContextTarget.request, TYPE_PROVIDER,
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index 03a2579..77e2990 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -67,16 +67,6 @@
     expect(analysisOptions.enableAsync, false);
   }
 
-  test_configure_enableGenericMethods() {
-    expect(analysisOptions.enableGenericMethods, false);
-    configureContext('''
-analyzer:
-  language:
-    enableGenericMethods: true
-''');
-    expect(analysisOptions.enableGenericMethods, true);
-  }
-
   test_configure_enableConditionalDirectives() {
     expect(analysisOptions.enableConditionalDirectives, false);
     configureContext('''
@@ -87,13 +77,14 @@
     expect(analysisOptions.enableConditionalDirectives, true);
   }
 
-  test_configure_enableSuperMixins() {
+  test_configure_enableGenericMethods() {
+    expect(analysisOptions.enableGenericMethods, false);
     configureContext('''
 analyzer:
   language:
-    enableSuperMixins: true
+    enableGenericMethods: true
 ''');
-    expect(analysisOptions.enableSuperMixins, true);
+    expect(analysisOptions.enableGenericMethods, true);
   }
 
   test_configure_enableStrictCallChecks() {
@@ -105,6 +96,15 @@
     expect(analysisOptions.enableStrictCallChecks, true);
   }
 
+  test_configure_enableSuperMixins() {
+    configureContext('''
+analyzer:
+  language:
+    enableSuperMixins: true
+''');
+    expect(analysisOptions.enableSuperMixins, true);
+  }
+
   test_configure_error_processors() {
     configureContext('''
 analyzer:
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 8c4eb3c..cff8782 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -28,16 +28,22 @@
           Comparator<K> _comparator;
           _Predicate _validKey;
 
-          // TODO(rnystrom): Initializing _comparator should have a cast, since
-          // K may not always be Comparable. It doesn't currently get one
-          // because we're using the spec's LUB on function types, which isn't
-          // sound.
+          // The warning on assigning to _comparator is legitimate. Since K has
+          // no bound, all we know is that it's object. _comparator's function
+          // type is effectively:              (Object, Object) -> int
+          // We are assigning it a fn of type: (Comparable, Comparable) -> int
+          // There's no telling if that will work. For example, consider:
+          //
+          //     new SplayTreeMap<Uri>();
+          //
+          // This would end up calling .compareTo() on a Uri, which doesn't
+          // define that since it doesn't implement Comparable.
           SplayTreeMap([int compare(K key1, K key2),
                         bool isValidKey(potentialKey)])
-            : _comparator = (compare == null) ? Comparable.compare : compare,
+            : _comparator = /*warning:DOWN_CAST_COMPOSITE*/(compare == null) ? Comparable.compare : compare,
               _validKey = (isValidKey != null) ? isValidKey : ((v) => true) {
-            _Predicate<Object> v = /*warning:DOWN_CAST_COMPOSITE*/(isValidKey != null)
-                                    ? isValidKey : (/*info:INFERRED_TYPE_CLOSURE*/(_) => true);
+            _Predicate<Object> v = (isValidKey != null)
+                ? isValidKey : (/*info:INFERRED_TYPE_CLOSURE*/(_) => true);
 
             v = (isValidKey != null)
                  ? v : (/*info:INFERRED_TYPE_CLOSURE*/(_) => true);
@@ -56,6 +62,73 @@
       ''');
   });
 
+  test('least upper bounds', () {
+    checkFile('''
+      typedef T Returns<T>();
+
+      // regression test for https://github.com/dart-lang/sdk/issues/26094
+      class A <S extends  Returns<S>, T extends Returns<T>> {
+        int test(bool b) {
+          S s;
+          T t;
+          if (b) {
+            return /*warning:RETURN_OF_INVALID_TYPE*/b ? s : t;
+          } else {
+            return /*warning:RETURN_OF_INVALID_TYPE*/s ?? t;
+          }
+        }
+      }
+
+      class B<S, T extends S> {
+        T t;
+        S s;
+        int test(bool b) {
+          return /*warning:RETURN_OF_INVALID_TYPE*/b ? t : s;
+        }
+      }
+
+      class C {
+        // Check that the least upper bound of two types with the same
+        // class but different type arguments produces the pointwise
+        // least upper bound of the type arguments
+        int test1(bool b) {
+          List<int> li;
+          List<double> ld;
+          return /*warning:RETURN_OF_INVALID_TYPE*/b ? li : ld;
+        }
+        // TODO(leafp): This case isn't handled yet.  This test checks
+        // the case where two related classes are instantiated with related
+        // but different types.
+        Iterable<num> test2(bool b) {
+          List<int> li;
+          Iterable<double> id;
+          int x =
+              /*info:ASSIGNMENT_CAST should be warning:INVALID_ASSIGNMENT*/
+              b ? li : id;
+          return /*warning:DOWN_CAST_COMPOSITE should be pass*/b ? li : id;
+        }
+      }
+      ''');
+  });
+
+  test('setter return types', () {
+    checkFile('''
+      void voidFn() => null;
+      class A {
+        set a(y) => 4;
+        set b(y) => voidFn();
+        void set c(y) => /*warning:RETURN_OF_INVALID_TYPE*/4;
+        void set d(y) => voidFn();
+        /*warning:NON_VOID_RETURN_FOR_SETTER*/int set e(y) => 4;
+        /*warning:NON_VOID_RETURN_FOR_SETTER*/int set f(y) =>
+            /*warning:RETURN_OF_INVALID_TYPE*/voidFn();
+        set g(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
+        void set h(y) {return /*warning:RETURN_OF_INVALID_TYPE*/4;}
+        /*warning:NON_VOID_RETURN_FOR_SETTER*/int set i(y) {return 4;}
+      }
+    ''');
+  });
+
   test('if/for/do/while statements use boolean conversion', () {
     checkFile('''
       main() {
@@ -661,8 +734,24 @@
    ''');
     });
 
-    test('dynamic - known functions', () {
+    test('dynamic functions - closures are not fuzzy', () {
+      // Regression test for
+      // https://github.com/dart-lang/sdk/issues/26118
+      checkFile('''
+        void test1() {
+          void takesF(f(int x)) => null;
+          takesF((dynamic y) => 3);
+        }
 
+        void test2() {
+          int x;
+          int f/*<T>*/(/*=T*/ t, callback(/*=T*/ x)) { return 3; }
+          f(x, (y) => 3);
+        }
+     ''');
+    });
+
+    test('dynamic - known functions', () {
       // Our lattice should look like this:
       //
       //
@@ -674,6 +763,10 @@
       //         \      /
       //         Top -> A
       //
+      // Note that downcasts of known functions are promoted to
+      // static type errors, since they cannot succeed.
+      // This makes some of what look like downcasts turn into
+      // type errors below.
       checkFile('''
         class A {}
 
@@ -688,51 +781,160 @@
         A aa(A x) => x;
         dynamic topTop(dynamic x) => x;
         A topA(dynamic x) => /*info:DYNAMIC_CAST*/x;
-
+        void apply/*<T>*/(/*=T*/ f0, /*=T*/ f1, /*=T*/ f2,
+                          /*=T*/ f3, /*=T*/ f4, /*=T*/ f5) {}
         void main() {
           BotTop botTop;
           BotA botA;
           {
             BotTop f;
-            f = topTop;
-            f = aTop;
             f = topA;
+            f = topTop;
             f = aa;
+            f = aTop;
+            f = botA;
+            f = botTop;
+            apply/*<BotTop>*/(
+                topA,
+                topTop,
+                aa,
+                aTop,
+                botA,
+                botTop
+                              );
+            apply/*<BotTop>*/(
+                (dynamic x) => new A(),
+                (dynamic x) => (x as Object),
+                (A x) => x,
+                (A x) => null,
+                botA,
+                botTop
+                              );
           }
           {
             ATop f;
-            f = topTop;
-            f = aTop;
             f = topA;
+            f = topTop;
             f = aa;
+            f = aTop;
+            f = /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA;
+            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+            apply/*<ATop>*/(
+                topA,
+                topTop,
+                aa,
+                aTop,
+                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                            );
+            apply/*<ATop>*/(
+                (dynamic x) => new A(),
+                (dynamic x) => (x as Object),
+                (A x) => x,
+                (A x) => null,
+                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                            );
           }
           {
             BotA f;
-            f = /*severe:STATIC_TYPE_ERROR*/topTop;
-            f = /*severe:STATIC_TYPE_ERROR*/aTop;
             f = topA;
+            f = /*severe:STATIC_TYPE_ERROR*/topTop;
             f = aa;
+            f = /*severe:STATIC_TYPE_ERROR*/aTop;
+            f = botA;
+            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+            apply/*<BotA>*/(
+                topA,
+                /*severe:STATIC_TYPE_ERROR*/topTop,
+                aa,
+                /*severe:STATIC_TYPE_ERROR*/aTop,
+                botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                            );
+            apply/*<BotA>*/(
+                (dynamic x) => new A(),
+                /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object),
+                (A x) => x,
+                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object),
+                botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                            );
           }
           {
             AA f;
-            f = /*severe:STATIC_TYPE_ERROR*/topTop;
-            f = /*severe:STATIC_TYPE_ERROR*/aTop;
             f = topA;
+            f = /*severe:STATIC_TYPE_ERROR*/topTop;
             f = aa;
+            f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
+            f = /*warning:DOWN_CAST_COMPOSITE*/botA;
+            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+            apply/*<AA>*/(
+                topA,
+                /*severe:STATIC_TYPE_ERROR*/topTop,
+                aa,
+                /*severe:STATIC_TYPE_ERROR*/aTop, // known function
+                /*warning:DOWN_CAST_COMPOSITE*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                          );
+            apply/*<AA>*/(
+                (dynamic x) => new A(),
+                /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object),
+                (A x) => x,
+                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
+                /*warning:DOWN_CAST_COMPOSITE*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                          );
           }
           {
             TopTop f;
-            f = topTop;
-            f = /*severe:STATIC_TYPE_ERROR*/aTop;
             f = topA;
+            f = topTop;
             f = /*severe:STATIC_TYPE_ERROR*/aa;
+            f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
+            f = /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA;
+            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+            apply/*<TopTop>*/(
+                topA,
+                topTop,
+                /*severe:STATIC_TYPE_ERROR*/aa,
+                /*severe:STATIC_TYPE_ERROR*/aTop, // known function
+                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                              );
+            apply/*<TopTop>*/(
+                (dynamic x) => new A(),
+                (dynamic x) => (x as Object),
+                /*severe:STATIC_TYPE_ERROR*/(A x) => x,
+                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
+                /*warning:DOWN_CAST_COMPOSITE should be severe:STATIC_TYPE_ERROR*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                              );
           }
           {
             TopA f;
-            f = /*severe:STATIC_TYPE_ERROR*/topTop;
-            f = /*severe:STATIC_TYPE_ERROR*/aTop;
             f = topA;
-            f = /*severe:STATIC_TYPE_ERROR*/aa;
+            f = /*severe:STATIC_TYPE_ERROR*/topTop; // known function
+            f = /*severe:STATIC_TYPE_ERROR*/aa; // known function
+            f = /*severe:STATIC_TYPE_ERROR*/aTop; // known function
+            f = /*warning:DOWN_CAST_COMPOSITE*/botA;
+            f = /*warning:DOWN_CAST_COMPOSITE*/botTop;
+            apply/*<TopA>*/(
+                topA,
+                /*severe:STATIC_TYPE_ERROR*/topTop, // known function
+                /*severe:STATIC_TYPE_ERROR*/aa, // known function
+                /*severe:STATIC_TYPE_ERROR*/aTop, // known function
+                /*warning:DOWN_CAST_COMPOSITE*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                            );
+            apply/*<TopA>*/(
+                (dynamic x) => new A(),
+                /*severe:STATIC_TYPE_ERROR*/(dynamic x) => (x as Object), // known function
+                /*severe:STATIC_TYPE_ERROR*/(A x) => x, // known function
+                /*severe:STATIC_TYPE_ERROR*/(A x) => (x as Object), // known function
+                /*warning:DOWN_CAST_COMPOSITE*/botA,
+                /*warning:DOWN_CAST_COMPOSITE*/botTop
+                            );
           }
         }
      ''');
@@ -1325,7 +1527,7 @@
             local = g; // valid
 
             // Non-generic function cannot subtype a generic one.
-            local = /*severe:STATIC_TYPE_ERROR, warning:INVALID_ASSIGNMENT*/(x) => null;
+            local = /*warning:INVALID_ASSIGNMENT*/(x) => null;
             local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
           }
           {
@@ -1341,7 +1543,7 @@
             local2 = /*warning:DOWN_CAST_COMPOSITE*/local;
 
             // Non-generic function cannot subtype a generic one.
-            local = /*severe:STATIC_TYPE_ERROR, warning:INVALID_ASSIGNMENT*/(x) => null;
+            local = /*warning:INVALID_ASSIGNMENT*/(x) => null;
             local = /*warning:INVALID_ASSIGNMENT*/nonGenericFn;
           }
         }
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 e91033e..f17517d 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -113,6 +113,28 @@
   return check();
 }
 
+void initStrongModeTests() {
+  setUp(() {
+    AnalysisEngine.instance.processRequiredPlugins();
+    files = new MemoryResourceProvider();
+    _checkCalled = false;
+  });
+
+  tearDown(() {
+    // This is a sanity check, in case only addFile is called.
+    expect(_checkCalled, true, reason: 'must call check() method in test case');
+    files = null;
+  });
+}
+
+Level _actualErrorLevel(AnalysisError actual) {
+  return const <ErrorSeverity, Level>{
+    ErrorSeverity.ERROR: Level.SEVERE,
+    ErrorSeverity.WARNING: Level.WARNING,
+    ErrorSeverity.INFO: Level.INFO
+  }[actual.errorCode.errorSeverity];
+}
+
 SourceSpanWithContext _createSpanHelper(
     LineInfo lineInfo, int start, Source source, String content,
     {int end}) {
@@ -149,49 +171,6 @@
   }
 }
 
-void initStrongModeTests() {
-  setUp(() {
-    AnalysisEngine.instance.processRequiredPlugins();
-    files = new MemoryResourceProvider();
-    _checkCalled = false;
-  });
-
-  tearDown(() {
-    // This is a sanity check, in case only addFile is called.
-    expect(_checkCalled, true, reason: 'must call check() method in test case');
-    files = null;
-  });
-}
-
-SourceLocation _locationForOffset(LineInfo lineInfo, Uri uri, int offset) {
-  var loc = lineInfo.getLocation(offset);
-  return new SourceLocation(offset,
-      sourceUrl: uri, line: loc.lineNumber - 1, column: loc.columnNumber - 1);
-}
-
-/// Returns all libraries transitively imported or exported from [start].
-List<LibraryElement> _reachableLibraries(LibraryElement start) {
-  var results = <LibraryElement>[];
-  var seen = new Set();
-  void find(LibraryElement lib) {
-    if (seen.contains(lib)) return;
-    seen.add(lib);
-    results.add(lib);
-    lib.importedLibraries.forEach(find);
-    lib.exportedLibraries.forEach(find);
-  }
-  find(start);
-  return results;
-}
-
-Level _actualErrorLevel(AnalysisError actual) {
-  return const <ErrorSeverity, Level>{
-    ErrorSeverity.ERROR: Level.SEVERE,
-    ErrorSeverity.WARNING: Level.WARNING,
-    ErrorSeverity.INFO: Level.INFO
-  }[actual.errorCode.errorSeverity];
-}
-
 void _expectErrors(CompilationUnit unit, List<AnalysisError> actualErrors) {
   var expectedErrors = _findExpectedErrors(unit.beginToken);
 
@@ -267,6 +246,27 @@
   return expectedErrors;
 }
 
+SourceLocation _locationForOffset(LineInfo lineInfo, Uri uri, int offset) {
+  var loc = lineInfo.getLocation(offset);
+  return new SourceLocation(offset,
+      sourceUrl: uri, line: loc.lineNumber - 1, column: loc.columnNumber - 1);
+}
+
+/// Returns all libraries transitively imported or exported from [start].
+List<LibraryElement> _reachableLibraries(LibraryElement start) {
+  var results = <LibraryElement>[];
+  var seen = new Set();
+  void find(LibraryElement lib) {
+    if (seen.contains(lib)) return;
+    seen.add(lib);
+    results.add(lib);
+    lib.importedLibraries.forEach(find);
+    lib.exportedLibraries.forEach(find);
+  }
+  find(start);
+  return results;
+}
+
 void _reportFailure(
     CompilationUnit unit,
     List<_ErrorExpectation> unreported,
diff --git a/pkg/analyzer/tool/summary/build_sdk_summaries.dart b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
index 4f5db1e..01fa8fe 100644
--- a/pkg/analyzer/tool/summary/build_sdk_summaries.dart
+++ b/pkg/analyzer/tool/summary/build_sdk_summaries.dart
@@ -185,9 +185,8 @@
     DirectoryBasedDartSdk sdk =
         new DirectoryBasedDartSdk(new JavaFile(sdkPath));
     sdk.useSummary = false;
+    sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = strongMode;
     context = sdk.context;
-    context.analysisOptions = new AnalysisOptionsImpl()
-      ..strongMode = strongMode;
     //
     // Prepare 'dart:' URIs to serialize.
     //
@@ -228,7 +227,7 @@
       Source unitSource = unitElement.source;
       CompilationUnit unit =
           context.resolveCompilationUnit2(unitSource, source);
-      indexAssembler.index(unit);
+      indexAssembler.indexUnit(unit);
     }
   }
 }
diff --git a/pkg/analyzer/tool/summary/check_test.dart b/pkg/analyzer/tool/summary/check_test.dart
index 156dc19..98f25b6 100644
--- a/pkg/analyzer/tool/summary/check_test.dart
+++ b/pkg/analyzer/tool/summary/check_test.dart
@@ -18,6 +18,5 @@
 main() {
   String script = Platform.script.toFilePath(windows: Platform.isWindows);
   String pkgPath = normalize(join(dirname(script), '..', '..'));
-  GeneratedContent.checkAll(
-      pkgPath, 'tool/summary/generate.dart', allTargets);
+  GeneratedContent.checkAll(pkgPath, 'tool/summary/generate.dart', allTargets);
 }
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index cfa14a0..51dad39 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -283,6 +283,7 @@
             }
             int id;
             bool isDeprecated = false;
+            bool isInformative = false;
             for (Annotation annotation in classMember.metadata) {
               if (annotation.name.name == 'Id') {
                 if (id != null) {
@@ -305,6 +306,8 @@
                   throw new Exception('@deprecated does not take args ($desc)');
                 }
                 isDeprecated = true;
+              } else if (annotation.name.name == 'informative') {
+                isInformative = true;
               }
             }
             if (id == null) {
@@ -314,7 +317,12 @@
             idlModel.FieldType fieldType =
                 new idlModel.FieldType(type.name.name, isList);
             cls.allFields.add(new idlModel.FieldDeclaration(
-                doc, classMember.name.name, fieldType, id, isDeprecated));
+                doc,
+                classMember.name.name,
+                fieldType,
+                id,
+                isDeprecated,
+                isInformative));
           } else if (classMember is ConstructorDeclaration &&
               classMember.name.name == 'fromBuffer') {
             // Ignore `fromBuffer` declarations; they simply forward to the
@@ -589,6 +597,30 @@
         String suffix = i == fields.length - 1 ? ';' : ',';
         out('${prefix}_${field.name} = ${field.name}$suffix');
       }
+      // Generate flushInformative().
+      {
+        out();
+        out('/**');
+        out(' * Flush [informative] data recursively.');
+        out(' */');
+        out('void flushInformative() {');
+        indent(() {
+          for (idlModel.FieldDeclaration field in cls.fields) {
+            idlModel.FieldType fieldType = field.type;
+            String valueName = '_' + field.name;
+            if (field.isInformative) {
+              out('$valueName = null;');
+            } else if (_idl.classes.containsKey(fieldType.typeName)) {
+              if (fieldType.isList) {
+                out('$valueName?.forEach((b) => b.flushInformative());');
+              } else {
+                out('$valueName?.flushInformative();');
+              }
+            }
+          }
+        });
+        out('}');
+      }
       // Generate finish.
       if (cls.isTopLevel) {
         out();
diff --git a/pkg/analyzer/tool/summary/idl_model.dart b/pkg/analyzer/tool/summary/idl_model.dart
index 9ec248f..18b981c 100644
--- a/pkg/analyzer/tool/summary/idl_model.dart
+++ b/pkg/analyzer/tool/summary/idl_model.dart
@@ -25,7 +25,7 @@
 
   /**
    * If [isTopLevel] is `true` and a file identifier was specified for this
-   * class, the file identifier string.  Otheswise `null`.
+   * class, the file identifier string.  Otherwise `null`.
    */
   final String fileIdentifier;
 
@@ -97,8 +97,13 @@
    */
   final bool isDeprecated;
 
-  FieldDeclaration(
-      String documentation, String name, this.type, this.id, this.isDeprecated)
+  /**
+   * Indicates whether the field is informative.
+   */
+  final bool isInformative;
+
+  FieldDeclaration(String documentation, String name, this.type, this.id,
+      this.isDeprecated, this.isInformative)
       : super(documentation, name);
 }
 
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
new file mode 100644
index 0000000..2256247
--- /dev/null
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -0,0 +1,570 @@
+// 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.
+
+library analyzer_cli.src.build_mode;
+
+import 'dart:convert';
+import 'dart:core' hide Resource;
+import 'dart:io' as io;
+
+import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit;
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/summary/prelink.dart';
+import 'package:analyzer/src/summary/summarize_ast.dart';
+import 'package:analyzer/src/summary/summarize_elements.dart';
+import 'package:analyzer/task/dart.dart';
+import 'package:analyzer_cli/src/analyzer_impl.dart';
+import 'package:analyzer_cli/src/driver.dart';
+import 'package:analyzer_cli/src/error_formatter.dart';
+import 'package:analyzer_cli/src/options.dart';
+
+/**
+ * Analyzer used when the "--build-mode" option is supplied.
+ */
+class BuildMode {
+  final CommandLineOptions options;
+  final AnalysisStats stats;
+
+  final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
+  SummaryDataStore summaryDataStore;
+  InternalAnalysisContext context;
+  Map<Uri, JavaFile> uriToFileMap;
+  final List<Source> explicitSources = <Source>[];
+
+  PackageBundleAssembler assembler = new PackageBundleAssembler();
+  final Set<Source> processedSources = new Set<Source>();
+  final Map<Uri, UnlinkedUnit> uriToUnit = <Uri, UnlinkedUnit>{};
+
+  BuildMode(this.options, this.stats);
+
+  /**
+   * Perform package analysis according to the given [options].
+   */
+  ErrorSeverity analyze() {
+    // Write initial progress message.
+    if (!options.machineFormat) {
+      outSink.writeln("Analyzing sources ${options.sourceFiles}...");
+    }
+
+    // Create the URI to file map.
+    uriToFileMap = _createUriToFileMap(options.sourceFiles);
+    if (uriToFileMap == null) {
+      io.exitCode = ErrorSeverity.ERROR.ordinal;
+      return ErrorSeverity.ERROR;
+    }
+
+    // Prepare the analysis context.
+    _createContext();
+
+    // Add sources.
+    ChangeSet changeSet = new ChangeSet();
+    for (Uri uri in uriToFileMap.keys) {
+      JavaFile file = uriToFileMap[uri];
+      if (!file.exists()) {
+        errorSink.writeln('File not found: ${file.getPath()}');
+        io.exitCode = ErrorSeverity.ERROR.ordinal;
+        return ErrorSeverity.ERROR;
+      }
+      Source source = new FileBasedSource(file, uri);
+      explicitSources.add(source);
+      changeSet.addedSource(source);
+    }
+    context.applyChanges(changeSet);
+
+    if (!options.buildSummaryOnly) {
+      // Perform full analysis.
+      while (true) {
+        AnalysisResult analysisResult = context.performAnalysisTask();
+        if (!analysisResult.hasMoreWork) {
+          break;
+        }
+      }
+    }
+
+    // Write summary.
+    if (options.buildSummaryOutput != null) {
+      for (Source source in explicitSources) {
+        if (context.computeKindOf(source) == SourceKind.LIBRARY) {
+          if (options.buildSummaryFallback) {
+            assembler.addFallbackLibrary(source);
+          } else if (options.buildSummaryOnlyAst) {
+            _serializeAstBasedSummary(source);
+          } else {
+            LibraryElement libraryElement =
+                context.computeLibraryElement(source);
+            assembler.serializeLibraryElement(libraryElement);
+          }
+        }
+        if (options.buildSummaryFallback) {
+          assembler.addFallbackUnit(source);
+        }
+      }
+      // Write the whole package bundle.
+      PackageBundleBuilder sdkBundle = assembler.assemble();
+      if (options.buildSummaryExcludeInformative) {
+        sdkBundle.flushInformative();
+        sdkBundle.unlinkedUnitHashes = null;
+      }
+      io.File file = new io.File(options.buildSummaryOutput);
+      file.writeAsBytesSync(sdkBundle.toBuffer(), mode: io.FileMode.WRITE_ONLY);
+    }
+
+    if (options.buildSummaryOnly) {
+      return ErrorSeverity.NONE;
+    } else {
+      // Process errors.
+      _printErrors(outputPath: options.buildAnalysisOutput);
+      return _computeMaxSeverity();
+    }
+  }
+
+  ErrorSeverity _computeMaxSeverity() {
+    ErrorSeverity maxSeverity = ErrorSeverity.NONE;
+    if (!options.buildSuppressExitCode) {
+      for (Source source in explicitSources) {
+        AnalysisErrorInfo errorInfo = context.getErrors(source);
+        for (AnalysisError error in errorInfo.errors) {
+          ProcessedSeverity processedSeverity =
+              AnalyzerImpl.processError(error, options, context);
+          if (processedSeverity != null) {
+            maxSeverity = maxSeverity.max(processedSeverity.severity);
+          }
+        }
+      }
+    }
+    return maxSeverity;
+  }
+
+  void _createContext() {
+    DirectoryBasedDartSdk sdk =
+        new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
+    sdk.analysisOptions =
+        Driver.createAnalysisOptionsForCommandLineOptions(options);
+    sdk.useSummary = true;
+
+    // Read the summaries.
+    summaryDataStore = new SummaryDataStore(options.buildSummaryInputs);
+
+    // In AST mode include SDK bundle to avoid parsing SDK sources.
+    if (options.buildSummaryOnlyAst) {
+      summaryDataStore.addBundle(null, sdk.getSummarySdkBundle());
+    }
+
+    // Create the context.
+    context = AnalysisEngine.instance.createAnalysisContext();
+    context.sourceFactory = new SourceFactory(<UriResolver>[
+      new DartUriResolver(sdk),
+      new InSummaryPackageUriResolver(summaryDataStore),
+      new ExplicitSourceResolver(uriToFileMap)
+    ]);
+
+    // Set context options.
+    Driver.setAnalysisContextOptions(context, options,
+        (AnalysisOptionsImpl contextOptions) {
+      if (options.buildSummaryOnlyDiet) {
+        contextOptions.analyzeFunctionBodies = false;
+      }
+    });
+
+    // Configure using summaries.
+    context.typeProvider = sdk.context.typeProvider;
+    context.resultProvider =
+        new InputPackagesResultProvider(context, summaryDataStore);
+  }
+
+  /**
+   * Print errors for all explicit sources.  If [outputPath] is supplied, output
+   * is sent to a new file at that path.
+   */
+  void _printErrors({String outputPath}) {
+    StringBuffer buffer = new StringBuffer();
+    ErrorFormatter formatter = new ErrorFormatter(
+        buffer,
+        options,
+        stats,
+        (AnalysisError error) =>
+            AnalyzerImpl.processError(error, options, context));
+    for (Source source in explicitSources) {
+      AnalysisErrorInfo errorInfo = context.getErrors(source);
+      formatter.formatErrors([errorInfo]);
+    }
+    if (!options.machineFormat) {
+      stats.print(buffer);
+    }
+    if (outputPath == null) {
+      StringSink sink = options.machineFormat ? errorSink : outSink;
+      sink.write(buffer);
+    } else {
+      new io.File(outputPath).writeAsStringSync(buffer.toString());
+    }
+  }
+
+  /**
+   * Serialize the library with the given [source] into [assembler] using only
+   * its AST, [UnlinkedUnit]s of input packages and ASTs (via [UnlinkedUnit]s)
+   * of package sources.
+   */
+  void _serializeAstBasedSummary(Source source) {
+    Source resolveRelativeUri(String relativeUri) {
+      Source resolvedSource =
+          context.sourceFactory.resolveUri(source, relativeUri);
+      if (resolvedSource == null) {
+        context.sourceFactory.resolveUri(source, relativeUri);
+        throw new StateError('Could not resolve $relativeUri in the context of '
+            '$source (${source.runtimeType})');
+      }
+      return resolvedSource;
+    }
+
+    UnlinkedUnit _getUnlinkedUnit(Source source) {
+      // Maybe an input package contains the source.
+      {
+        String uriStr = source.uri.toString();
+        UnlinkedUnit unlinkedUnit = summaryDataStore.unlinkedMap[uriStr];
+        if (unlinkedUnit != null) {
+          return unlinkedUnit;
+        }
+      }
+      // Parse the source and serialize its AST.
+      return uriToUnit.putIfAbsent(source.uri, () {
+        CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
+        UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
+        assembler.addUnlinkedUnit(source, unlinkedUnit);
+        return unlinkedUnit;
+      });
+    }
+
+    UnlinkedUnit getPart(String relativeUri) {
+      return _getUnlinkedUnit(resolveRelativeUri(relativeUri));
+    }
+
+    UnlinkedPublicNamespace getImport(String relativeUri) {
+      return getPart(relativeUri).publicNamespace;
+    }
+
+    UnlinkedUnitBuilder definingUnit = _getUnlinkedUnit(source);
+    LinkedLibraryBuilder linkedLibrary =
+        prelink(definingUnit, getPart, getImport);
+    assembler.addLinkedLibrary(source.uri.toString(), linkedLibrary);
+  }
+
+  /**
+   * Convert [sourceEntities] (a list of file specifications of the form
+   * "$uri|$path") to a map from URI to path.  If an error occurs, report the
+   * error and return null.
+   */
+  static Map<Uri, JavaFile> _createUriToFileMap(List<String> sourceEntities) {
+    Map<Uri, JavaFile> uriToFileMap = <Uri, JavaFile>{};
+    for (String sourceFile in sourceEntities) {
+      int pipeIndex = sourceFile.indexOf('|');
+      if (pipeIndex == -1) {
+        // TODO(paulberry): add the ability to guess the URI from the path.
+        errorSink.writeln(
+            'Illegal input file (must be "\$uri|\$path"): $sourceFile');
+        return null;
+      }
+      Uri uri = Uri.parse(sourceFile.substring(0, pipeIndex));
+      String path = sourceFile.substring(pipeIndex + 1);
+      uriToFileMap[uri] = new JavaFile(path);
+    }
+    return uriToFileMap;
+  }
+}
+
+/**
+ * Interface that every worker related data object has.
+ */
+abstract class WorkDataObject {
+  /**
+   * Translate the data in this class into a JSON map.
+   */
+  Map<String, Object> toJson();
+}
+
+/**
+ * Connection between a worker and input / output.
+ */
+abstract class WorkerConnection {
+  /**
+   * Read a new line. Block until a line is read. Return `null` if EOF.
+   */
+  String readLineSync();
+
+  /**
+   * Write the given [json] as a new line to the output.
+   */
+  void writeJson(Map<String, Object> json);
+}
+
+/**
+ * Persistent Bazel worker.
+ */
+class WorkerLoop {
+  static const int EXIT_CODE_OK = 0;
+  static const int EXIT_CODE_ERROR = 15;
+
+  final WorkerConnection connection;
+
+  final StringBuffer errorBuffer = new StringBuffer();
+  final StringBuffer outBuffer = new StringBuffer();
+
+  WorkerLoop(this.connection);
+
+  factory WorkerLoop.std() {
+    WorkerConnection connection = new _StdWorkerConnection();
+    return new WorkerLoop(connection);
+  }
+
+  /**
+   * Performs analysis with given [options].
+   */
+  void analyze(CommandLineOptions options) {
+    new BuildMode(options, new AnalysisStats()).analyze();
+  }
+
+  /**
+   * Perform a single loop step.  Return `true` if should exit the loop.
+   */
+  bool performSingle() {
+    try {
+      WorkRequest request = _readRequest();
+      if (request == null) {
+        return true;
+      }
+      // Prepare options.
+      CommandLineOptions options =
+          CommandLineOptions.parse(request.arguments, (String msg) {
+        throw new ArgumentError(msg);
+      });
+      // Analyze and respond.
+      analyze(options);
+      String msg = _getErrorOutputBuffersText();
+      _writeResponse(new WorkResponse(EXIT_CODE_OK, msg));
+    } catch (e, st) {
+      String msg = _getErrorOutputBuffersText();
+      msg += '$e \n $st';
+      _writeResponse(new WorkResponse(EXIT_CODE_ERROR, msg));
+    }
+    return false;
+  }
+
+  /**
+   * Run the worker loop.
+   */
+  void run() {
+    errorSink = errorBuffer;
+    outSink = outBuffer;
+    exitHandler = (int exitCode) {
+      return throw new StateError('Exit called: $exitCode');
+    };
+    while (true) {
+      errorBuffer.clear();
+      outBuffer.clear();
+      bool shouldExit = performSingle();
+      if (shouldExit) {
+        break;
+      }
+    }
+  }
+
+  String _getErrorOutputBuffersText() {
+    String msg = '';
+    if (errorBuffer.isNotEmpty) {
+      msg += errorBuffer.toString() + '\n';
+    }
+    if (outBuffer.isNotEmpty) {
+      msg += outBuffer.toString() + '\n';
+    }
+    return msg;
+  }
+
+  /**
+   * Read a new [WorkRequest]. Return `null` if EOF.
+   * Throw [ArgumentError] if cannot be parsed.
+   */
+  WorkRequest _readRequest() {
+    String line = connection.readLineSync();
+    if (line == null) {
+      return null;
+    }
+    Object json = JSON.decode(line);
+    if (json is Map) {
+      return new WorkRequest.fromJson(json);
+    } else {
+      throw new ArgumentError('The request line is not a  JSON object: $line');
+    }
+  }
+
+  void _writeResponse(WorkResponse response) {
+    Map<String, Object> json = response.toJson();
+    connection.writeJson(json);
+  }
+}
+
+/**
+ * Input file.
+ */
+class WorkInput implements WorkDataObject {
+  final String path;
+  final List<int> digest;
+
+  WorkInput(this.path, this.digest);
+
+  factory WorkInput.fromJson(Map<String, Object> json) {
+    // Parse path.
+    Object path2 = json['path'];
+    if (path2 == null) {
+      throw new ArgumentError('The field "path" is missing.');
+    }
+    if (path2 is! String) {
+      throw new ArgumentError('The field "path" must be a string.');
+    }
+    // Parse digest.
+    List<int> digest = const <int>[];
+    {
+      Object digestJson = json['digest'];
+      if (digestJson != null) {
+        if (digestJson is List && digestJson.every((e) => e is int)) {
+          digest = digestJson;
+        } else {
+          throw new ArgumentError(
+              'The field "digest" should be a list of int.');
+        }
+      }
+    }
+    // OK
+    return new WorkInput(path2, digest);
+  }
+
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> json = <String, Object>{};
+    if (path != null) {
+      json['path'] = path;
+    }
+    if (digest != null) {
+      json['digest'] = digest;
+    }
+    return json;
+  }
+}
+
+/**
+ * Single work unit that Bazel sends to the worker.
+ */
+class WorkRequest implements WorkDataObject {
+  /**
+   * Command line arguments for this request.
+   */
+  final List<String> arguments;
+
+  /**
+   * Input files that the worker is allowed to read during execution of this
+   * request.
+   */
+  final List<WorkInput> inputs;
+
+  WorkRequest(this.arguments, this.inputs);
+
+  factory WorkRequest.fromJson(Map<String, Object> json) {
+    // Parse arguments.
+    List<String> arguments = const <String>[];
+    {
+      Object argumentsJson = json['arguments'];
+      if (argumentsJson != null) {
+        if (argumentsJson is List && argumentsJson.every((e) => e is String)) {
+          arguments = argumentsJson;
+        } else {
+          throw new ArgumentError(
+              'The field "arguments" should be a list of strings.');
+        }
+      }
+    }
+    // Parse inputs.
+    List<WorkInput> inputs = const <WorkInput>[];
+    {
+      Object inputsJson = json['inputs'];
+      if (inputsJson != null) {
+        if (inputsJson is List &&
+            inputsJson.every((e) {
+              return e is Map && e.keys.every((key) => key is String);
+            })) {
+          inputs = inputsJson
+              .map((Map input) => new WorkInput.fromJson(input))
+              .toList();
+        } else {
+          throw new ArgumentError(
+              'The field "inputs" should be a list of objects.');
+        }
+      }
+    }
+    // No inputs.
+    if (arguments.isEmpty && inputs.isEmpty) {
+      throw new ArgumentError('Both "arguments" and "inputs" cannot be empty.');
+    }
+    // OK
+    return new WorkRequest(arguments, inputs);
+  }
+
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> json = <String, Object>{};
+    if (arguments != null) {
+      json['arguments'] = arguments;
+    }
+    if (inputs != null) {
+      json['inputs'] = inputs.map((input) => input.toJson()).toList();
+    }
+    return json;
+  }
+}
+
+/**
+ * Result that the worker sends back to Bazel when it finished its work on a
+ * [WorkRequest] message.
+ */
+class WorkResponse implements WorkDataObject {
+  final int exitCode;
+  final String output;
+
+  WorkResponse(this.exitCode, this.output);
+
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> json = <String, Object>{};
+    if (exitCode != null) {
+      json['exit_code'] = exitCode;
+    }
+    if (output != null) {
+      json['output'] = output;
+    }
+    return json;
+  }
+}
+
+/**
+ * Default implementation of [WorkerConnection] that works with stdio.
+ */
+class _StdWorkerConnection implements WorkerConnection {
+  @override
+  String readLineSync() {
+    return io.stdin.readLineSync();
+  }
+
+  @override
+  void writeJson(Map<String, Object> json) {
+    io.stdout.writeln(JSON.encode(json));
+  }
+}
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index eb1df03..f3016d5 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -33,9 +33,9 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer_cli/src/analyzer_impl.dart';
+import 'package:analyzer_cli/src/build_mode.dart';
 import 'package:analyzer_cli/src/error_formatter.dart';
 import 'package:analyzer_cli/src/options.dart';
-import 'package:analyzer_cli/src/package_analyzer.dart';
 import 'package:analyzer_cli/src/perf_report.dart';
 import 'package:analyzer_cli/starter.dart';
 import 'package:linter/src/plugin/linter_plugin.dart';
@@ -124,8 +124,8 @@
     _setupEnv(options);
 
     // Do analysis.
-    if (options.packageMode) {
-      ErrorSeverity severity = _analyzePackage(options);
+    if (options.buildMode) {
+      ErrorSeverity severity = _buildModeAnalyze(options);
       // In case of error propagate exit code.
       if (severity == ErrorSeverity.ERROR) {
         exitCode = severity.ordinal;
@@ -241,10 +241,14 @@
     return allResult;
   }
 
-  /// Perform package analysis according to the given [options].
-  ErrorSeverity _analyzePackage(CommandLineOptions options) {
+  /// Perform analysis in build mode according to the given [options].
+  ErrorSeverity _buildModeAnalyze(CommandLineOptions options) {
     return _analyzeAllTag.makeCurrentWhile(() {
-      return new PackageAnalyzer(options, stats).analyze();
+      if (options.buildModePersistentWorker) {
+        new WorkerLoop.std().run();
+      } else {
+        return new BuildMode(options, stats).analyze();
+      }
     });
   }
 
@@ -588,10 +592,26 @@
     // to activate batch mode.
     if (sdk == null) {
       sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
+      sdk.analysisOptions = createAnalysisOptionsForCommandLineOptions(options);
     }
     _isBatch = options.shouldBatch;
   }
 
+  static AnalysisOptionsImpl createAnalysisOptionsForCommandLineOptions(
+      CommandLineOptions options) {
+    AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl();
+    contextOptions.hint = !options.disableHints;
+    contextOptions.enableStrictCallChecks = options.enableStrictCallChecks;
+    contextOptions.enableSuperMixins = options.enableSuperMixins;
+    contextOptions.enableConditionalDirectives =
+        options.enableConditionalDirectives;
+    contextOptions.generateImplicitErrors = options.showPackageWarnings;
+    contextOptions.generateSdkErrors = options.showSdkWarnings;
+    contextOptions.lint = options.lints;
+    contextOptions.strongMode = options.strongMode;
+    return contextOptions;
+  }
+
   static void setAnalysisContextOptions(
       AnalysisContext context,
       CommandLineOptions options,
@@ -609,21 +629,12 @@
     }
 
     // Prepare context options.
-    AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl();
-    contextOptions.hint = !options.disableHints;
-    contextOptions.enableStrictCallChecks = options.enableStrictCallChecks;
-    contextOptions.enableSuperMixins = options.enableSuperMixins;
-    contextOptions.enableConditionalDirectives =
-        options.enableConditionalDirectives;
-    contextOptions.generateImplicitErrors = options.showPackageWarnings;
-    contextOptions.generateSdkErrors = options.showSdkWarnings;
-    contextOptions.lint = options.lints;
-    contextOptions.strongMode = options.strongMode;
+    AnalysisOptionsImpl contextOptions =
+        createAnalysisOptionsForCommandLineOptions(options);
     configureContextOptions(contextOptions);
 
     // Set context options.
     context.analysisOptions = contextOptions;
-    context.sourceFactory.dartSdk.context.analysisOptions = contextOptions;
 
     // Process analysis options file (and notify all interested parties).
     _processAnalysisOptions(context, options);
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 3f100af..4bf126d 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -33,6 +33,41 @@
   /// The path to an analysis options file
   final String analysisOptionsFile;
 
+  /// The path to output analysis results when in build mode.
+  final String buildAnalysisOutput;
+
+  /// Whether to use build mode.
+  final bool buildMode;
+
+  /// Whether to use build mode as a Bazel persistent worker.
+  final bool buildModePersistentWorker;
+
+  /// List of summary file paths to use in build mode.
+  final List<String> buildSummaryInputs;
+
+  /// Whether to skip analysis when creating summaries in build mode.
+  final bool buildSummaryOnly;
+
+  /// Whether to create summaries using only ASTs, i.e. don't perform
+  /// resolution.
+  final bool buildSummaryOnlyAst;
+
+  /// Whether to use diet parsing, i.e. skip function bodies. We don't need to
+  /// analyze function bodies to use summaries during future compilation steps.
+  final bool buildSummaryOnlyDiet;
+
+  /// Whether to use exclude informative data from created summaries.
+  final bool buildSummaryExcludeInformative;
+
+  /// The path to output the summary when creating summaries in build mode.
+  final String buildSummaryOutput;
+
+  /// Whether to output a summary in "fallback mode".
+  final bool buildSummaryFallback;
+
+  /// Whether to suppress a nonzero exit code in build mode.
+  final bool buildSuppressExitCode;
+
   /// The path to the dart SDK
   String dartSdkPath;
 
@@ -77,24 +112,6 @@
   /// Whether to use machine format for error display
   final bool machineFormat;
 
-  /// Whether to use the whole package analysis mode.
-  final bool packageMode;
-
-  /// The path of the root folder of the package to analyze.
-  final String packageModePath;
-
-  /// The name of the package being analyzed.
-  final String packageName;
-
-  /// Mapping of package names to package summary file paths.
-  final Map<String, String> packageSummaryInputs;
-
-  /// Whether to skip analysis when creating summaries.
-  final bool packageSummaryOnly;
-
-  /// The path to find the package summary.
-  final String packageSummaryOutput;
-
   /// The path to the package root
   final String packageRootPath;
 
@@ -129,7 +146,19 @@
   /// Initialize options from the given parsed [args].
   CommandLineOptions._fromArgs(
       ArgResults args, Map<String, String> definedVariables)
-      : dartSdkPath = args['dart-sdk'],
+      : buildAnalysisOutput = args['build-analysis-output'],
+        buildMode = args['build-mode'],
+        buildModePersistentWorker = args['persistent_worker'],
+        buildSummaryFallback = args['build-summary-fallback'],
+        buildSummaryInputs = args['build-summary-input'],
+        buildSummaryOnly = args['build-summary-only'],
+        buildSummaryOnlyAst = args['build-summary-only-ast'],
+        buildSummaryOnlyDiet = args['build-summary-only-diet'],
+        buildSummaryExcludeInformative =
+            args['build-summary-exclude-informative'],
+        buildSummaryOutput = args['build-summary-output'],
+        buildSuppressExitCode = args['build-suppress-exit-code'],
+        dartSdkPath = args['dart-sdk'],
         definedVariables = definedVariables,
         analysisOptionsFile = args['options'],
         disableHints = args['no-hints'],
@@ -144,12 +173,6 @@
         lints = args['lints'],
         log = args['log'],
         machineFormat = args['machine'] || args['format'] == 'machine',
-        packageMode = args['package-mode'],
-        packageModePath = args['package-mode-path'],
-        packageName = args['package-name'],
-        packageSummaryInputs = _parsePackageSummaryInputs(args),
-        packageSummaryOnly = args['package-summary-only'],
-        packageSummaryOutput = args['package-summary-output'],
         packageConfigPath = args['packages'],
         packageRootPath = args['package-root'],
         perfReport = args['x-perf-report'],
@@ -167,7 +190,7 @@
   /// analyzer options. In case of a format error, calls [printAndFail], which
   /// by default prints an error message to stderr and exits.
   static CommandLineOptions parse(List<String> args,
-      [printAndFail = printAndFail]) {
+      [printAndFail(String msg) = printAndFail]) {
     CommandLineOptions options = _parse(args);
     // Check SDK.
     {
@@ -209,6 +232,16 @@
           "Null aware operators are supported by default.");
     }
 
+    // Build mode.
+    if (options.buildModePersistentWorker && !options.buildMode) {
+      printAndFail('The option --persisten_worker can be used only '
+          'together with --build-mode.');
+    }
+    if (options.buildSummaryOnlyDiet && !options.buildSummaryOnly) {
+      printAndFail('The option --build-summary-only-diet can be used only '
+          'together with --build-summary-only.');
+    }
+
     return options;
   }
 
@@ -304,37 +337,62 @@
           allowMultiple: true,
           splitCommas: false)
       //
-      // Package analysis mode and summary.
+      // Build mode.
       //
-      ..addFlag('package-mode',
-          help: 'Enable the whole package analysis mode. '
-              'Exactly one input path must be specified, which must be a path '
-              'to the folder with a Pub package.',
+      ..addFlag('persistent_worker',
+          help: 'Enable Bazel persistent worker mode.',
           defaultsTo: false,
           negatable: false,
           hide: true)
-      ..addOption('package-mode-path',
-          help: 'The path of the root folder of the package to analyze.',
+      ..addOption('build-analysis-output',
+          help:
+              'Specifies the path to the file where analysis results should be written.',
           hide: true)
-      ..addOption('package-name',
-          help: 'The name of the package to analyze, as it is used by clients.',
+      ..addFlag('build-mode',
+          // TODO(paulberry): add more documentation.
+          help: 'Enable build mode.',
+          defaultsTo: false,
+          negatable: false,
           hide: true)
-      ..addOption('package-summary-input',
-          help: '--package-summary-input=packageName,/path/to/package.sum '
-              'specifies the summary file that contains information about '
-              'every library of the specified package.',
+      ..addOption('build-summary-input',
+          help: 'Path to a summary file that contains information from a '
+              'previous analysis run.  May be specified multiple times.',
           allowMultiple: true,
-          splitCommas: false,
           hide: true)
-      ..addOption('package-summary-output',
+      ..addOption('build-summary-output',
           help: 'Specifies the path to the file where the summary information '
-              'about the package should be written to.',
+              'should be written.',
           hide: true)
-      ..addFlag('package-summary-only',
+      ..addFlag('build-summary-only',
           help: 'Disable analysis (only generate summaries).',
           defaultsTo: false,
           negatable: false,
           hide: true)
+      ..addFlag('build-summary-only-ast',
+          help: 'Generate summaries using ASTs.',
+          defaultsTo: false,
+          negatable: false,
+          hide: true)
+      ..addFlag('build-summary-only-diet',
+          help: 'Diet parse function bodies.',
+          defaultsTo: false,
+          negatable: false,
+          hide: true)
+      ..addFlag('build-summary-exclude-informative',
+          help: 'Exclude @informative information (docs, offsets, etc).',
+          defaultsTo: false,
+          negatable: false,
+          hide: true)
+      ..addFlag('build-summary-fallback',
+          help: 'If outputting a summary, output it in fallback mode.',
+          defaultsTo: false,
+          negatable: false,
+          hide: true)
+      ..addFlag('build-suppress-exit-code',
+          help: 'Exit with code 0 even if errors are found.',
+          defaultsTo: false,
+          negatable: false,
+          hide: true)
       //
       // Hidden flags.
       //
@@ -392,6 +450,17 @@
           args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList();
       Map<String, String> definedVariables = <String, String>{};
       var results = parser.parse(args, definedVariables);
+
+      // Persistent worker.
+      if (args.contains('--persistent_worker')) {
+        if (args.length != 2 || !args.contains('--build-mode')) {
+          printAndFail('The --persistent_worker flag should be used with and '
+              'only with the --build-mode flag.');
+          return null; // Only reachable in testing.
+        }
+        return new CommandLineOptions._fromArgs(results, definedVariables);
+      }
+
       // Help requests.
       if (results['help']) {
         _showUsage(parser);
@@ -406,6 +475,14 @@
           exitHandler(15);
           return null; // Only reachable in testing.
         }
+      } else if (results['persistent_worker']) {
+        if (results.rest.isNotEmpty) {
+          errorSink.writeln(
+              'No source files expected in the persistent worker mode.');
+          _showUsage(parser);
+          exitHandler(15);
+          return null; // Only reachable in testing.
+        }
       } else if (results['version']) {
         outSink.write('$_binaryName version ${_getVersion()}');
         exitHandler(0);
@@ -426,27 +503,6 @@
     }
   }
 
-  /// Parse the `--package-summary-input` arguments into a Map of package
-  /// names to summary paths.
-  static Map<String, String> _parsePackageSummaryInputs(ArgResults args) {
-    Map<String, String> result = <String, String>{};
-    List<String> argList = args['package-summary-input'];
-    for (String arg in argList) {
-      int index = arg.indexOf(',');
-      if (index == -1) {
-        errorSink.writeln(
-            'The syntax is --package-summary-input=packageName,/path/to/pkg.sum');
-        errorSink.writeln('No comma found in: $arg');
-        exitHandler(15);
-        return null; // Only reachable in testing.
-      }
-      String packageName = arg.substring(0, index);
-      String summaryPath = arg.substring(index + 1);
-      result[packageName] = summaryPath;
-    }
-    return result;
-  }
-
   static _showUsage(parser) {
     errorSink
         .writeln('Usage: $_binaryName [options...] <libraries to analyze...>');
diff --git a/pkg/analyzer_cli/lib/src/package_analyzer.dart b/pkg/analyzer_cli/lib/src/package_analyzer.dart
deleted file mode 100644
index fd173a3..0000000
--- a/pkg/analyzer_cli/lib/src/package_analyzer.dart
+++ /dev/null
@@ -1,194 +0,0 @@
-// 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.
-
-library analyzer_cli.src.package_analyzer;
-
-import 'dart:core' hide Resource;
-import 'dart:io' as io;
-
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/sdk_io.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/summary/format.dart';
-import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:analyzer/src/summary/summarize_elements.dart';
-import 'package:analyzer_cli/src/analyzer_impl.dart';
-import 'package:analyzer_cli/src/driver.dart';
-import 'package:analyzer_cli/src/error_formatter.dart';
-import 'package:analyzer_cli/src/options.dart';
-import 'package:path/path.dart' as pathos;
-
-/**
- * The hermetic whole package analyzer.
- */
-class PackageAnalyzer {
-  final CommandLineOptions options;
-  final AnalysisStats stats;
-
-  String packagePath;
-  String packageLibPath;
-
-  final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
-  InternalAnalysisContext context;
-  final List<Source> explicitSources = <Source>[];
-
-  PackageAnalyzer(this.options, this.stats);
-
-  /**
-   * Perform package analysis according to the given [options].
-   */
-  ErrorSeverity analyze() {
-    packagePath = resourceProvider.pathContext.normalize(resourceProvider
-        .pathContext
-        .join(io.Directory.current.absolute.path, options.packageModePath));
-    packageLibPath = resourceProvider.pathContext.join(packagePath, 'lib');
-    if (packageLibPath == null) {
-      errorSink.writeln('--package-mode-path must be set to the root '
-          'folder of the package to analyze.');
-      io.exitCode = ErrorSeverity.ERROR.ordinal;
-      return ErrorSeverity.ERROR;
-    }
-
-    // Write the progress message.
-    if (!options.machineFormat) {
-      outSink.writeln("Analyzing sources ${options.sourceFiles}...");
-    }
-
-    // Prepare the analysis context.
-    _createContext();
-
-    // Add sources.
-    ChangeSet changeSet = new ChangeSet();
-    for (String path in options.sourceFiles) {
-      if (AnalysisEngine.isDartFileName(path)) {
-        File file = resourceProvider.getFile(path);
-        if (!file.exists) {
-          errorSink.writeln('File not found: $path');
-          io.exitCode = ErrorSeverity.ERROR.ordinal;
-          return ErrorSeverity.ERROR;
-        }
-        Source source = _createSourceInContext(file);
-        explicitSources.add(source);
-        changeSet.addedSource(source);
-      }
-    }
-    context.applyChanges(changeSet);
-
-    if (!options.packageSummaryOnly) {
-      // Perform full analysis.
-      while (true) {
-        AnalysisResult analysisResult = context.performAnalysisTask();
-        if (!analysisResult.hasMoreWork) {
-          break;
-        }
-      }
-    }
-
-    // Write summary for Dart libraries.
-    if (options.packageSummaryOutput != null) {
-      PackageBundleAssembler assembler = new PackageBundleAssembler();
-      for (Source source in explicitSources) {
-        if (context.computeKindOf(source) != SourceKind.LIBRARY) {
-          continue;
-        }
-        if (pathos.isWithin(packageLibPath, source.fullName)) {
-          LibraryElement libraryElement = context.computeLibraryElement(source);
-          assembler.serializeLibraryElement(libraryElement);
-        }
-      }
-      // Write the whole package bundle.
-      PackageBundleBuilder sdkBundle = assembler.assemble();
-      io.File file = new io.File(options.packageSummaryOutput);
-      file.writeAsBytesSync(sdkBundle.toBuffer(), mode: io.FileMode.WRITE_ONLY);
-    }
-
-    if (options.packageSummaryOnly) {
-      return ErrorSeverity.NONE;
-    } else {
-      // Process errors.
-      _printErrors();
-      return _computeMaxSeverity();
-    }
-  }
-
-  ErrorSeverity _computeMaxSeverity() {
-    ErrorSeverity maxSeverity = ErrorSeverity.NONE;
-    for (Source source in explicitSources) {
-      AnalysisErrorInfo errorInfo = context.getErrors(source);
-      for (AnalysisError error in errorInfo.errors) {
-        ProcessedSeverity processedSeverity =
-            AnalyzerImpl.processError(error, options, context);
-        if (processedSeverity != null) {
-          maxSeverity = maxSeverity.max(processedSeverity.severity);
-        }
-      }
-    }
-    return maxSeverity;
-  }
-
-  void _createContext() {
-    DirectoryBasedDartSdk sdk =
-        new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
-
-    // Create the context.
-    context = AnalysisEngine.instance.createAnalysisContext();
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      new DartUriResolver(sdk),
-      new InSummaryPackageUriResolver(options.packageSummaryInputs),
-      new PackageMapUriResolver(resourceProvider, <String, List<Folder>>{
-        options.packageName: <Folder>[
-          resourceProvider.getFolder(packageLibPath)
-        ],
-      }),
-      new FileUriResolver()
-    ]);
-
-    // Set context options.
-    Driver.setAnalysisContextOptions(
-        context, options, (AnalysisOptionsImpl contextOptions) {});
-
-    // Configure using summaries.
-    sdk.useSummary = true;
-    context.typeProvider = sdk.context.typeProvider;
-    context.resultProvider =
-        new InputPackagesResultProvider(context, options.packageSummaryInputs);
-  }
-
-  /**
-   * Create and return a source representing the given [file].
-   */
-  Source _createSourceInContext(File file) {
-    Source source = file.createSource();
-    if (context == null) {
-      return source;
-    }
-    Uri uri = context.sourceFactory.restoreUri(source);
-    return file.createSource(uri);
-  }
-
-  /**
-   * Print errors for all explicit sources.
-   */
-  void _printErrors() {
-    StringSink sink = options.machineFormat ? errorSink : outSink;
-    ErrorFormatter formatter = new ErrorFormatter(
-        sink,
-        options,
-        stats,
-        (AnalysisError error) =>
-            AnalyzerImpl.processError(error, options, context));
-    for (Source source in explicitSources) {
-      AnalysisErrorInfo errorInfo = context.getErrors(source);
-      formatter.formatErrors([errorInfo]);
-    }
-    stats.print(sink);
-  }
-}
diff --git a/pkg/analyzer_cli/test/all.dart b/pkg/analyzer_cli/test/all.dart
index 1fd1dd7..13f72d1 100644
--- a/pkg/analyzer_cli/test/all.dart
+++ b/pkg/analyzer_cli/test/all.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'boot_loader_test.dart' as boot_loader;
+import 'build_mode_test.dart' as build_mode_test;
 import 'driver_test.dart' as driver;
 import 'error_test.dart' as error;
 import 'options_test.dart' as options;
@@ -16,6 +17,7 @@
 
 main() {
   boot_loader.main();
+  build_mode_test.main();
   driver.main();
   // TODO(pq): fix tests to run safely on the bots
   // https://github.com/dart-lang/sdk/issues/25001
diff --git a/pkg/analyzer_cli/test/build_mode_test.dart b/pkg/analyzer_cli/test/build_mode_test.dart
new file mode 100644
index 0000000..29c4da6
--- /dev/null
+++ b/pkg/analyzer_cli/test/build_mode_test.dart
@@ -0,0 +1,301 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer_cli.test.built_mode;
+
+import 'dart:convert';
+
+import 'package:analyzer_cli/src/build_mode.dart';
+import 'package:analyzer_cli/src/driver.dart';
+import 'package:analyzer_cli/src/options.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  defineReflectiveTests(WorkerLoopTest);
+  defineReflectiveTests(WorkInputTest);
+  defineReflectiveTests(WorkRequestTest);
+}
+
+typedef void _TestWorkerLoopAnalyze(CommandLineOptions options);
+
+@reflectiveTest
+class WorkerLoopTest {
+  final _TestWorkerConnection connection = new _TestWorkerConnection();
+
+  void setUp() {}
+
+  test_run() {
+    _setInputLine(JSON.encode({
+      'arguments': [
+        '--build-summary-input=/tmp/1.sum',
+        '--build-summary-input=/tmp/2.sum',
+        'package:foo/foo.dart|/inputs/foo/lib/foo.dart',
+        'package:foo/bar.dart|/inputs/foo/lib/bar.dart'
+      ],
+    }));
+    new _TestWorkerLoop(connection, (CommandLineOptions options) {
+      expect(options.buildSummaryInputs,
+          unorderedEquals(['/tmp/1.sum', '/tmp/2.sum']));
+      expect(
+          options.sourceFiles,
+          unorderedEquals([
+            'package:foo/foo.dart|/inputs/foo/lib/foo.dart',
+            'package:foo/bar.dart|/inputs/foo/lib/bar.dart'
+          ]));
+      outSink.writeln('outSink a');
+      errorSink.writeln('errorSink a');
+      outSink.writeln('outSink b');
+      errorSink.writeln('errorSink b');
+    }).run();
+    expect(connection.outputList, hasLength(1));
+    expect(connection.outputList[0], {
+      'exit_code': WorkerLoop.EXIT_CODE_OK,
+      'output': allOf(contains('errorSink a'), contains('errorSink a'),
+          contains('outSink a'), contains('outSink b'))
+    });
+  }
+
+  test_run_invalidOptions() {
+    _setInputLine(JSON.encode({
+      'arguments': ['--unknown-option', '/foo.dart', '/bar.dart',],
+    }));
+    new _TestWorkerLoop(connection).run();
+    expect(connection.outputList, hasLength(1));
+    expect(connection.outputList[0],
+        {'exit_code': WorkerLoop.EXIT_CODE_ERROR, 'output': anything});
+  }
+
+  test_run_invalidRequest_noArgumentsInputs() {
+    _setInputLine('{}');
+    new _TestWorkerLoop(connection).run();
+    expect(connection.outputList, hasLength(1));
+    expect(connection.outputList[0],
+        {'exit_code': WorkerLoop.EXIT_CODE_ERROR, 'output': anything});
+  }
+
+  test_run_invalidRequest_notJson() {
+    _setInputLine('not a JSON string');
+    new _TestWorkerLoop(connection).run();
+    expect(connection.outputList, hasLength(1));
+    expect(connection.outputList[0],
+        {'exit_code': WorkerLoop.EXIT_CODE_ERROR, 'output': anything});
+  }
+
+  test_run_stopAtEOF() {
+    when(connection.readLineSync()).thenReturnList([null]);
+    new _TestWorkerLoop(connection).run();
+  }
+
+  void _setInputLine(String line) {
+    when(connection.readLineSync()).thenReturnList([line, null]);
+  }
+}
+
+@reflectiveTest
+class WorkInputTest {
+  test_fromJson() {
+    WorkInput input = new WorkInput.fromJson({
+      'path': '/my/path',
+      'digest': [1, 2, 3, 4, 5]
+    });
+    expect(input.path, '/my/path');
+    expect(input.digest, <int>[1, 2, 3, 4, 5]);
+  }
+
+  test_fromJson_digest_isMissing() {
+    WorkInput input = new WorkInput.fromJson({'path': '/my/path',});
+    expect(input.path, '/my/path');
+    expect(input.digest, <int>[]);
+  }
+
+  test_fromJson_digest_isNotList() {
+    expect(() {
+      new WorkInput.fromJson({'path': '/my/path', 'digest': 0});
+    }, throwsArgumentError);
+  }
+
+  test_fromJson_digest_isNotListOfInt() {
+    expect(() {
+      new WorkInput.fromJson({
+        'path': '/my/path',
+        'digest': ['a', 'b', 'c']
+      });
+    }, throwsArgumentError);
+  }
+
+  test_fromJson_path_isMissing() {
+    expect(() {
+      new WorkInput.fromJson({
+        'digest': [1, 2, 3, 4, 5]
+      });
+    }, throwsArgumentError);
+  }
+
+  test_fromJson_path_isNotString() {
+    expect(() {
+      new WorkInput.fromJson({
+        'path': 0,
+        'digest': [1, 2, 3, 4, 5]
+      });
+    }, throwsArgumentError);
+  }
+
+  test_toJson() {
+    WorkInput input = new WorkInput('/my/path', <int>[1, 2, 3, 4, 5]);
+    Map<String, Object> json = input.toJson();
+    expect(json, {
+      'path': '/my/path',
+      'digest': [1, 2, 3, 4, 5]
+    });
+  }
+
+  test_toJson_withoutDigest() {
+    WorkInput input = new WorkInput('/my/path', null);
+    Map<String, Object> json = input.toJson();
+    expect(json, {'path': '/my/path'});
+  }
+}
+
+@reflectiveTest
+class WorkRequestTest {
+  test_fromJson() {
+    WorkRequest request = new WorkRequest.fromJson({
+      'arguments': ['--arg1', '--arg2', '--arg3'],
+      'inputs': [
+        {
+          'path': '/my/path1',
+          'digest': [11, 12, 13]
+        },
+        {
+          'path': '/my/path2',
+          'digest': [21, 22, 23]
+        }
+      ]
+    });
+    expect(request.arguments, ['--arg1', '--arg2', '--arg3']);
+    expect(request.inputs, hasLength(2));
+    expect(request.inputs[0].path, '/my/path1');
+    expect(request.inputs[0].digest, <int>[11, 12, 13]);
+    expect(request.inputs[1].path, '/my/path2');
+    expect(request.inputs[1].digest, <int>[21, 22, 23]);
+  }
+
+  test_fromJson_arguments_isMissing() {
+    WorkRequest request = new WorkRequest.fromJson({
+      'inputs': [
+        {
+          'path': '/my/path1',
+          'digest': [11, 12, 13]
+        },
+      ]
+    });
+    expect(request.arguments, isEmpty);
+    expect(request.inputs, hasLength(1));
+    expect(request.inputs[0].path, '/my/path1');
+    expect(request.inputs[0].digest, <int>[11, 12, 13]);
+  }
+
+  test_fromJson_arguments_isNotList() {
+    expect(() {
+      new WorkRequest.fromJson({'arguments': 0, 'inputs': []});
+    }, throwsArgumentError);
+  }
+
+  test_fromJson_arguments_isNotListOfString() {
+    expect(() {
+      new WorkRequest.fromJson({
+        'arguments': [0, 1, 2],
+        'inputs': []
+      });
+    }, throwsArgumentError);
+  }
+
+  test_fromJson_inputs_isMissing() {
+    WorkRequest request = new WorkRequest.fromJson({
+      'arguments': ['--arg1', '--arg2', '--arg3'],
+    });
+    expect(request.arguments, ['--arg1', '--arg2', '--arg3']);
+    expect(request.inputs, hasLength(0));
+  }
+
+  test_fromJson_inputs_isNotList() {
+    expect(() {
+      new WorkRequest.fromJson({
+        'arguments': ['--arg1', '--arg2', '--arg3'],
+        'inputs': 0
+      });
+    }, throwsArgumentError);
+  }
+
+  test_fromJson_inputs_isNotListOfObject() {
+    expect(() {
+      new WorkRequest.fromJson({
+        'arguments': ['--arg1', '--arg2', '--arg3'],
+        'inputs': [0, 1, 2]
+      });
+    }, throwsArgumentError);
+  }
+
+  test_fromJson_noArgumentsInputs() {
+    expect(() {
+      new WorkRequest.fromJson({});
+    }, throwsArgumentError);
+  }
+
+  test_toJson() {
+    WorkRequest request = new WorkRequest(<String>[
+      '--arg1',
+      '--arg2',
+      '--arg3'
+    ], <WorkInput>[
+      new WorkInput('/my/path1', <int>[11, 12, 13]),
+      new WorkInput('/my/path2', <int>[21, 22, 23])
+    ]);
+    Map<String, Object> json = request.toJson();
+    expect(json, {
+      'arguments': ['--arg1', '--arg2', '--arg3'],
+      'inputs': [
+        {
+          'path': '/my/path1',
+          'digest': [11, 12, 13]
+        },
+        {
+          'path': '/my/path2',
+          'digest': [21, 22, 23]
+        }
+      ]
+    });
+  }
+}
+
+/**
+ * [WorkerConnection] mock.
+ */
+class _TestWorkerConnection extends TypedMock implements WorkerConnection {
+  final outputList = <Map<String, Object>>[];
+
+  @override
+  void writeJson(Map<String, Object> json) {
+    outputList.add(json);
+  }
+}
+
+/**
+ * [WorkerLoop] for testing.
+ */
+class _TestWorkerLoop extends WorkerLoop {
+  final _TestWorkerLoopAnalyze _analyze;
+
+  _TestWorkerLoop(WorkerConnection connection, [this._analyze])
+      : super(connection);
+
+  @override
+  void analyze(CommandLineOptions options) {
+    if (_analyze != null) {
+      _analyze(options);
+    }
+  }
+}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 244788c..efd6362 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -252,8 +252,7 @@
               outSink.toString(),
               contains(
                   "[error] This function declares a return type of 'int'"));
-          expect(outSink.toString(),
-              contains("1 error and 1 warning found."));
+          expect(outSink.toString(), contains("1 error and 1 warning found."));
         });
 
         test('language', () {
@@ -280,12 +279,54 @@
           // Should not be made fatal by `--fatal-warnings`.
           expect(outSink.toString(),
               contains("[warning] The function 'baz' is not defined"));
-          expect(outSink.toString(),
-              contains("1 error and 1 warning found."));
+          expect(outSink.toString(), contains("1 error and 1 warning found."));
         });
       });
     });
 
+    group('build-mode', () {
+      // Shared driver command.
+      void doDrive(String filePath, {List<String> additionalArgs: const []}) {
+        drive('file:///test_file.dart|$filePath',
+            args: [
+              '--dart-sdk',
+              findSdkDirForSummaries(),
+              '--build-mode',
+              '--machine'
+            ]..addAll(additionalArgs),
+            options: 'data/options_tests_project/.analysis_options');
+      }
+
+      test('no stats', () {
+        doDrive('data/test_file.dart');
+        // Should not print stat summary.
+        expect(outSink.toString(), isEmpty);
+        expect(errorSink.toString(), isEmpty);
+        expect(exitCode, 0);
+      });
+
+      test(
+          'Fails if file not found, even when --build-suppress-exit-code is given',
+          () {
+        doDrive('data/non_existent_file.dart',
+            additionalArgs: ['--build-suppress-exit-code']);
+        expect(exitCode, isNot(0));
+      });
+
+      test('Fails if there are errors', () {
+        doDrive('data/file_with_error.dart');
+        expect(exitCode, isNot(0));
+      });
+
+      test(
+          'Succeeds if there are errors, when --build-suppress-exit-code is given',
+          () {
+        doDrive('data/file_with_error.dart',
+            additionalArgs: ['--build-suppress-exit-code']);
+        expect(exitCode, 0);
+      });
+    });
+
 //TODO(pq): fix to be bot-friendly (sdk#25258).
 //    group('in temp directory', () {
 //      Directory savedCurrentDirectory;
@@ -348,8 +389,6 @@
 //      });
 //    });
   });
-
-
 }
 
 const emptyOptionsFile = 'data/empty_options.yaml';
@@ -360,8 +399,14 @@
 List<ErrorProcessor> get processors =>
     driver.context.getConfigurationData(CONFIGURED_ERROR_PROCESSORS);
 
-ErrorProcessor processorFor(AnalysisError error) =>
-    processors.firstWhere((p) => p.appliesTo(error));
+/// Convert a file specification from a relative path to an absolute path.
+/// Handles the case where the file specification is of the form "$uri|$path".
+String adjustFileSpec(String fileSpec) {
+  int uriPrefixLength = fileSpec.indexOf('|') + 1;
+  String uriPrefix = fileSpec.substring(0, uriPrefixLength);
+  String relativePath = fileSpec.substring(uriPrefixLength);
+  return '$uriPrefix${path.join(testDirectory, relativePath)}';
+}
 
 /// Start a driver for the given [source], optionally providing additional
 /// [args] and an [options] file path.  The value of [options] defaults to
@@ -373,14 +418,60 @@
   var cmd = [
     '--options',
     path.join(testDirectory, options),
-    path.join(testDirectory, source)
+    adjustFileSpec(source)
   ]..addAll(args);
   driver.start(cmd);
 }
 
+/// Try to find a appropriate directory to pass to "--dart-sdk" that will
+/// allow summaries to be found.
+String findSdkDirForSummaries() {
+  Set<String> triedDirectories = new Set<String>();
+  bool isSuitable(String sdkDir) {
+    triedDirectories.add(sdkDir);
+    return new File(path.join(sdkDir, 'lib', '_internal', 'spec.sum'))
+        .existsSync();
+  }
+  // Usually the sdk directory is the parent of the parent of the "dart"
+  // executable.
+  Directory executableParent = new File(Platform.executable).parent;
+  Directory executableGrandparent = executableParent.parent;
+  if (isSuitable(executableGrandparent.path)) {
+    return executableGrandparent.path;
+  }
+  // During buildbot execution, the sdk directory is simply the parent of the
+  // "dart" executable.
+  if (isSuitable(executableParent.path)) {
+    return executableParent.path;
+  }
+  // If neither of those are suitable, assume we are running locally within the
+  // SDK project (e.g. within an IDE).  Find the build output directory and
+  // search all built configurations.
+  Directory sdkRootDir =
+      new File(Platform.script.toFilePath()).parent.parent.parent.parent;
+  for (String outDirName in ['out', 'xcodebuild']) {
+    Directory outDir = new Directory(path.join(sdkRootDir.path, outDirName));
+    if (outDir.existsSync()) {
+      for (FileSystemEntity subdir in outDir.listSync()) {
+        if (subdir is Directory) {
+          String candidateSdkDir = path.join(subdir.path, 'dart-sdk');
+          if (isSuitable(candidateSdkDir)) {
+            return candidateSdkDir;
+          }
+        }
+      }
+    }
+  }
+  throw new Exception('Could not find an SDK directory containing summaries.'
+      '  Tried: ${triedDirectories.toList()}');
+}
+
 Map<String, YamlNode> parseOptions(String src) =>
     new AnalysisOptionsProvider().getOptionsFromString(src);
 
+ErrorProcessor processorFor(AnalysisError error) =>
+    processors.firstWhere((p) => p.appliesTo(error));
+
 class TestPlugin extends Plugin {
   TestProcessor processor;
   TestPlugin(this.processor);
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 39e863a..63354da 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -19,6 +19,13 @@
         CommandLineOptions options =
             CommandLineOptions.parse(['--dart-sdk', '.', 'foo.dart']);
         expect(options, isNotNull);
+        expect(options.buildMode, isFalse);
+        expect(options.buildAnalysisOutput, isNull);
+        expect(options.buildSummaryFallback, isFalse);
+        expect(options.buildSummaryInputs, isEmpty);
+        expect(options.buildSummaryOnly, isFalse);
+        expect(options.buildSummaryOutput, isNull);
+        expect(options.buildSuppressExitCode, isFalse);
         expect(options.dartSdkPath, isNotNull);
         expect(options.disableHints, isFalse);
         expect(options.lints, isFalse);
@@ -31,9 +38,7 @@
         expect(options.ignoreUnrecognizedFlags, isFalse);
         expect(options.log, isFalse);
         expect(options.machineFormat, isFalse);
-        expect(options.packageMode, isFalse);
         expect(options.packageRootPath, isNull);
-        expect(options.packageSummaryInputs, isEmpty);
         expect(options.shouldBatch, isFalse);
         expect(options.showPackageWarnings, isFalse);
         expect(options.showSdkWarnings, isFalse);
@@ -231,45 +236,84 @@
 class CommandLineOptionsTest extends AbstractStatusTest {
   CommandLineOptions options;
 
-  test_packageMode() {
-    _parse(['--package-mode', '/path/to/pkg']);
-    expect(options.packageMode, isTrue);
-    print(options.packageSummaryInputs);
+  test_buildAnalysisOutput() {
+    _parse([
+      '--build-mode',
+      '--build-analysis-output=//path/to/output.analysis',
+      'package:p/foo.dart|/path/to/p/lib/foo.dart'
+    ]);
+    expect(options.buildMode, isTrue);
+    expect(options.buildAnalysisOutput, '//path/to/output.analysis');
   }
 
-  test_packageSummaryInput() {
-    _parse([
-      '--package-mode',
-      '--package-summary-input=aaa,/path/to/aaa.sum',
-      '--package-summary-input=long.package.bbb,/path/to/bbb.sum',
-      '/path/to/pkg'
-    ]);
-    expect(options.packageMode, isTrue);
-    Map<String, String> map = options.packageSummaryInputs;
-    expect(map, hasLength(2));
-    expect(map, containsPair('aaa', '/path/to/aaa.sum'));
-    expect(map, containsPair('long.package.bbb', '/path/to/bbb.sum'));
+  test_buildMode() {
+    _parse(['--build-mode', 'package:p/foo.dart|/path/to/p/lib/foo.dart']);
+    expect(options.buildMode, isTrue);
   }
 
-  test_packageSummaryInput_noComma() {
+  test_buildSummaryFallback() {
     _parse([
-      '--package-mode',
-      '--package-summary-input=noCommaInMapping',
-      '/path/to/pkg'
+      '--build-mode',
+      '--build-summary-output=//path/to/output.sum',
+      '--build-summary-fallback',
+      'package:p/foo.dart|/path/to/p/lib/foo.dart'
     ]);
-    expect(lastExitHandlerCode, 15);
-    expect(errorStringBuffer.toString(), contains('--package-summary-input'));
-    expect(errorStringBuffer.toString(), contains('noCommaInMapping'));
+    expect(options.buildMode, isTrue);
+    expect(options.buildSummaryFallback, isTrue);
   }
 
-  test_packageSummaryOutput() {
+  test_buildSummaryInputs_commaSeparated() {
     _parse([
-      '--package-mode',
-      '--package-summary-output=/path/to/output.sum',
-      '/path/to/pkg'
+      '--build-mode',
+      '--build-summary-input=/path/to/aaa.sum,/path/to/bbb.sum',
+      'package:p/foo.dart|/path/to/p/lib/foo.dart'
     ]);
-    expect(options.packageMode, isTrue);
-    expect(options.packageSummaryOutput, '/path/to/output.sum');
+    expect(options.buildMode, isTrue);
+    expect(
+        options.buildSummaryInputs, ['/path/to/aaa.sum', '/path/to/bbb.sum']);
+  }
+
+  test_buildSummaryInputs_separateFlags() {
+    _parse([
+      '--build-mode',
+      '--build-summary-input=/path/to/aaa.sum',
+      '--build-summary-input=/path/to/bbb.sum',
+      'package:p/foo.dart|/path/to/p/lib/foo.dart'
+    ]);
+    expect(options.buildMode, isTrue);
+    expect(
+        options.buildSummaryInputs, ['/path/to/aaa.sum', '/path/to/bbb.sum']);
+  }
+
+  test_buildSummaryOnly() {
+    _parse([
+      '--build-mode',
+      '--build-summary-output=/path/to/aaa.sum',
+      '--build-summary-only',
+      'package:p/foo.dart|/path/to/p/lib/foo.dart'
+    ]);
+    expect(options.buildMode, isTrue);
+    expect(options.buildSummaryOnly, isTrue);
+  }
+
+  test_buildSummaryOutput() {
+    _parse([
+      '--build-mode',
+      '--build-summary-output=//path/to/output.sum',
+      'package:p/foo.dart|/path/to/p/lib/foo.dart'
+    ]);
+    expect(options.buildMode, isTrue);
+    expect(options.buildSummaryOutput, '//path/to/output.sum');
+  }
+
+  test_buildSuppressExitCode() {
+    _parse([
+      '--build-mode',
+      '--build-suppress-exit-code',
+      'package:p/foo.dart|/path/to/p/lib/foo.dart'
+    ]);
+    expect(options.buildMode, isTrue);
+    expect(options.buildSuppressExitCode, isTrue);
   }
 
   void _parse(List<String> args) {
diff --git a/pkg/analyzer_cli/test/package_prefix_test.dart b/pkg/analyzer_cli/test/package_prefix_test.dart
index 1ba203f..22d71e1 100644
--- a/pkg/analyzer_cli/test/package_prefix_test.dart
+++ b/pkg/analyzer_cli/test/package_prefix_test.dart
@@ -2,6 +2,7 @@
 
 import 'package:analyzer_cli/src/driver.dart' show Driver, outSink, errorSink;
 import 'package:analyzer_cli/src/options.dart' show ExitHandler, exitHandler;
+import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart' show testDirectory;
@@ -22,14 +23,14 @@
     test('shows only the hint whose package matches the prefix', () {
       runner.run([
         "--packages",
-        "$testDirectory/data/package_prefix/packagelist",
+        join(testDirectory, 'data', 'package_prefix', 'packagelist'),
         "--x-package-warnings-prefix=f",
-        "$testDirectory/data/package_prefix/main.dart"
+        join(testDirectory, 'data', 'package_prefix', 'main.dart')
       ]);
-      print("ran it");
       expect(runner.stdout, contains('1 hint found'));
       expect(runner.stdout, contains('Unused import'));
-      expect(runner.stdout, contains('package_prefix/pkg/foo/foo.dart'));
+      expect(runner.stdout,
+          contains(join('package_prefix', 'pkg', 'foo', 'foo.dart')));
       expect(runner.stdout, isNot(contains('bar.dart')));
     });
   });
@@ -54,6 +55,9 @@
     exitHandler = (_) {};
   }
 
+  String get stderr => _stderr.toString();
+
+  String get stdout => _stdout.toString();
   void run(List<String> args) {
     new Driver().start(args);
     if (stderr.isNotEmpty) {
@@ -61,9 +65,6 @@
     }
   }
 
-  String get stdout => _stdout.toString();
-  String get stderr => _stderr.toString();
-
   void tearDown() {
     outSink = _savedOutSink;
     errorSink = _savedErrorSink;
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 42eda64..9e28d01 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -26,18 +26,11 @@
 import 'diagnostics/messages.dart' show
     Message;
 import 'elements/elements.dart' as elements;
+import 'environment.dart';
 import 'io/source_file.dart';
 import 'platform_configuration.dart' as platform_configuration;
 import 'script.dart';
 
-/// For every 'dart:' library, a corresponding environment variable is set
-/// to "true". The environment variable's name is the concatenation of
-/// this prefix and the name (without the 'dart:'.
-///
-/// For example 'dart:html' has the environment variable 'dart.library.html' set
-/// to "true".
-const String dartLibraryEnvironmentPrefix = 'dart.library.';
-
 
 /// Implements the [Compiler] using a [api.CompilerInput] for supplying the
 /// sources.
@@ -60,7 +53,10 @@
 
   CompilerImpl(this.provider, api.CompilerOutput outputProvider,
       this.handler, api.CompilerOptions options)
-      : super(options: options, outputProvider: outputProvider) {
+      : super(options: options, outputProvider: outputProvider,
+          environment: new _Environment(options.environment)) {
+    _Environment env = environment;
+    env.compiler = this;
     tasks.addAll([
         userHandlerTask = new GenericTask('Diagnostic handler', this),
         userProviderTask = new GenericTask('Input provider', this),
@@ -87,7 +83,7 @@
   /**
    * Reads the script designated by [readableUri].
    */
-  Future<Script> readScript(Spannable node, Uri readableUri) {
+  Future<Script> readScript(Uri readableUri, [Spannable node]) {
     if (!readableUri.isAbsolute) {
       if (node == null) node = NO_LOCATION_SPANNABLE;
       reporter.internalError(node,
@@ -115,7 +111,7 @@
     }
 
     Uri resourceUri = translateUri(node, readableUri);
-    if (resourceUri == null) return synthesizeScript(node, readableUri);
+    if (resourceUri == null) return _synthesizeScript(readableUri);
     if (resourceUri.scheme == 'dart-ext') {
       if (!options.allowNativeExtensions) {
         reporter.withCurrentElement(element, () {
@@ -123,7 +119,7 @@
               node, MessageKind.DART_EXT_NOT_SUPPORTED);
         });
       }
-      return synthesizeScript(node, readableUri);
+      return _synthesizeScript(readableUri);
     }
 
     // TODO(johnniwinther): Wrap the result from [provider] in a specialized
@@ -147,18 +143,12 @@
       return new Script(readableUri, resourceUri, sourceFile);
     }).catchError((error) {
       reportReadError(error);
-      return synthesizeScript(node, readableUri);
+      return _synthesizeScript(readableUri);
     });
   }
 
-  Future<Script> synthesizeScript(Spannable node, Uri readableUri) {
-    return new Future.value(
-        new Script(
-            readableUri, readableUri,
-            new StringSourceFile.fromUri(
-                readableUri,
-                "// Synthetic source file generated for '$readableUri'."),
-            isSynthesized: true));
+  Future<Script> _synthesizeScript(Uri readableUri) {
+    return new Future.value(new Script.synthetic(readableUri));
   }
 
   /**
@@ -166,12 +156,8 @@
    *
    * See [LibraryLoader] for terminology on URIs.
    */
-  Uri translateUri(Spannable node, Uri readableUri) {
-    switch (readableUri.scheme) {
-      case 'package': return translatePackageUri(node, readableUri);
-      default: return readableUri;
-    }
-  }
+  Uri translateUri(Spannable node, Uri uri) =>
+      uri.scheme == 'package' ? translatePackageUri(node, uri) : uri;
 
   /// Translates "resolvedUri" with scheme "dart" to a [uri] resolved relative
   /// to `options.platformConfigUri` according to the information in the file at
@@ -380,59 +366,18 @@
 
   void callUserHandler(Message message, Uri uri, int begin, int end,
                        String text, api.Diagnostic kind) {
-    try {
-      userHandlerTask.measure(() {
-        handler.report(message, uri, begin, end, text, kind);
-      });
-    } catch (ex, s) {
-      diagnoseCrashInUserCode(
-          'Uncaught exception in diagnostic handler', ex, s);
-      rethrow;
-    }
+    userHandlerTask.measure(() {
+      handler.report(message, uri, begin, end, text, kind);
+    });
   }
 
   Future callUserProvider(Uri uri) {
-    try {
-      return userProviderTask.measure(() => provider.readFromUri(uri));
-    } catch (ex, s) {
-      diagnoseCrashInUserCode('Uncaught exception in input provider', ex, s);
-      rethrow;
-    }
+    return userProviderTask.measure(() => provider.readFromUri(uri));
   }
 
   Future<Packages> callUserPackagesDiscovery(Uri uri) {
-    try {
-      return userPackagesDiscoveryTask.measure(
-                 () => options.packagesDiscoveryProvider(uri));
-    } catch (ex, s) {
-      diagnoseCrashInUserCode('Uncaught exception in package discovery', ex, s);
-      rethrow;
-    }
-  }
-
-  fromEnvironment(String name) {
-    assert(invariant(NO_LOCATION_SPANNABLE,
-        sdkLibraries != null, message: "setupSdk() has not been run"));
-
-    var result = options.environment[name];
-    if (result != null || options.environment.containsKey(name)) return result;
-    if (!name.startsWith(dartLibraryEnvironmentPrefix)) return null;
-
-    String libraryName = name.substring(dartLibraryEnvironmentPrefix.length);
-
-    // Private libraries are not exposed to the users.
-    if (libraryName.startsWith("_")) return null;
-
-    if (sdkLibraries.containsKey(libraryName)) {
-      // Dart2js always "supports" importing 'dart:mirrors' but will abort
-      // the compilation at a later point if the backend doesn't support
-      // mirrors. In this case 'mirrors' should not be in the environment.
-      if (libraryName == 'mirrors') {
-        return backend.supportsReflection ? "true" : null;
-      }
-      return "true";
-    }
-    return null;
+    return userPackagesDiscoveryTask.measure(
+        () => options.packagesDiscoveryProvider(uri));
   }
 
   Uri lookupLibraryUri(String libraryName) {
@@ -445,3 +390,47 @@
     return backend.resolvePatchUri(libraryName, options.platformConfigUri);
   }
 }
+
+class _Environment implements Environment {
+  final Map<String, String> definitions;
+
+  // TODO(sigmund): break the circularity here: Compiler needs an environment to
+  // intialize the library loader, but the environment here needs to know about
+  // how the sdk is set up and about whether the backend supports mirrors.
+  CompilerImpl compiler;
+
+  _Environment(this.definitions);
+
+  String valueOf(String name) {
+    assert(invariant(NO_LOCATION_SPANNABLE,
+        compiler.sdkLibraries != null, message: "setupSdk() has not been run"));
+
+    var result = definitions[name];
+    if (result != null || definitions.containsKey(name)) return result;
+    if (!name.startsWith(_dartLibraryEnvironmentPrefix)) return null;
+
+    String libraryName = name.substring(_dartLibraryEnvironmentPrefix.length);
+
+    // Private libraries are not exposed to the users.
+    if (libraryName.startsWith("_")) return null;
+
+    if (compiler.sdkLibraries.containsKey(libraryName)) {
+      // Dart2js always "supports" importing 'dart:mirrors' but will abort
+      // the compilation at a later point if the backend doesn't support
+      // mirrors. In this case 'mirrors' should not be in the environment.
+      if (libraryName == 'mirrors') {
+        return compiler.backend.supportsReflection ? "true" : null;
+      }
+      return "true";
+    }
+    return null;
+  }
+}
+
+/// For every 'dart:' library, a corresponding environment variable is set
+/// to "true". The environment variable's name is the concatenation of
+/// this prefix and the name (without the 'dart:'.
+///
+/// For example 'dart:html' has the environment variable 'dart.library.html' set
+/// to "true".
+const String _dartLibraryEnvironmentPrefix = 'dart.library.';
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 3152635..b49fdd0 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -73,6 +73,7 @@
     EnqueueTask,
     ResolutionEnqueuer,
     QueueFilter;
+import 'environment.dart';
 import 'io/source_information.dart' show
     SourceInformation;
 import 'js_backend/backend_helpers.dart' as js_backend show
@@ -80,9 +81,13 @@
 import 'js_backend/js_backend.dart' as js_backend show
     JavaScriptBackend;
 import 'library_loader.dart' show
+    ElementScanner,
     LibraryLoader,
     LibraryLoaderTask,
-    LoadedLibraries;
+    LoadedLibraries,
+    LibraryLoaderListener,
+    ResolvedUriTranslator,
+    ScriptLoader;
 import 'mirrors_used.dart' show
     MirrorUsageAnalyzerTask;
 import 'common/names.dart' show
@@ -146,7 +151,7 @@
 import 'world.dart' show
     World;
 
-abstract class Compiler {
+abstract class Compiler implements LibraryLoaderListener {
 
   final Stopwatch totalCompileTime = new Stopwatch();
   int nextFreeClassId = 0;
@@ -280,7 +285,11 @@
   /// Tracks elements with compile-time errors.
   final Set<Element> elementsWithCompileTimeErrors = new Set<Element>();
 
-  fromEnvironment(String name) => null;
+  final Environment environment;
+  // TODO(sigmund): delete once we migrate the rest of the compiler to use
+  // `environment` directly.
+  @deprecated
+  fromEnvironment(String name) => environment.valueOf(name);
 
   Element get currentElement => _reporter.currentElement;
 
@@ -348,7 +357,8 @@
   }
 
   Compiler({api.CompilerOptions options,
-            api.CompilerOutput outputProvider})
+            api.CompilerOutput outputProvider,
+            this.environment: const _EmptyEnvironment()})
       : this.options = options,
         this.cacheStrategy = new CacheStrategy(options.hasIncrementalSupport),
         this.userOutputProvider = outputProvider == null
@@ -389,16 +399,22 @@
     }
 
     tasks = [
-      libraryLoader = new LibraryLoaderTask(this),
-      serialization = new SerializationTask(this),
-      scanner = new ScannerTask(this),
       dietParser = new DietParserTask(
           this, enableConditionalDirectives: options.enableConditionalDirectives),
-      parser = new ParserTask(
-          this, enableConditionalDirectives: options.enableConditionalDirectives),
+      scanner = createScannerTask(),
+      serialization = new SerializationTask(this),
+      libraryLoader = new LibraryLoaderTask(this,
+          new _ResolvedUriTranslator(this),
+          new _ScriptLoader(this),
+          new _ElementScanner(scanner),
+          this.serialization,
+          this,
+          environment),
+      parser = new ParserTask(this,
+          enableConditionalDirectives: options.enableConditionalDirectives),
       patchParser = new PatchParserTask(
           this, enableConditionalDirectives: options.enableConditionalDirectives),
-      resolver = new ResolverTask(this, backend.constantCompilerTask),
+      resolver = createResolverTask(),
       closureToClassMapper = new closureMapping.ClosureTask(this),
       checker = new TypeCheckerTask(this),
       typesTask = new ti.TypesTask(this),
@@ -413,6 +429,18 @@
     tasks.addAll(backend.tasks);
   }
 
+  /// Creates the scanner task.
+  ///
+  /// Override this to mock the scanner for testing.
+  ScannerTask createScannerTask() => new ScannerTask(this);
+
+  /// Creates the resolver task.
+  ///
+  /// Override this to mock the resolver for testing.
+  ResolverTask createResolverTask() {
+    return new ResolverTask(this, backend.constantCompilerTask);
+  }
+
   Universe get resolverWorld => enqueuer.resolution.universe;
   Universe get codegenWorld => enqueuer.codegen.universe;
 
@@ -1151,6 +1179,7 @@
     }
   }
 
+  // TODO(sigmund): move this dart doc somewhere else too.
   /**
    * Translates the [resolvedUri] into a readable URI.
    *
@@ -1175,18 +1204,11 @@
    *
    * See [LibraryLoader] for terminology on URIs.
    */
-  Future<Script> readScript(Spannable node, Uri readableUri) {
+  Future<Script> readScript(Uri readableUri, [Spannable node]) {
     unimplemented(node, 'Compiler.readScript');
     return null;
   }
 
-  /// Compatible with [readScript] and used by [LibraryLoader] to create
-  /// synthetic scripts to recover from read errors and bad URIs.
-  Future<Script> synthesizeScript(Spannable node, Uri readableUri) {
-    unimplemented(node, 'Compiler.synthesizeScript');
-    return null;
-  }
-
   Element lookupElementIn(ScopeContainerElement container, String name) {
     Element element = container.localLookup(name);
     if (element == null) {
@@ -1321,10 +1343,6 @@
     return libraryUri;
   }
 
-  void diagnoseCrashInUserCode(String message, exception, stackTrace) {
-    // Overridden by Compiler in apiimpl.dart.
-  }
-
   void forgetElement(Element element) {
     enqueuer.forgetElement(element);
     if (element is MemberElement) {
@@ -2094,3 +2112,35 @@
     return _otherDependencies != null ? _otherDependencies : const <Element>[];
   }
 }
+
+// TODO(sigmund): in the future, each of these classes should be self contained
+// and not use references to `compiler`.
+class _ResolvedUriTranslator implements ResolvedUriTranslator {
+  Compiler compiler;
+  _ResolvedUriTranslator(this.compiler);
+
+  Uri translate(LibraryElement importingLibrary, Uri resolvedUri,
+      [Spannable spannable]) =>
+    compiler.translateResolvedUri(importingLibrary, resolvedUri, spannable);
+}
+
+class _ScriptLoader implements ScriptLoader {
+  Compiler compiler;
+  _ScriptLoader(this.compiler);
+
+  Future<Script> readScript(Uri uri, [Spannable spannable]) =>
+      compiler.readScript(uri, spannable);
+}
+
+class _ElementScanner implements ElementScanner {
+  ScannerTask scanner;
+  _ElementScanner(this.scanner);
+  void scanLibrary(LibraryElement library) => scanner.scanLibrary(library);
+  void scanUnit(CompilationUnitElement unit) => scanner.scan(unit);
+}
+
+class _EmptyEnvironment implements Environment {
+  const _EmptyEnvironment();
+
+  String valueOf(String key) => null;
+}
diff --git a/pkg/compiler/lib/src/dart_types.dart b/pkg/compiler/lib/src/dart_types.dart
index 23080fc..8df9c18 100644
--- a/pkg/compiler/lib/src/dart_types.dart
+++ b/pkg/compiler/lib/src/dart_types.dart
@@ -352,6 +352,8 @@
               this.typeArguments,
               {bool checkTypeArgumentCount: true})
       : this.element = element {
+    assert(invariant(CURRENT_ELEMENT_SPANNABLE, element != null,
+        message: "Missing element for generic type."));
     assert(invariant(element, () {
         if (!checkTypeArgumentCount) return true;
         if (element is TypeDeclarationElementX) {
diff --git a/pkg/compiler/lib/src/elements/common.dart b/pkg/compiler/lib/src/elements/common.dart
index 5d5f9e6..6c2e843 100644
--- a/pkg/compiler/lib/src/elements/common.dart
+++ b/pkg/compiler/lib/src/elements/common.dart
@@ -510,3 +510,37 @@
     return true;
   }
 }
+
+abstract class MixinApplicationElementCommon
+    implements MixinApplicationElement {
+  Link<ConstructorElement> get constructors {
+    throw new UnsupportedError('Unimplemented $this.constructors');
+  }
+
+  FunctionElement _lookupLocalConstructor(String name) {
+    for (Link<Element> link = constructors;
+         !link.isEmpty;
+         link = link.tail) {
+      if (link.head.name == name) return link.head;
+    }
+    return null;
+  }
+
+  @override
+  Element localLookup(String name) {
+    Element constructor = _lookupLocalConstructor(name);
+    if (constructor != null) return constructor;
+    if (mixin == null) return null;
+    Element mixedInElement = mixin.localLookup(name);
+    if (mixedInElement == null) return null;
+    return mixedInElement.isInstanceMember ? mixedInElement : null;
+  }
+
+  @override
+  void forEachLocalMember(void f(Element member)) {
+    constructors.forEach(f);
+    if (mixin != null) mixin.forEachLocalMember((Element mixedInElement) {
+      if (mixedInElement.isInstanceMember) f(mixedInElement);
+    });
+  }
+}
\ No newline at end of file
diff --git a/pkg/compiler/lib/src/elements/elements.dart b/pkg/compiler/lib/src/elements/elements.dart
index 469081c..2e70d1f31 100644
--- a/pkg/compiler/lib/src/elements/elements.dart
+++ b/pkg/compiler/lib/src/elements/elements.dart
@@ -1505,8 +1505,6 @@
 abstract class MixinApplicationElement extends ClassElement {
   ClassElement get mixin;
   InterfaceType get mixinType;
-  void set mixinType(InterfaceType value);
-  void addConstructor(FunctionElement constructor);
 }
 
 /// Enum declaration.
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index cfc0dcb..214b25d 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -2881,8 +2881,8 @@
 }
 
 abstract class MixinApplicationElementX extends BaseClassElementX
+    with MixinApplicationElementCommon
     implements MixinApplicationElement {
-
   Link<ConstructorElement> constructors = new Link<ConstructorElement>();
 
   InterfaceType mixinType;
@@ -2906,31 +2906,6 @@
 
   Node parseNode(Parsing parsing) => node;
 
-  FunctionElement lookupLocalConstructor(String name) {
-    for (Link<Element> link = constructors;
-         !link.isEmpty;
-         link = link.tail) {
-      if (link.head.name == name) return link.head;
-    }
-    return null;
-  }
-
-  Element localLookup(String name) {
-    Element constructor = lookupLocalConstructor(name);
-    if (constructor != null) return constructor;
-    if (mixin == null) return null;
-    Element mixedInElement = mixin.localLookup(name);
-    if (mixedInElement == null) return null;
-    return mixedInElement.isInstanceMember ? mixedInElement : null;
-  }
-
-  void forEachLocalMember(void f(Element member)) {
-    constructors.forEach(f);
-    if (mixin != null) mixin.forEachLocalMember((Element mixedInElement) {
-      if (mixedInElement.isInstanceMember) f(mixedInElement);
-    });
-  }
-
   void addMember(Element element, DiagnosticReporter reporter) {
     throw new UnsupportedError("Cannot add member to $this.");
   }
diff --git a/pkg/compiler/lib/src/environment.dart b/pkg/compiler/lib/src/environment.dart
new file mode 100644
index 0000000..29c9861
--- /dev/null
+++ b/pkg/compiler/lib/src/environment.dart
@@ -0,0 +1,16 @@
+// 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.
+
+/// Collects definitions provided to the compiler via the `-D` flag.
+///
+/// Environment variables can be used in the user code in two ways. From
+/// conditional imports, and from `const String.fromEnvironment` and
+/// other similar constructors.
+abstract class Environment {
+  /// Return the string value of the given key.
+  ///
+  /// Note that `bool.fromEnvironment` and `int.fromEnvironment` are also
+  /// implemented in terms of `String.fromEnvironment`.
+  String valueOf(String key);
+}
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index 68f6008..e6eaf88 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -30,8 +30,9 @@
     LibraryDependencyElementX,
     PrefixElementX,
     SyntheticImportElement;
-
+import 'environment.dart';
 import 'script.dart';
+import 'serialization/serialization.dart' show LibraryDeserializer;
 import 'tree/tree.dart';
 import 'util/util.dart' show
     Link,
@@ -105,9 +106,9 @@
  * resolved into a readable URI using the library root URI provided from the
  * command line and the list of platform libraries found in
  * 'sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'. This is done
- * through the [Compiler.translateResolvedUri] method which checks whether a
- * library by that name exists and in case of internal libraries whether access
- * is granted.
+ * through a [ResolvedUriTranslator] provided from the compiler. The translator
+ * checks whether a library by that name exists and in case of internal
+ * libraries whether access is granted.
  *
  * ## Resource URI ##
  *
@@ -132,7 +133,13 @@
  *
  */
 abstract class LibraryLoaderTask implements CompilerTask {
-  factory LibraryLoaderTask(Compiler compiler) = _LibraryLoaderTask;
+  factory LibraryLoaderTask(Compiler compiler,
+      ResolvedUriTranslator uriTranslator,
+      ScriptLoader scriptLoader,
+      ElementScanner scriptScanner,
+      LibraryDeserializer deserializer,
+      LibraryLoaderListener listener,
+      Environment environment) = _LibraryLoaderTask;
 
   /// Returns all libraries that have been loaded.
   Iterable<LibraryElement> get libraries;
@@ -259,13 +266,38 @@
   bool exclude(Element element) => excludedNames.contains(element.name);
 }
 
-/**
- * Implementation class for [LibraryLoader]. The distinction between
- * [LibraryLoader] and [LibraryLoaderTask] is made to hide internal members from
- * the [LibraryLoader] interface.
- */
+/// Implementation class for [LibraryLoaderTask]. The distinction between
+/// [LibraryLoaderTask] and [_LibraryLoaderTask] is made to hide internal
+/// members from the [LibraryLoaderTask] interface.
 class _LibraryLoaderTask extends CompilerTask implements LibraryLoaderTask {
-  _LibraryLoaderTask(Compiler compiler) : super(compiler);
+  /// Translates internal uris (like dart:core) to a disk location.
+  final ResolvedUriTranslator uriTranslator;
+
+  /// Loads the contents of a script file (a .dart file). Used when loading
+  /// libraries from source.
+  final ScriptLoader scriptLoader;
+
+  /// Provides a diet element model from a script file containing information
+  /// about imports and exports. Used when loading libraries from source.
+  final ElementScanner scanner;
+
+  /// Provides a diet element model for a library. Used when loading libraries
+  /// from a serialized form.
+  final LibraryDeserializer deserializer;
+
+  /// Hooks to inform others about progress done by this loader.
+  // TODO(sigmund): move away from this.
+  final LibraryLoaderListener listener;
+
+  /// Definitions provided via the `-D` command line flags. Used to resolve
+  /// conditional imports.
+  final Environment environment;
+
+  _LibraryLoaderTask(
+      Compiler compiler, this.uriTranslator, this.scriptLoader,
+      this.scanner, this.deserializer, this.listener, this.environment)
+      // TODO(sigmund): make measurements separate from compiler
+      : super(compiler);
 
   String get name => 'LibraryLoader';
 
@@ -290,6 +322,7 @@
 
       Iterable<LibraryElement> reusedLibraries = null;
       if (reuseLibrary != null) {
+        // TODO(sigmund): make measurements separate from compiler
         reusedLibraries = compiler.reuseLibraryTask.measure(() {
           // Call [toList] to force eager calls to [reuseLibrary].
           return libraryCanonicalUriMap.values.where(reuseLibrary).toList();
@@ -316,18 +349,9 @@
     return measure(() {
       assert(currentHandler == null);
 
-      Future<LibraryElement> wrapper(LibraryElement library) {
-        try {
-          return reuseLibrary(library).then(
-              (bool reuse) => reuse ? library : null);
-        } catch (exception, trace) {
-          compiler.diagnoseCrashInUserCode(
-              'Uncaught exception in reuseLibrary', exception, trace);
-          rethrow;
-        }
-      }
-
+      wrapper(lib) => reuseLibrary(lib).then((reuse) => reuse ? lib : null);
       List<Future<LibraryElement>> reusedLibrariesFuture =
+          // TODO(sigmund): make measurements separate from compiler
           compiler.reuseLibraryTask.measure(
               () => libraryCanonicalUriMap.values.map(wrapper).toList());
 
@@ -351,8 +375,7 @@
     }
   }
 
-  Future<LibraryElement> loadLibrary(
-      Uri resolvedUri,
+  Future<LibraryElement> loadLibrary(Uri resolvedUri,
       {bool skipFileWithPartOfTag: false}) {
     return measure(() {
       assert(currentHandler == null);
@@ -375,7 +398,7 @@
                 currentHandler.nodeMap,
                 this);
             currentHandler = null;
-            return compiler.onLibrariesLoaded(loadedLibraries)
+            return listener.onLibrariesLoaded(loadedLibraries)
                 .then((_) => library);
           });
         });
@@ -409,7 +432,7 @@
               String value = conditionalUri.value == null
                   ? "true"
                   : conditionalUri.value.dartString.slowToString();
-              String actual = compiler.fromEnvironment(key);
+              String actual = environment.valueOf(key);
               if (value == actual) {
                 uriNode = conditionalUri.uri;
                 break;
@@ -472,7 +495,7 @@
         }
       });
     }).then((_) {
-      return compiler.onLibraryScanned(library, handler);
+      return listener.onLibraryScanned(library, handler);
     }).then((_) {
       return reporter.withCurrentElement(library, () {
         checkDuplicatedLibraryName(library);
@@ -549,23 +572,13 @@
    */
   Future scanPart(Part part, Uri resolvedUri, LibraryElement library) {
     if (!resolvedUri.isAbsolute) throw new ArgumentError(resolvedUri);
-    Uri readableUri = compiler.translateResolvedUri(library, resolvedUri, part);
+    Uri readableUri = uriTranslator.translate(library, resolvedUri, part);
     if (readableUri == null) return new Future.value();
     return reporter.withCurrentElement(library, () {
-      return compiler.readScript(part, readableUri).
-          then((Script sourceScript) {
-            if (sourceScript == null) return;
-
-            CompilationUnitElementX unit =
-                new CompilationUnitElementX(sourceScript, library);
-            reporter.withCurrentElement(unit, () {
-              compiler.scanner.scan(unit);
-              if (unit.partTag == null && !sourceScript.isSynthesized) {
-                reporter.reportErrorMessage(
-                    unit, MessageKind.MISSING_PART_OF_TAG);
-              }
-            });
-          });
+      return scriptLoader.readScript(readableUri, part).then((Script script) {
+        if (script == null) return;
+        createUnitSync(script, library);
+      });
     });
   }
 
@@ -601,7 +614,7 @@
       LibraryElement library) {
     libraryCanonicalUriMap[library.canonicalUri] = library;
     handler.registerNewLibrary(library);
-    return compiler.onLibraryScanned(library, handler).then((_) {
+    return listener.onLibraryScanned(library, handler).then((_) {
       return Future.forEach(library.imports, (ImportElement import) {
         return createLibrary(handler, library, import.uri);
       }).then((_) {
@@ -612,6 +625,15 @@
     });
   }
 
+  Future<Script> _readScript(Spannable spannable,
+      Uri readableUri, Uri resolvedUri) {
+    if (readableUri == null) {
+      return new Future.value(new Script.synthetic(resolvedUri));
+    } else {
+      return scriptLoader.readScript(readableUri, spannable);
+    }
+  }
+
   /**
    * Create (or reuse) a library element for the library specified by the
    * [resolvedUri].
@@ -625,29 +647,24 @@
       {Spannable node,
        bool skipFileWithPartOfTag: false}) {
     Uri readableUri =
-        compiler.translateResolvedUri(importingLibrary, resolvedUri, node);
+        uriTranslator.translate(importingLibrary, resolvedUri, node);
     LibraryElement library = libraryCanonicalUriMap[resolvedUri];
     if (library != null) {
       return new Future.value(library);
     }
-    library = compiler.serialization.readLibrary(resolvedUri);
+    library = deserializer.readLibrary(resolvedUri);
     if (library != null) {
       return loadDeserializedLibrary(handler, library);
     }
-    var readScript = compiler.readScript;
-    if (readableUri == null) {
-      readableUri = resolvedUri;
-      readScript = compiler.synthesizeScript;
-    }
     return reporter.withCurrentElement(importingLibrary, () {
-      return readScript(node, readableUri).then((Script script) {
+      return _readScript(node, readableUri, resolvedUri).then((Script script) {
         if (script == null) return null;
         LibraryElement element =
             createLibrarySync(handler, script, resolvedUri);
         CompilationUnitElementX compilationUnit = element.entryCompilationUnit;
         if (compilationUnit.partTag != null) {
           if (skipFileWithPartOfTag) {
-            // TODO(johnniwinther): Avoid calling [Compiler.onLibraryCreated]
+            // TODO(johnniwinther): Avoid calling [listener.onLibraryCreated]
             // for this library.
             libraryCanonicalUriMap.remove(resolvedUri);
             return null;
@@ -681,20 +698,29 @@
     });
   }
 
-  LibraryElement createLibrarySync(
-      LibraryDependencyHandler handler,
-      Script script,
-      Uri resolvedUri) {
+  LibraryElement createLibrarySync(LibraryDependencyHandler handler,
+      Script script, Uri resolvedUri) {
     LibraryElement element = new LibraryElementX(script, resolvedUri);
     return reporter.withCurrentElement(element, () {
       if (handler != null) {
         handler.registerNewLibrary(element);
         libraryCanonicalUriMap[resolvedUri] = element;
       }
-      compiler.scanner.scanLibrary(element);
+      scanner.scanLibrary(element);
       return element;
     });
   }
+
+  CompilationUnitElement createUnitSync(Script script, LibraryElement library) {
+    CompilationUnitElementX unit = new CompilationUnitElementX(script, library);
+    reporter.withCurrentElement(unit, () {
+      scanner.scanUnit(unit);
+      if (unit.partTag == null && !script.isSynthesized) {
+        reporter.reportErrorMessage(unit, MessageKind.MISSING_PART_OF_TAG);
+      }
+    });
+    return unit;
+  }
 }
 
 
@@ -1174,8 +1200,6 @@
 
   LibraryDependencyHandler(this.task);
 
-  Compiler get compiler => task.compiler;
-
   DiagnosticReporter get reporter => task.reporter;
 
   /// The libraries created with this handler.
@@ -1268,7 +1292,7 @@
    * Registers [library] for the processing of its import/export scope.
    */
   void registerNewLibrary(LibraryElement library) {
-    compiler.onLibraryCreated(library);
+    task.listener.onLibraryCreated(library);
     _newLibraries.add(library);
     if (!library.exportsHandled) {
       nodeMap[library] = new LibraryDependencyNode(library);
@@ -1420,3 +1444,83 @@
 
   String toString() => 'root=$rootLibrary,libraries=${loadedLibraries.keys}';
 }
+
+/// API used by the library loader to translate internal SDK URIs into file
+/// system readable URIs.
+abstract class ResolvedUriTranslator {
+  // TODO(sigmund): move here the comments from library loader.
+  /// Translate the resolved [uri] in the context of [importingLibrary].
+  ///
+  /// Use [spannable] for error reporting.
+  Uri translate(
+      LibraryElement importingLibrary, Uri uri, [Spannable spannable]);
+}
+
+
+// TODO(sigmund): remove ScriptLoader & ElementScanner. Such abstraction seems
+// rather low-level. It might be more practical to split the library-loading
+// task itself.  The task would continue to do the work of recursively loading
+// dependencies, but it can delegate to a set of subloaders how to do the actual
+// loading. We would then have a list of subloaders that use different
+// implementations: in-memory cache, deserialization, scanning from files.
+//
+// For example, the API might look like this:
+//
+// /// APIs to create [LibraryElement] and [CompilationUnitElements] given it's
+// /// URI.
+// abstract class SubLoader {
+//   /// Return the library corresponding to the script at [uri].
+//   ///
+//   /// Use [spannable] for error reporting.
+//   Future<LibraryElement> createLibrary(Uri uri, [Spannable spannable]);
+//
+//   /// Return the compilation unit at [uri] that is a part of [library].
+//   Future<CompilationUnitElement> createUnit(Uri uri, LibraryElement library,
+//       [Spannable spannable]);
+// }
+//
+// /// A [SubLoader] that parses a serialized form of the element model to
+// /// produce the results.
+// class DeserializingUnitElementCreator implements SubLoader {
+// ...
+// }
+//
+// /// A [SubLoader] that finds the script sources and does a diet parse
+// /// on them to produces the results.
+// class ScanningUnitElementCreator implements SubLoader {
+// ...
+// }
+//
+// Each subloader would internally create what they need (a scanner, a
+// deserializer), and we wouldn't need to create abstractions to pass in
+// something that is only used by the loader.
+
+/// API used by the library loader to request scripts from the compiler system.
+abstract class ScriptLoader {
+  /// Load script from a readable [uri], report any errors using the location of
+  /// the given [spannable].
+  Future<Script> readScript(Uri uri, [Spannable spannable]);
+}
+
+/// API used by the library loader to synchronously scan a library or
+/// compilation unit and ensure that their library tags are computed.
+abstract class ElementScanner {
+  void scanLibrary(LibraryElement library);
+  void scanUnit(CompilationUnitElement unit);
+}
+
+
+/// TODO(sigmund): remove this abstraction. Ideally the loader can produce the
+/// LoadedLibraries results once, and the compiler and choose what to do with
+/// it instead.
+abstract class LibraryLoaderListener {
+  /// Called after a request to load a library. The [results] will include all
+  /// transitive libraries loaded as a result of the initial request.
+  Future onLibrariesLoaded(LoadedLibraries results);
+
+  /// Called whenever a library element is created.
+  void onLibraryCreated(LibraryElement library);
+
+  /// Called whenever a library is scanned from a script file.
+  Future onLibraryScanned(LibraryElement library, LibraryLoader loader);
+}
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index cd6dd0e..1afc0e0 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -5,9 +5,9 @@
 library ordered_typeset;
 
 import 'common.dart';
-import 'compiler.dart' show
-    Compiler;
 import 'dart_types.dart';
+import 'diagnostics/diagnostic_listener.dart' show
+    DiagnosticReporter;
 import 'elements/elements.dart' show
     ClassElement;
 import 'util/util.dart' show
@@ -151,39 +151,92 @@
   LinkBuilder<DartType> allSupertypes = new LinkBuilder<DartType>();
   int maxDepth = -1;
 
+  final DiagnosticReporter reporter;
   final ClassElement cls;
+  InterfaceType _objectType;
 
-  OrderedTypeSetBuilder(this.cls);
+  // TODO(johnniwinther): Provide access to `Object` in deserialization and
+  // make [objectType] mandatory.
+  OrderedTypeSetBuilder(this.cls, {this.reporter, InterfaceType objectType})
+      : this._objectType = objectType;
 
-  void add(Compiler compiler, InterfaceType type) {
-    if (type.element == cls) {
-      if (type.element != compiler.coreClasses.objectClass) {
-        allSupertypes.addLast(compiler.coreTypes.objectType);
+  OrderedTypeSet createOrderedTypeSet(
+      InterfaceType supertype,
+      Link<DartType> interfaces) {
+
+    if (_objectType == null) {
+      // Find `Object` through in hierarchy. This is used for serialization
+      // where it is assumed that the hierarchy is valid.
+      _objectType = supertype;
+      while (!_objectType.isObject) {
+        _objectType = _objectType.element.supertype;
       }
-      DiagnosticReporter reporter = compiler.reporter;
-      _addAtDepth(reporter, type, maxDepth + 1);
-    } else {
-      if (type.element != compiler.coreClasses.objectClass) {
-        allSupertypes.addLast(type);
-      }
-      DiagnosticReporter reporter = compiler.reporter;
-      _addAtDepth(reporter, type, type.element.hierarchyDepth);
+    }
+
+    // TODO(15296): Collapse these iterations to one when the order is not
+    // needed.
+    add(supertype);
+    for (Link<DartType> link = interfaces; !link.isEmpty; link = link.tail) {
+      add(link.head);
+    }
+
+    addAllSupertypes(supertype);
+    for (Link<DartType> link = interfaces; !link.isEmpty; link = link.tail) {
+      addAllSupertypes(link.head);
+    }
+    add(cls.thisType);
+    return toTypeSet();
+  }
+
+  /**
+   * Adds [type] and all supertypes of [type] to [allSupertypes] while
+   * substituting type variables.
+   */
+  void addAllSupertypes(InterfaceType type) {
+    ClassElement classElement = type.element;
+    Link<DartType> supertypes = classElement.allSupertypes;
+    assert(invariant(cls, supertypes != null,
+        message: "Supertypes not computed on $classElement "
+                 "during resolution of $cls"));
+    while (!supertypes.isEmpty) {
+      DartType supertype = supertypes.head;
+      add(supertype.substByContext(type));
+      supertypes = supertypes.tail;
     }
   }
 
-  void _addAtDepth(DiagnosticReporter reporter, InterfaceType type, int depth) {
+  void add(InterfaceType type) {
+    if (type.element == cls) {
+      if (type != _objectType) {
+        allSupertypes.addLast(_objectType);
+      }
+      _addAtDepth(type, maxDepth + 1);
+    } else {
+      if (type != _objectType) {
+        allSupertypes.addLast(type);
+      }
+      _addAtDepth(type, type.element.hierarchyDepth);
+    }
+  }
+
+  void _addAtDepth(InterfaceType type, int depth) {
     LinkEntry<DartType> prev = null;
     LinkEntry<DartType> link = map[depth];
     while (link != null) {
       DartType existingType = link.head;
       if (existingType == type) return;
       if (existingType.element == type.element) {
-        reporter.reportErrorMessage(
-            cls,
-            MessageKind.MULTI_INHERITANCE,
-            {'thisType': cls.thisType,
-             'firstType': existingType,
-             'secondType': type});
+        if (reporter != null) {
+          reporter.reportErrorMessage(
+              cls,
+              MessageKind.MULTI_INHERITANCE,
+              {'thisType': cls.thisType,
+               'firstType': existingType,
+               'secondType': type});
+        } else {
+          assert(invariant(cls, false,
+              message: 'Invalid ordered typeset for $cls'));
+        }
         return;
       }
       prev = link;
diff --git a/pkg/compiler/lib/src/patch_parser.dart b/pkg/compiler/lib/src/patch_parser.dart
index fd747e9..fb2e437 100644
--- a/pkg/compiler/lib/src/patch_parser.dart
+++ b/pkg/compiler/lib/src/patch_parser.dart
@@ -172,7 +172,7 @@
    */
   Future patchLibrary(LibraryLoader loader,
                       Uri patchUri, LibraryElement originLibrary) {
-    return compiler.readScript(originLibrary, patchUri)
+    return compiler.readScript(patchUri, originLibrary)
         .then((Script script) {
       var patchLibrary = new LibraryElementX(script, null, originLibrary);
       return reporter.withCurrentElement(patchLibrary, () {
diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
index f46b9fdc..78e2341 100644
--- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
@@ -55,7 +55,10 @@
         scope = Scope.buildEnclosingScope(element),
         super(compiler, registry);
 
-  DartType get objectType => compiler.coreTypes.objectType;
+  CoreTypes get coreTypes => compiler.coreTypes;
+
+  DartType get objectType => coreTypes.objectType;
+
 
   void resolveTypeVariableBounds(NodeList node) {
     if (node == null) return;
@@ -245,7 +248,7 @@
     }
 
     InterfaceType enumType = element.computeType(resolution);
-    element.supertype = compiler.coreTypes.objectType;
+    element.supertype = objectType;
     element.interfaces = const Link<DartType>();
     calculateAllSupertypes(element);
 
@@ -579,24 +582,10 @@
     if (cls.allSupertypesAndSelf != null) return;
     final DartType supertype = cls.supertype;
     if (supertype != null) {
-      OrderedTypeSetBuilder allSupertypes = new OrderedTypeSetBuilder(cls);
-      // TODO(15296): Collapse these iterations to one when the order is not
-      // needed.
-      allSupertypes.add(compiler, supertype);
-      for (Link<DartType> interfaces = cls.interfaces;
-           !interfaces.isEmpty;
-           interfaces = interfaces.tail) {
-        allSupertypes.add(compiler, interfaces.head);
-      }
-
-      addAllSupertypes(allSupertypes, supertype);
-      for (Link<DartType> interfaces = cls.interfaces;
-           !interfaces.isEmpty;
-           interfaces = interfaces.tail) {
-        addAllSupertypes(allSupertypes, interfaces.head);
-      }
-      allSupertypes.add(compiler, cls.computeType(resolution));
-      cls.allSupertypesAndSelf = allSupertypes.toTypeSet();
+      cls.allSupertypesAndSelf =
+          new OrderedTypeSetBuilder(
+              cls, reporter: reporter, objectType: coreTypes.objectType)
+              .createOrderedTypeSet(supertype, cls.interfaces);
     } else {
       assert(cls == compiler.coreClasses.objectClass);
       cls.allSupertypesAndSelf =
@@ -604,27 +593,8 @@
     }
   }
 
-  /**
-   * Adds [type] and all supertypes of [type] to [allSupertypes] while
-   * substituting type variables.
-   */
-  void addAllSupertypes(OrderedTypeSetBuilder allSupertypes,
-                        InterfaceType type) {
-    ClassElement classElement = type.element;
-    Link<DartType> supertypes = classElement.allSupertypes;
-    assert(invariant(element, supertypes != null,
-        message: "Supertypes not computed on $classElement "
-                 "during resolution of $element"));
-    while (!supertypes.isEmpty) {
-      DartType supertype = supertypes.head;
-      allSupertypes.add(compiler, supertype.substByContext(type));
-      supertypes = supertypes.tail;
-    }
-  }
-
   isBlackListed(DartType type) {
     LibraryElement lib = element.library;
-    CoreTypes coreTypes = compiler.coreTypes;
     return
       !identical(lib, compiler.coreLibrary) &&
       !compiler.backend.isBackendLibrary(lib) &&
diff --git a/pkg/compiler/lib/src/script.dart b/pkg/compiler/lib/src/script.dart
index 3dce8e1..f8278ab 100644
--- a/pkg/compiler/lib/src/script.dart
+++ b/pkg/compiler/lib/src/script.dart
@@ -27,9 +27,15 @@
   /// This script was synthesized.
   final bool isSynthesized;
 
-  Script(
-      this.readableUri, this.resourceUri, this.file,
-      {this.isSynthesized: false});
+  Script(this.readableUri, this.resourceUri, this.file)
+      : isSynthesized = false;
+
+  Script.synthetic(Uri uri)
+      : readableUri = uri,
+        resourceUri = uri,
+        file = new StringSourceFile.fromUri(uri,
+            "// Synthetic source file generated for '$uri'."),
+        isSynthesized = true;
 
   String get text => (file == null) ? null : file.slowText();
   String get name => (file == null) ? null : file.filename;
diff --git a/pkg/compiler/lib/src/serialization/element_serialization.dart b/pkg/compiler/lib/src/serialization/element_serialization.dart
index 9cea9d2..d9877a4 100644
--- a/pkg/compiler/lib/src/serialization/element_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/element_serialization.dart
@@ -20,6 +20,7 @@
   COMPILATION_UNIT,
   CLASS,
   ENUM,
+  NAMED_MIXIN_APPLICATION,
   GENERATIVE_CONSTRUCTOR,
   FACTORY_CONSTRUCTOR,
   TOPLEVEL_FIELD,
@@ -42,6 +43,10 @@
   IMPORT,
   EXPORT,
   PREFIX,
+  EXTERNAL_LIBRARY,
+  EXTERNAL_LIBRARY_MEMBER,
+  EXTERNAL_STATIC_MEMBER,
+  EXTERNAL_CONSTRUCTOR,
 }
 
 /// Set of serializers used to serialize different kinds of elements by
@@ -252,8 +257,13 @@
       ClassElement cls = element;
       if (cls.isEnumClass) {
         return SerializedElementKind.ENUM;
+      } else if (cls.isMixinApplication) {
+        if (!cls.isUnnamedMixinApplication) {
+          return SerializedElementKind.NAMED_MIXIN_APPLICATION;
+        }
+      } else {
+        return SerializedElementKind.CLASS;
       }
-      return SerializedElementKind.CLASS;
     }
     return null;
   }
@@ -280,26 +290,33 @@
     SerializerUtil.serializePosition(element, encoder);
     encoder.setTypes(Key.TYPE_VARIABLES, element.typeVariables);
     encoder.setBool(Key.IS_ABSTRACT, element.isAbstract);
-    if (element.isUnnamedMixinApplication) {
-      encoder.setBool(Key.IS_UNNAMED_MIXIN_APPLICATION, true);
-    }
-    if (element.supertype != null) {
-      encoder.setType(Key.SUPERTYPE, element.supertype);
-    }
-    // TODO(johnniwinther): Make [OrderedTypeSet] easier to (de)serialize.
-    ObjectEncoder supertypes = encoder.createObject(Key.SUPERTYPES);
-    supertypes.setTypes(Key.TYPES,
-        element.allSupertypesAndSelf.types.toList());
-    supertypes.setTypes(Key.SUPERTYPES,
-        element.allSupertypesAndSelf.supertypes.toList());
-    supertypes.setInts(Key.OFFSETS, element.allSupertypesAndSelf.levelOffsets);
-    encoder.setTypes(Key.INTERFACES, element.interfaces.toList());
     SerializerUtil.serializeMembers(getMembers(element), encoder);
     encoder.setBool(Key.IS_PROXY, element.isProxy);
     if (kind == SerializedElementKind.ENUM) {
       EnumClassElement enumClass = element;
       encoder.setElements(Key.FIELDS, enumClass.enumValues);
     }
+    if (element.isObject) return;
+
+    List<InterfaceType> mixins = <InterfaceType>[];
+    ClassElement superclass = element.superclass;
+    while (superclass.isUnnamedMixinApplication) {
+      MixinApplicationElement mixinElement = superclass;
+      mixins.add(element.thisType.asInstanceOf(mixinElement.mixin));
+      superclass = mixinElement.superclass;
+    }
+    mixins = mixins.reversed.toList();
+    InterfaceType supertype = element.thisType.asInstanceOf(superclass);
+
+
+    encoder.setType(Key.SUPERTYPE, supertype);
+    encoder.setTypes(Key.MIXINS, mixins);
+    encoder.setTypes(Key.INTERFACES, element.interfaces.toList());
+
+    if (element.isMixinApplication) {
+      MixinApplicationElement mixinElement = element;
+      encoder.setType(Key.MIXIN, mixinElement.mixinType);
+    }
   }
 }
 
@@ -324,7 +341,6 @@
     SerializerUtil.serializePosition(element, encoder);
     SerializerUtil.serializeParameters(element, encoder);
     encoder.setBool(Key.IS_CONST, element.isConst);
-    // TODO(johnniwinther): Handle external constructors.
     encoder.setBool(Key.IS_EXTERNAL, element.isExternal);
     if (element.isExternal) return;
     if (element.isConst && !element.isFromEnvironmentConstructor) {
@@ -581,9 +597,9 @@
   /// needs deserialization. The [ObjectDecoder] ensures that any [Element],
   /// [DartType], and [ConstantExpression] that the deserialized [Element]
   /// depends upon are available.
-  static Element deserialize(ObjectDecoder decoder) {
-    SerializedElementKind elementKind =
-        decoder.getEnum(Key.KIND, SerializedElementKind.values);
+  static Element deserialize(
+      ObjectDecoder decoder,
+      SerializedElementKind elementKind) {
     switch (elementKind) {
       case SerializedElementKind.LIBRARY:
         return new LibraryElementZ(decoder);
@@ -593,6 +609,8 @@
         return new ClassElementZ(decoder);
       case SerializedElementKind.ENUM:
         return new EnumClassElementZ(decoder);
+      case SerializedElementKind.NAMED_MIXIN_APPLICATION:
+        return new NamedMixinApplicationElementZ(decoder);
       case SerializedElementKind.TOPLEVEL_FIELD:
         return new TopLevelFieldElementZ(decoder);
       case SerializedElementKind.STATIC_FIELD:
@@ -637,6 +655,11 @@
         return new ExportElementZ(decoder);
       case SerializedElementKind.PREFIX:
         return new PrefixElementZ(decoder);
+      case SerializedElementKind.EXTERNAL_LIBRARY:
+      case SerializedElementKind.EXTERNAL_LIBRARY_MEMBER:
+      case SerializedElementKind.EXTERNAL_STATIC_MEMBER:
+      case SerializedElementKind.EXTERNAL_CONSTRUCTOR:
+        break;
     }
     throw new UnsupportedError("Unexpected element kind '${elementKind}.");
   }
diff --git a/pkg/compiler/lib/src/serialization/impact_serialization.dart b/pkg/compiler/lib/src/serialization/impact_serialization.dart
index 92e68c5..ef86609 100644
--- a/pkg/compiler/lib/src/serialization/impact_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/impact_serialization.dart
@@ -47,6 +47,11 @@
 
   @override
   void visitStaticUse(StaticUse staticUse) {
+    if (staticUse.element.isGenerativeConstructor &&
+        staticUse.element.enclosingClass.isUnnamedMixinApplication) {
+      // TODO(johnniwinther): Handle static use of forwarding constructors.
+      return;
+    }
     ObjectEncoder object = staticUses.createObject();
     object.setEnum(Key.KIND, staticUse.kind);
     object.setElement(Key.ELEMENT, staticUse.element);
diff --git a/pkg/compiler/lib/src/serialization/keys.dart b/pkg/compiler/lib/src/serialization/keys.dart
index c3b0bf8..8882b1d 100644
--- a/pkg/compiler/lib/src/serialization/keys.dart
+++ b/pkg/compiler/lib/src/serialization/keys.dart
@@ -59,13 +59,14 @@
   static const Key LIBRARY_DEPENDENCY = const Key('library-dependency');
   static const Key LIBRARY_NAME = const Key('library-name');
   static const Key MEMBERS = const Key('members');
+  static const Key MIXIN = const Key('mixin');
+  static const Key MIXINS = const Key('mixins');
   static const Key NAME = const Key('name');
   static const Key NAMES = const Key('names');
   static const Key NAMED_ARGUMENTS = const Key('named-arguments');
   static const Key NAMED_PARAMETERS = const Key('named-parameters');
   static const Key NAMED_PARAMETER_TYPES = const Key('named-parameter-types');
   static const Key OFFSET = const Key('offset');
-  static const Key OFFSETS = const Key('offsets');
   static const Key OPERATOR = const Key('operator');
   static const Key OPTIONAL_PARAMETER_TYPES =
       const Key('optional-parameter-types');
diff --git a/pkg/compiler/lib/src/serialization/modelz.dart b/pkg/compiler/lib/src/serialization/modelz.dart
index 9b825ce..4a0d17e 100644
--- a/pkg/compiler/lib/src/serialization/modelz.dart
+++ b/pkg/compiler/lib/src/serialization/modelz.dart
@@ -75,11 +75,6 @@
   Scope buildScope() => _unsupported('analyzableElement');
 
   @override
-  CompilationUnitElement get compilationUnit {
-    return _unsupported('compilationUnit');
-  }
-
-  @override
   ClassElement get enclosingClass => null;
 
   @override
@@ -333,6 +328,11 @@
   LibraryElement get library => _canonicalElement.library;
 
   @override
+  CompilationUnitElement get compilationUnit {
+    return _canonicalElement.compilationUnit;
+  }
+
+  @override
   Element get enclosingElement => _canonicalElement.enclosingElement;
 
   @override
@@ -376,6 +376,9 @@
   LibraryElement get library => this;
 
   @override
+  CompilationUnitElement get compilationUnit => entryCompilationUnit;
+
+  @override
   Uri get canonicalUri {
     if (_canonicalUri == null) {
       _canonicalUri = _decoder.getUri(Key.CANONICAL_URI);
@@ -734,22 +737,7 @@
   }
 }
 
-class ClassElementZ extends DeserializedElementZ
-    with AnalyzableElementMixin,
-         AstElementMixin,
-         ClassElementCommon,
-         class_members.ClassMemberMixin,
-         ContainerMixin,
-         LibraryMemberMixin,
-         TypeDeclarationMixin<InterfaceType>
-    implements ClassElement {
-  bool _isObject;
-  DartType _supertype;
-  OrderedTypeSet _allSupertypesAndSelf;
-  Link<DartType> _interfaces;
-
-  ClassElementZ(ObjectDecoder decoder)
-      : super(decoder);
+abstract class ClassElementMixin implements ElementZ, ClassElement {
 
   InterfaceType _createType(List<DartType> typeArguments) {
     return new InterfaceType(this, typeArguments);
@@ -759,62 +747,9 @@
   ElementKind get kind => ElementKind.CLASS;
 
   @override
-  accept(ElementVisitor visitor, arg) {
-    return visitor.visitClassElement(this, arg);
-  }
-
-  @override
-  DartType get supertype {
-    if (_isObject == null) {
-      _supertype = _decoder.getType(Key.SUPERTYPE, isOptional: true);
-      _isObject = _supertype == null;
-    }
-    return _supertype;
-  }
-
-  @override
-  bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT);
-
-  @override
-  bool get isObject {
-    return supertype == null;
-  }
-
-  @override
   void addBackendMember(Element element) => _unsupported('addBackendMember');
 
   @override
-  OrderedTypeSet get allSupertypesAndSelf {
-    if (_allSupertypesAndSelf == null) {
-      ObjectDecoder supertypesDeserializer =
-          _decoder.getObject(Key.SUPERTYPES);
-      List<int> offsets = supertypesDeserializer.getInts(Key.OFFSETS);
-      List<Link<DartType>> levels = new List<Link<DartType>>(offsets.length);
-      LinkBuilder<DartType> typesBuilder = new LinkBuilder<DartType>();
-      int offset = 0;
-      int depth = offsets.length - 1;
-      for (DartType type in supertypesDeserializer.getTypes(Key.TYPES)) {
-        Link<DartType> link = typesBuilder.addLast(type);
-        if (offsets[depth] == offset) {
-          levels[depth] = link;
-          depth--;
-        }
-        offset++;
-      }
-      LinkBuilder<DartType> supertypesBuilder = new LinkBuilder<DartType>();
-      for (DartType supertype in
-          supertypesDeserializer.getTypes(Key.SUPERTYPES, isOptional: true)) {
-        supertypesBuilder.addLast(supertype);
-      }
-      Link<DartType> types = typesBuilder.toLink();
-      Link<DartType> supertypes = supertypesBuilder.toLink();
-      _allSupertypesAndSelf = new OrderedTypeSet.internal(
-          levels, types, supertypes);
-    }
-    return _allSupertypesAndSelf;
-  }
-
-  @override
   void forEachBackendMember(void f(Element member)) {
     _unsupported('forEachBackendMember');
   }
@@ -840,27 +775,9 @@
   }
 
   @override
-  Link<DartType> get interfaces {
-    if (_interfaces == null) {
-      _interfaces = toLink(
-          _decoder.getTypes(Key.INTERFACES, isOptional: true));
-    }
-    return _interfaces;
-  }
-
-  @override
   bool get isEnumClass => false;
 
   @override
-  bool get isProxy => _decoder.getBool(Key.IS_PROXY);
-
-  @override
-  bool get isUnnamedMixinApplication {
-    return _decoder.getBool(Key.IS_UNNAMED_MIXIN_APPLICATION,
-        isOptional: true, defaultValue: false);
-  }
-
-  @override
   Element lookupBackendMember(String memberName) {
     return _unsupported('lookupBackendMember');
   }
@@ -884,6 +801,224 @@
   void ensureResolved(Resolution resolution) {
     resolution.registerClass(this);
   }
+
+}
+
+class ClassElementZ extends DeserializedElementZ
+    with AnalyzableElementMixin,
+         AstElementMixin,
+         ClassElementCommon,
+         class_members.ClassMemberMixin,
+         ContainerMixin,
+         LibraryMemberMixin,
+         TypeDeclarationMixin<InterfaceType>,
+         ClassElementMixin
+    implements ClassElement {
+  bool _isObject;
+  DartType _supertype;
+  OrderedTypeSet _allSupertypesAndSelf;
+  Link<DartType> _interfaces;
+
+  ClassElementZ(ObjectDecoder decoder)
+      : super(decoder);
+
+  @override
+  List<DartType> _getTypeVariables() {
+    return _decoder.getTypes(Key.TYPE_VARIABLES, isOptional: true);
+  }
+
+  void _ensureSuperHierarchy() {
+    if (_interfaces == null) {
+      InterfaceType supertype =
+          _decoder.getType(Key.SUPERTYPE, isOptional: true);
+      if (supertype == null) {
+        _isObject = true;
+        _allSupertypesAndSelf = new OrderedTypeSet.singleton(thisType);
+        _interfaces = const Link<DartType>();
+      } else {
+        _isObject = false;
+        _interfaces = toLink(
+            _decoder.getTypes(Key.INTERFACES, isOptional: true));
+        List<InterfaceType> mixins =
+            _decoder.getTypes(Key.MIXINS, isOptional: true);
+        for (InterfaceType mixin in mixins) {
+          MixinApplicationElement mixinElement =
+              new UnnamedMixinApplicationElementZ(this, supertype, mixin);
+          supertype = mixinElement.thisType.subst(
+              typeVariables, mixinElement.typeVariables);
+        }
+        _supertype = supertype;
+        _allSupertypesAndSelf =
+            new OrderedTypeSetBuilder(this)
+              .createOrderedTypeSet(_supertype, _interfaces);
+      }
+    }
+  }
+
+  @override
+  accept(ElementVisitor visitor, arg) {
+    return visitor.visitClassElement(this, arg);
+  }
+
+  @override
+  DartType get supertype {
+    _ensureSuperHierarchy();
+    return _supertype;
+  }
+
+  @override
+  bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT);
+
+  @override
+  bool get isObject {
+    _ensureSuperHierarchy();
+    return _isObject;
+  }
+
+  @override
+  OrderedTypeSet get allSupertypesAndSelf {
+    _ensureSuperHierarchy();
+    return _allSupertypesAndSelf;
+  }
+
+  @override
+  Link<DartType> get interfaces {
+    _ensureSuperHierarchy();
+    return _interfaces;
+  }
+
+  @override
+  bool get isProxy => _decoder.getBool(Key.IS_PROXY);
+
+  @override
+  bool get isUnnamedMixinApplication => false;
+}
+
+abstract class MixinApplicationElementMixin
+    implements ElementZ, MixinApplicationElement {
+  Link<ConstructorElement> _constructors;
+
+  @override
+  bool get isMixinApplication => false;
+
+  @override
+  ClassElement get mixin => mixinType.element;
+
+  Link<ConstructorElement> get constructors {
+    if (_constructors == null) {
+      LinkBuilder<ConstructorElement> builder =
+          new LinkBuilder<ConstructorElement>();
+      for (ConstructorElement definingConstructor in superclass.constructors) {
+        if (definingConstructor.isGenerativeConstructor &&
+            definingConstructor.memberName.isAccessibleFrom(library)) {
+          builder.addLast(
+              new ForwardingConstructorElementZ(this, definingConstructor));
+        }
+      }
+      _constructors = builder.toLink();
+    }
+    return _constructors;
+  }
+}
+
+
+class NamedMixinApplicationElementZ extends ClassElementZ
+    with MixinApplicationElementCommon,
+         MixinApplicationElementMixin {
+  InterfaceType _mixinType;
+
+  NamedMixinApplicationElementZ(ObjectDecoder decoder)
+      : super(decoder);
+
+  @override
+  InterfaceType get mixinType =>_mixinType ??= _decoder.getType(Key.MIXIN);
+}
+
+
+class UnnamedMixinApplicationElementZ extends ElementZ
+    with ClassElementCommon,
+         ClassElementMixin,
+         class_members.ClassMemberMixin,
+         TypeDeclarationMixin<InterfaceType>,
+         AnalyzableElementMixin,
+         AstElementMixin,
+         MixinApplicationElementCommon,
+         MixinApplicationElementMixin {
+  final String name;
+  final ClassElement _subclass;
+  final InterfaceType supertype;
+  final Link<DartType> interfaces;
+  OrderedTypeSet _allSupertypesAndSelf;
+
+  UnnamedMixinApplicationElementZ(
+      ClassElement subclass,
+      InterfaceType supertype, InterfaceType mixin)
+      : this._subclass = subclass,
+        this.supertype = supertype,
+        this.interfaces = const Link<DartType>().prepend(mixin),
+        this.name = "${supertype.name}+${mixin.name}";
+
+  @override
+  CompilationUnitElement get compilationUnit => _subclass.compilationUnit;
+
+  @override
+  bool get isUnnamedMixinApplication => true;
+
+  @override
+  List<DartType> _getTypeVariables() {
+    // Create synthetic type variables for the mixin application.
+    List<DartType> typeVariables = <DartType>[];
+    int index = 0;
+    for (TypeVariableType type in _subclass.typeVariables) {
+      SyntheticTypeVariableElementZ typeVariableElement =
+          new SyntheticTypeVariableElementZ(this, index, type.name);
+      TypeVariableType typeVariable = new TypeVariableType(typeVariableElement);
+      typeVariables.add(typeVariable);
+      index++;
+    }
+    // Setup bounds on the synthetic type variables.
+    for (TypeVariableType type in _subclass.typeVariables) {
+      TypeVariableType typeVariable = typeVariables[type.element.index];
+      SyntheticTypeVariableElementZ typeVariableElement = typeVariable.element;
+      typeVariableElement._type = typeVariable;
+      typeVariableElement._bound =
+          type.element.bound.subst(typeVariables, _subclass.typeVariables);
+    }
+    return typeVariables;
+  }
+
+  @override
+  accept(ElementVisitor visitor, arg) {
+    return visitor.visitMixinApplicationElement(this, arg);
+  }
+
+  @override
+  OrderedTypeSet get allSupertypesAndSelf {
+    if (_allSupertypesAndSelf == null) {
+      _allSupertypesAndSelf =
+          new OrderedTypeSetBuilder(this)
+            .createOrderedTypeSet(supertype, interfaces);
+    }
+    return _allSupertypesAndSelf;
+  }
+
+  @override
+  Element get enclosingElement => _subclass.enclosingElement;
+
+  @override
+  bool get isObject => false;
+
+  @override
+  bool get isProxy => false;
+
+  @override
+  LibraryElement get library => enclosingElement.library;
+
+  @override
+  InterfaceType get mixinType => interfaces.head;
+
+  @override
+  SourceSpan get sourcePosition => _subclass.sourcePosition;
 }
 
 
@@ -1018,6 +1153,117 @@
       _unsupported('isEffectiveTargetMalformed');
 }
 
+class ForwardingConstructorElementZ extends ElementZ
+    with AnalyzableElementMixin,
+        AstElementMixin
+    implements ConstructorElement {
+  final MixinApplicationElement enclosingClass;
+  final ConstructorElement definingConstructor;
+
+  ForwardingConstructorElementZ(this.enclosingClass, this.definingConstructor);
+
+  @override
+  CompilationUnitElement get compilationUnit => enclosingClass.compilationUnit;
+
+  @override
+  accept(ElementVisitor visitor, arg) {
+    return visitor.visitConstructorElement(this, arg);
+  }
+
+  @override
+  AsyncMarker get asyncMarker => AsyncMarker.SYNC;
+
+  @override
+  InterfaceType computeEffectiveTargetType(InterfaceType newType) {
+    return enclosingClass.thisType;
+  }
+
+  @override
+  DartType computeType(Resolution resolution) => type;
+
+  @override
+  bool get isConst => false;
+
+  @override
+  ConstantConstructor get constantConstructor => null;
+
+  @override
+  ConstructorElement get effectiveTarget => this;
+
+  @override
+  Element get enclosingElement => enclosingClass;
+
+  @override
+  FunctionSignature get functionSignature {
+    return _unsupported('functionSignature');
+  }
+
+  @override
+  bool get hasFunctionSignature  {
+    return _unsupported('hasFunctionSignature');
+  }
+
+  @override
+  ConstructorElement get immediateRedirectionTarget => null;
+
+  @override
+  bool get isCyclicRedirection => false;
+
+  @override
+  bool get isEffectiveTargetMalformed => false;
+
+  @override
+  bool get isExternal => false;
+
+  @override
+  bool get isFromEnvironmentConstructor => false;
+
+  @override
+  bool get isRedirectingFactory => false;
+
+  @override
+  bool get isRedirectingGenerative => false;
+
+  @override
+  ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR;
+
+  @override
+  LibraryElement get library => enclosingClass.library;
+
+  @override
+  MemberElement get memberContext => this;
+
+  @override
+  Name get memberName => definingConstructor.memberName;
+
+  @override
+  String get name => definingConstructor.name;
+
+  @override
+  List<FunctionElement> get nestedClosures => const <FunctionElement>[];
+
+  @override
+  List<ParameterElement> get parameters {
+    // TODO(johnniwinther): We need to create synthetic parameters that
+    // substitute type variables.
+    return definingConstructor.parameters;
+  }
+
+  // TODO: implement redirectionDeferredPrefix
+  @override
+  PrefixElement get redirectionDeferredPrefix => null;
+
+  @override
+  SourceSpan get sourcePosition => enclosingClass.sourcePosition;
+
+  @override
+  FunctionType get type {
+    // TODO(johnniwinther): Ensure that the function type substitutes type
+    // variables correctly.
+    return definingConstructor.type;
+  }
+}
+
 abstract class MemberElementMixin
     implements DeserializedElementZ, MemberElement {
 
@@ -1260,7 +1506,7 @@
 }
 
 abstract class TypeDeclarationMixin<T extends GenericType>
-    implements DeserializedElementZ, TypeDeclarationElement {
+    implements ElementZ, TypeDeclarationElement {
   List<DartType> _typeVariables;
   T _rawType;
   T _thisType;
@@ -1273,10 +1519,11 @@
     return _memberName;
   }
 
+  List<DartType> _getTypeVariables();
+
   void _ensureTypes() {
     if (_typeVariables == null) {
-      _typeVariables = _decoder.getTypes(
-          Key.TYPE_VARIABLES, isOptional: true);
+      _typeVariables = _getTypeVariables();
       _rawType = _createType(new List<DartType>.filled(
           _typeVariables.length, const DynamicType()));
       _thisType = _createType(_typeVariables);
@@ -1327,6 +1574,11 @@
   }
 
   @override
+  List<DartType> _getTypeVariables() {
+    return _decoder.getTypes(Key.TYPE_VARIABLES, isOptional: true);
+  }
+
+  @override
   ElementKind get kind => ElementKind.TYPEDEF;
 
   @override
@@ -1411,6 +1663,68 @@
   LibraryElement get library => typeDeclaration.library;
 }
 
+class SyntheticTypeVariableElementZ extends ElementZ
+    with AnalyzableElementMixin,
+         AstElementMixin
+    implements TypeVariableElement {
+  final TypeDeclarationElement typeDeclaration;
+  final int index;
+  final String name;
+  TypeVariableType _type;
+  DartType _bound;
+  Name _memberName;
+
+  SyntheticTypeVariableElementZ(this.typeDeclaration, this.index, this.name);
+
+  Name get memberName {
+    if (_memberName == null) {
+      _memberName = new Name(name, library);
+    }
+    return _memberName;
+  }
+
+  @override
+  ElementKind get kind => ElementKind.TYPE_VARIABLE;
+
+  @override
+  accept(ElementVisitor visitor, arg) {
+    return visitor.visitTypeVariableElement(this, arg);
+  }
+
+  @override
+  CompilationUnitElement get compilationUnit {
+    return typeDeclaration.compilationUnit;
+  }
+
+  @override
+  TypeVariableType get type {
+    assert(invariant(this, _type != null,
+         message: "Type variable type has not been set on $this."));
+    return _type;
+  }
+
+  @override
+  TypeVariableType computeType(Resolution resolution) => type;
+
+  @override
+  Element get enclosingElement => typeDeclaration;
+
+  @override
+  Element get enclosingClass => typeDeclaration;
+
+  DartType get bound {
+    assert(invariant(this, _bound != null,
+        message: "Type variable bound has not been set on $this."));
+    return _bound;
+  }
+
+  @override
+  LibraryElement get library => typeDeclaration.library;
+
+  @override
+  SourceSpan get sourcePosition => typeDeclaration.sourcePosition;
+}
+
 class ParameterElementZ extends DeserializedElementZ
     with AnalyzableElementMixin,
          AstElementMixin,
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index 0379b6a..a336321 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -4,20 +4,19 @@
 
 library dart2js.serialization;
 
-import '../common/backend_api.dart';
 import '../elements/elements.dart';
 import '../constants/expressions.dart';
 import '../dart_types.dart';
-import '../universe/world_impact.dart';
 
 import 'constant_serialization.dart';
 import 'element_serialization.dart';
-import 'impact_serialization.dart';
 import 'json_serializer.dart';
 import 'keys.dart';
 import 'type_serialization.dart';
 import 'values.dart';
 
+export 'task.dart' show LibraryDeserializer;
+
 /// An object that supports the encoding an [ObjectValue] for serialization.
 ///
 /// The [ObjectEncoder] ensures that nominality and circularities of
@@ -91,6 +90,13 @@
     }
   }
 
+  /// Maps the [key] entry to the [value] in the encoded object.
+  void setValue(K key, Value value) {
+    _checkKey(key);
+    _map[key] = value;
+  }
+
+
   /// Maps the [key] entry to the enum [value] in the encoded object.
   void setEnum(K key, var value) {
     _checkKey(key);
@@ -581,6 +587,11 @@
   Map<Key, Value> get map => objectValue.map;
 }
 
+/// Function used to filter which element serialized.
+typedef bool ElementMatcher(Element element);
+
+bool includeAllElements(Element element) => true;
+
 /// Serializer for the transitive closure of a collection of libraries.
 ///
 /// The serializer creates an [ObjectValue] model of the [Element], [DartType]
@@ -607,26 +618,27 @@
 ///       ],
 ///     }
 ///
-// TODO(johnniwinther): Support per-library serialization and dependencies
-// between serialized subcomponent.
+// TODO(johnniwinther): Support dependencies between serialized subcomponent.
 class Serializer {
-  final SerializationEncoder _encoder;
   List<SerializerPlugin> plugins = <SerializerPlugin>[];
 
+  Map<Uri, dynamic> _dependencyMap = <Uri, dynamic>{};
   Map<Element, DataObject> _elementMap = <Element, DataObject>{};
   Map<ConstantExpression, DataObject> _constantMap =
       <ConstantExpression, DataObject>{};
   Map<DartType, DataObject> _typeMap = <DartType, DataObject>{};
   List _pendingList = [];
+  ElementMatcher shouldInclude;
 
-  Serializer(this._encoder);
+  // TODO(johnniwinther): Replace [includeElement] with a general strategy.
+  Serializer({this.shouldInclude: includeAllElements});
 
   /// Add the transitive closure of [library] to this serializer.
   void serialize(LibraryElement library) {
-    // Call [_getElementDataObject] for its side-effect: To create a
+    // Call [_getElementId] for its side-effect: To create a
     // [DataObject] for [library]. If not already created, this will
     // put the serialization of [library] in the work queue.
-    _getElementDataObject(library);
+    _getElementId(library);
   }
 
   void _emptyWorklist() {
@@ -635,41 +647,75 @@
     }
   }
 
-  /// Returns the [DataObject] for [element].
+  /// Returns the id [Value] for [element].
   ///
-  /// If [constant] has no [DataObject], a new [DataObject] is created and
-  /// encoding the [ObjectValue] for [constant] is put into the work queue of
+  /// If [element] has no [DataObject], a new [DataObject] is created and
+  /// encoding the [ObjectValue] for [element] is put into the work queue of
   /// this serializer.
-  DataObject _getElementDataObject(Element element) {
+  Value _getElementId(Element element) {
     if (element == null) {
       throw new ArgumentError('Serializer._getElementDataObject(null)');
     }
     DataObject dataObject = _elementMap[element];
     if (dataObject == null) {
-      // Run through [ELEMENT_SERIALIZERS] sequentially to find the one that
-      // deals with [element].
-      for (ElementSerializer serializer in ELEMENT_SERIALIZERS) {
-        SerializedElementKind kind = serializer.getSerializedKind(element);
-        if (kind != null) {
-          dataObject = new DataObject(
-              new IntValue(_elementMap.length), new EnumValue(kind));
-          _elementMap[element] = dataObject;
-          // Delay the serialization of the element itself to avoid loops, and
-          // to keep the call stack small.
-          _pendingList.add(() {
-            ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
-            serializer.serialize(element, encoder, kind);
+      if (!shouldInclude(element)) {
+        if (element.isLibrary) {
+          LibraryElement library = element;
+          _elementMap[element] = dataObject = new DataObject(
+              new IntValue(_elementMap.length),
+              new EnumValue(SerializedElementKind.EXTERNAL_LIBRARY));
+          ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
+          encoder.setUri(Key.URI, library.canonicalUri, library.canonicalUri);
+        } else if (element.isStatic) {
+          Value classId =_getElementId(element.enclosingClass);
+          _elementMap[element] = dataObject = new DataObject(
+              new IntValue(_elementMap.length),
+              new EnumValue(SerializedElementKind.EXTERNAL_STATIC_MEMBER));
+          ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
+          encoder.setValue(Key.CLASS, classId);
+          encoder.setString(Key.NAME, element.name);
+        } else if (element.isConstructor) {
+          Value classId =_getElementId(element.enclosingClass);
+          _elementMap[element] = dataObject = new DataObject(
+              new IntValue(_elementMap.length),
+              new EnumValue(SerializedElementKind.EXTERNAL_CONSTRUCTOR));
+          ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
+          encoder.setValue(Key.CLASS, classId);
+          encoder.setString(Key.NAME, element.name);
+        } else {
+          Value libraryId =_getElementId(element.library);
+          _elementMap[element] = dataObject = new DataObject(
+              new IntValue(_elementMap.length),
+              new EnumValue(SerializedElementKind.EXTERNAL_LIBRARY_MEMBER));
+          ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
+          encoder.setValue(Key.LIBRARY, libraryId);
+          encoder.setString(Key.NAME, element.name);
+        }
+      } else {
+        // Run through [ELEMENT_SERIALIZERS] sequentially to find the one that
+        // deals with [element].
+        for (ElementSerializer serializer in ELEMENT_SERIALIZERS) {
+          SerializedElementKind kind = serializer.getSerializedKind(element);
+          if (kind != null) {
+            _elementMap[element] = dataObject = new DataObject(
+                new IntValue(_elementMap.length), new EnumValue(kind));
+            // Delay the serialization of the element itself to avoid loops, and
+            // to keep the call stack small.
+            _pendingList.add(() {
+              ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
+              serializer.serialize(element, encoder, kind);
 
-            MapEncoder pluginData;
-            for (SerializerPlugin plugin in plugins) {
-              plugin.onElement(element, (String tag) {
-                if (pluginData == null) {
-                  pluginData = encoder.createMap(Key.DATA);
-                }
-                return pluginData.createObject(tag);
-              });
-            }
-          });
+              MapEncoder pluginData;
+              for (SerializerPlugin plugin in plugins) {
+                plugin.onElement(element, (String tag) {
+                  if (pluginData == null) {
+                    pluginData = encoder.createMap(Key.DATA);
+                  }
+                  return pluginData.createObject(tag);
+                });
+              }
+            });
+          }
         }
       }
     }
@@ -677,7 +723,7 @@
       throw new UnsupportedError(
           'Unsupported element: $element (${element.kind})');
     }
-    return dataObject;
+    return dataObject.id;
   }
 
   /// Creates the [ElementValue] for [element].
@@ -685,15 +731,15 @@
   /// If [element] has not already been serialized, it is added to the work
   /// queue of this serializer.
   ElementValue createElementValue(Element element) {
-    return new ElementValue(element, _getElementDataObject(element).id);
+    return new ElementValue(element, _getElementId(element));
   }
 
-  /// Returns the [DataObject] for [constant].
+  /// Returns the id [Value] for [constant].
   ///
   /// If [constant] has no [DataObject], a new [DataObject] is created and
   /// encoding the [ObjectValue] for [constant] is put into the work queue of
   /// this serializer.
-  DataObject _getConstantDataObject(ConstantExpression constant) {
+  Value _getConstantId(ConstantExpression constant) {
     return _constantMap.putIfAbsent(constant, () {
       DataObject dataObject = new DataObject(
           new IntValue(_constantMap.length), new EnumValue(constant.kind));
@@ -701,7 +747,7 @@
       // keep the call stack small.
       _pendingList.add(() => _encodeConstant(constant, dataObject));
       return dataObject;
-    });
+    }).id;
   }
 
   /// Encodes [constant] into the [ObjectValue] of [dataObject].
@@ -715,23 +761,24 @@
   /// If [constant] has not already been serialized, it is added to the work
   /// queue of this serializer.
   ConstantValue createConstantValue(ConstantExpression constant) {
-    return new ConstantValue(constant, _getConstantDataObject(constant).id);
+    return new ConstantValue(constant, _getConstantId(constant));
   }
 
-  /// Returns the [DataObject] for [type].
+  /// Returns the id [Value] for [type].
   ///
   /// If [type] has no [DataObject], a new [DataObject] is created and
   /// encoding the [ObjectValue] for [type] is put into the work queue of this
   /// serializer.
-  DataObject _getTypeDataObject(DartType type) {
-    return _typeMap.putIfAbsent(type, () {
-      DataObject dataObject = new DataObject(
+  Value _getTypeId(DartType type) {
+    DataObject dataObject = _typeMap[type];
+    if (dataObject == null) {
+      _typeMap[type] = dataObject = new DataObject(
           new IntValue(_typeMap.length), new EnumValue(type.kind));
       // Delay the serialization of the type itself to avoid loops, and to keep
       // the call stack small.
       _pendingList.add(() => _encodeType(type, dataObject));
-      return dataObject;
-    });
+    }
+    return dataObject.id;
   }
 
   /// Encodes [type] into the [ObjectValue] of [dataObject].
@@ -744,7 +791,7 @@
   /// If [type] has not already been serialized, it is added to the work
   /// queue of this serializer.
   TypeValue createTypeValue(DartType type) {
-    return new TypeValue(type, _getTypeDataObject(type).id);
+    return new TypeValue(type, _getTypeId(type));
   }
 
   ObjectValue get objectValue {
@@ -764,8 +811,8 @@
     return new ObjectValue(map);
   }
 
-  String toText() {
-    return _encoder.encode(objectValue);
+  String toText(SerializationEncoder encoder) {
+    return encoder.encode(objectValue);
   }
 
   String prettyPrint() {
@@ -796,10 +843,29 @@
   void onElement(Element element, ObjectDecoder getDecoder(String tag)) {}
 }
 
+/// Context for parallel deserialization.
+class DeserializationContext {
+  Map<Uri, LibraryElement> _uriMap = <Uri, LibraryElement>{};
+  List<Deserializer> deserializers = <Deserializer>[];
+
+  LibraryElement lookupLibrary(Uri uri) {
+    return _uriMap.putIfAbsent(uri, () {
+      for (Deserializer deserializer in deserializers) {
+        LibraryElement library = deserializer.lookupLibrary(uri);
+        if (library != null) {
+          return library;
+        }
+      }
+      return null;
+    });
+  }
+}
+
 /// Deserializer for a closed collection of libraries.
 // TODO(johnniwinther): Support per-library deserialization and dependencies
 // between deserialized subcomponent.
 class Deserializer {
+  final DeserializationContext context;
   final SerializationDecoder decoder;
   List<DeserializerPlugin> plugins = <DeserializerPlugin>[];
   ObjectDecoder _headerObject;
@@ -810,8 +876,9 @@
   Map<int, DartType> _typeMap = {};
   Map<int, ConstantExpression> _constantMap = {};
 
-  Deserializer.fromText(String text, this.decoder) {
+  Deserializer.fromText(this.context, String text, this.decoder) {
     _headerObject = new ObjectDecoder(this, decoder.decode(text));
+    context.deserializers.add(this);
   }
 
   /// Returns the [ListDecoder] for the [Element]s in this deserializer.
@@ -863,7 +930,38 @@
     Element element = _elementMap[id];
     if (element == null) {
       ObjectDecoder decoder = elements.getObject(id);
-      element = ElementDeserializer.deserialize(decoder);
+      SerializedElementKind elementKind =
+          decoder.getEnum(Key.KIND, SerializedElementKind.values);
+      if (elementKind == SerializedElementKind.EXTERNAL_LIBRARY) {
+        Uri uri = decoder.getUri(Key.URI);
+        element = context.lookupLibrary(uri);
+        if (element == null) {
+          throw new StateError("Missing library for $uri.");
+        }
+      } else if (elementKind == SerializedElementKind.EXTERNAL_LIBRARY_MEMBER) {
+        LibraryElement library = decoder.getElement(Key.LIBRARY);
+        String name = decoder.getString(Key.NAME);
+        element = library.find(name);
+        if (element == null) {
+          throw new StateError("Missing library member for $name in $library.");
+        }
+      } else if (elementKind == SerializedElementKind.EXTERNAL_STATIC_MEMBER) {
+        ClassElement cls = decoder.getElement(Key.CLASS);
+        String name = decoder.getString(Key.NAME);
+        element = cls.lookupLocalMember(name);
+        if (element == null) {
+          throw new StateError("Missing static member for $name in $cls.");
+        }
+      } else if (elementKind == SerializedElementKind.EXTERNAL_CONSTRUCTOR) {
+        ClassElement cls = decoder.getElement(Key.CLASS);
+        String name = decoder.getString(Key.NAME);
+        element = cls.lookupConstructor(name);
+        if (element == null) {
+          throw new StateError("Missing constructor for $name in $cls.");
+        }
+      } else {
+        element = ElementDeserializer.deserialize(decoder, elementKind);
+      }
       _elementMap[id] = element;
 
       MapDecoder pluginData = decoder.getMap(Key.DATA, isOptional: true);
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index fc1dfae..95059fa 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -18,8 +18,16 @@
 import '../universe/world_impact.dart' show
     WorldImpact;
 
+/// A deserializer that can load a library element by reading it's information
+/// from a serialized form.
+abstract class LibraryDeserializer {
+  /// Loads the [LibraryElement] associated with a library under [uri], or null
+  /// if no serialized information is available for the given library.
+  LibraryElement readLibrary(Uri uri);
+}
+
 /// Task that supports deserialization of elements.
-class SerializationTask extends CompilerTask {
+class SerializationTask extends CompilerTask implements LibraryDeserializer {
   SerializationTask(Compiler compiler) : super(compiler);
 
   DeserializerSystem deserializer;
diff --git a/pkg/fixnum/lib/src/int64.dart b/pkg/fixnum/lib/src/int64.dart
index 769ef21..7770eb1 100644
--- a/pkg/fixnum/lib/src/int64.dart
+++ b/pkg/fixnum/lib/src/int64.dart
@@ -30,7 +30,7 @@
   static const int _MASK = 4194303; // (1 << _BITS) - 1
   static const int _MASK2 = 1048575; // (1 << _BITS2) - 1
   static const int _SIGN_BIT = 19; // _BITS2 - 1
-  static const int _SIGN_BIT_MASK = 524288; // 1 << _SIGN_BIT
+  static const int _SIGN_BIT_MASK = 1 << _SIGN_BIT;
 
   /**
    * The maximum positive value attainable by an [Int64], namely
diff --git a/pkg/fixnum/lib/src/intx.dart b/pkg/fixnum/lib/src/intx.dart
index 7adbf0c..f132aff 100644
--- a/pkg/fixnum/lib/src/intx.dart
+++ b/pkg/fixnum/lib/src/intx.dart
@@ -128,7 +128,7 @@
   IntX abs();
 
   /** Clamps this integer to be in the range [lowerLimit] - [upperLimit]. */
-  IntX clamp(IntX lowerLimit, IntX upperLimit);
+  IntX clamp(lowerLimit, upperLimit);
 
   /**
    * Returns the minimum number of bits required to store this integer.
diff --git a/pkg/fixnum/test/int_32_test.dart b/pkg/fixnum/test/int_32_test.dart
index 9773deb..e5c8c5f 100644
--- a/pkg/fixnum/test/int_32_test.dart
+++ b/pkg/fixnum/test/int_32_test.dart
@@ -56,8 +56,6 @@
     Int32 n2 = new Int32(9876);
     Int32 n3 = new Int32(-1234);
     Int32 n4 = new Int32(-9876);
-    Int32 n5 = new Int32(0x12345678);
-    Int32 n6 = new Int32(0x22222222);
 
     test("+", () {
       expect(n1 + n2, new Int32(11110));
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 351addb..8062b73 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -44,6 +44,7 @@
 analysis_server/test/search/top_level_declarations_test: Pass, Slow # 19756, 21628
 analysis_server/test/services/index/store/codec_test: Pass, Slow
 analysis_server/test/socket_server_test: Pass, Slow # Issue 19756, 21628
+analyzer/test/context/declared_variables_test: Pass, Slow # Issue 21628
 analyzer/test/dart/element/element_test: Pass, Slow # Issue 24914
 analyzer/test/dart/ast/ast_test: Pass, Slow # Issue 19756, 21628
 analyzer/test/dart/ast/utilities_test: Pass, Slow # Issue 19756, 21628
@@ -52,8 +53,9 @@
 analyzer/test/non_hint_code_test: Pass, Slow # Issue 21628
 analyzer/test/strong_mode_test: Pass, Slow # Issue 21628
 analyzer/test/generated/all_the_rest_test: Pass, Slow # Issue 21628
+analyzer/test/generated/checked_mode_compile_time_error_code_test: Pass, Slow # Issue 21628
 analyzer/test/generated/ast_test: Pass, Slow # Issue 21628
-analyzer/test/generated/compile_time_error_code_test: Pass, Slow
+analyzer/test/generated/checked_mode_compile_time_error_code_test: Pass, Slow # Issue 21628
 analyzer/test/generated/compile_time_error_code_test: Pass, Slow # Issue 21628
 analyzer/test/generated/constant_test: Pass, Slow # Issue 24914
 analyzer/test/generated/declaration_resolver_test: Pass, Slow # Issue 24914
@@ -77,17 +79,22 @@
 analyzer/test/generated/static_type_warning_code_test: Pass, Slow # Issue 21628
 analyzer/test/generated/static_warning_code_test: Pass, Slow # Issue 21628
 analyzer/test/generated/strong_mode_test: Pass, Slow # Issue 21628
+analyzer/test/generated/type_system_test: Pass, Slow # Issue 21628
 analyzer/test/generated/utilities_test: Pass, Slow # Issue 21628
 analyzer/test/src/context/cache_test: Pass, Slow # Issue 21628
 analyzer/test/src/context/context_test: Pass, Timeout # dartbug.com/23658
 analyzer/test/src/dart/ast/utilities_test: Pass, Slow # Issue 24914
+analyzer/test/src/dart/constant/evaluation_test: Pass, Slow # Issue 24914
 analyzer/test/src/dart/element/element_test: Pass, Slow # Issue 24914
+analyzer/test/src/summary/incremental_cache_test: Pass, Slow # Issue 24914
 analyzer/test/src/summary/index_unit_test: Pass, Slow # Issue 24914
 analyzer/test/src/summary/prelinker_test: Pass, Slow # Issue 24914
+analyzer/test/src/summary/resynthesize_ast_test: Pass, Slow
 analyzer/test/src/summary/resynthesize_strong_test: Pass, Slow
 analyzer/test/src/summary/resynthesize_test: Pass, Slow
 analyzer/test/src/summary/summary_sdk_test: Pass, Slow # Issue 24914
 analyzer/test/src/summary/summarize_ast_test: Pass, Slow # Issue 24914
+analyzer/test/src/summary/summarize_ast_strong_test: Pass, Slow # Issue 24914
 analyzer/test/src/summary/summarize_elements_strong_test: Pass, Slow # Issue 24914
 analyzer/test/src/summary/summarize_elements_test: Pass, Slow # Issue 24914
 analyzer/test/src/task/dart_test: Pass, Slow # Issue 21628
@@ -131,7 +138,8 @@
 analysis_server/index/store/codec_test: Pass, Slow # Issue 19756
 
 [ $runtime == jsshell ]
-async/test/stream_zip_test: RuntimeError, OK # Timers are not supported.
+async/test/stream_zip_test: RuntimeError, OK # Issue 26103. Timers are not supported.
+lookup_map/test/lookup_map_test: RuntimeError, OK # Issue 26103. Timers are not supported.
 
 [ $compiler == dart2js && $runtime == drt ]
 async/test/stream_zip_test: RuntimeError, Pass # Issue 18548
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 7a6c70f..04d7097 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -191,11 +191,6 @@
     "builtin_gen_snapshot.cc",
     "builtin.cc",
     "builtin.h",
-    "platform_android.cc",
-    "platform_linux.cc",
-    "platform_macos.cc",
-    "platform_win.cc",
-    "platform.h",
     "vmservice_impl.cc",
     "vmservice_impl.h",
     # Include generated source files.
@@ -231,27 +226,13 @@
 source_set("gen_snapshot_dart_io") {
   configs += ["..:dart_config",]
 
-  # Set custom sources assignment filter. The custom filters does three things:
-  # 1) Filters out unnecessary files pulled in from the gypi files.
-  # 2) Filters out secure socket support.
-  # 3) Enables dart:io by filtering out _unsupported.cc implementations.
+  deps = [
+    "//third_party/zlib",
+  ]
+
   custom_sources_filter = [
-    "*net/nss_memio.cc",
-    "*net/nss_memio.h",
-    "*root_certificates.cc",
-    "*secure_socket_boringssl.cc",
-    "*secure_socket_boringssl.h",
-    "*secure_socket_macos.cc",
-    "*secure_socket_macos.h",
-    "*secure_socket.h",
-    "filter.cc",
-    "*io_service_unsupported.cc",
-    "platform_*.cc",
-    "*io_service.cc",
-    "*io_service.h",
     "*_test.cc",
     "*_test.h",
-    "*dbg*",
     "builtin.cc",
     "builtin_common.cc",
     "builtin_gen_snapshot.cc",
@@ -271,11 +252,6 @@
   sources += [
     "io_natives.cc",
     "io_natives.h",
-    "log_android.cc",
-    "log_linux.cc",
-    "log_macos.cc",
-    "log_win.cc",
-    "log.h",
   ]
 
   include_dirs = [
@@ -289,26 +265,9 @@
 source_set("embedded_dart_io") {
   configs += ["..:dart_config",]
 
-  # Set custom sources assignment filter. The custom filters does three things:
-  # 1) Filters out unnecessary files pulled in from the gypi files.
-  # 2) Filters out secure socket support.
-  # 3) Enables dart:io by filtering out _unsupported.cc implementations.
   custom_sources_filter = [
-    "*net/nss_memio.cc",
-    "*net/nss_memio.h",
-    "*root_certificates.cc",
-    "*secure_socket_boringssl.cc",
-    "*secure_socket_boringssl.h",
-    "*secure_socket_macos.cc",
-    "*secure_socket_macos.h",
-    "*secure_socket.h",
-    "*filter_unsupported.cc",
-    "*io_service_unsupported.cc",
-    "*io_service.cc",
-    "*io_service.h",
     "*_test.cc",
     "*_test.h",
-    "*dbg*",
     "builtin.cc",
     "builtin_gen_snapshot.cc",
   ]
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 5bdd606..da8354e 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -145,6 +145,73 @@
         ['exclude', '_test\\.(cc|h)$'],
       ],
       'conditions': [
+        ['dart_io_support==0', {
+          'defines': [
+            'DART_IO_DISABLED',
+          ],
+        }],
+        ['OS=="win"', {
+          'sources/' : [
+            ['exclude', 'fdutils.h'],
+          ],
+          # TODO(antonm): fix the implementation.
+          # Current implementation accepts char* strings
+          # and therefore fails to compile once _UNICODE is
+          # enabled.  That should be addressed using -A
+          # versions of functions and adding necessary conversions.
+          'configurations': {
+            'Common_Base': {
+              'msvs_configuration_attributes': {
+                'CharacterSet': '0',
+              },
+            },
+          },
+        }],
+        ['OS=="linux"', {
+          'link_settings': {
+            'libraries': [
+              '-ldl',
+            ],
+          },
+        }],
+        ['OS=="android"', {
+          'link_settings': {
+            'libraries': [
+              '-ldl',
+            ],
+          },
+        }],
+      ],
+    },
+    # This is the same as libdart_builtin, but the io support libraries are
+    # never disabled, even when dart_io_support==0. This is so that it can
+    # still be usefully linked into gen_snapshot.
+    {
+      'target_name': 'libdart_builtin_no_disable',
+      'type': 'static_library',
+      'toolsets':['host'],
+      'dependencies': [
+        'generate_builtin_cc_file#host',
+        'generate_io_cc_file#host',
+        'generate_io_patch_cc_file#host',
+      ],
+      'include_dirs': [
+        '..',
+      ],
+      'sources': [
+        'log_android.cc',
+        'log_linux.cc',
+        'log_macos.cc',
+        'log_win.cc',
+      ],
+      'includes': [
+        'builtin_impl_sources.gypi',
+        '../platform/platform_sources.gypi',
+      ],
+      'sources/': [
+        ['exclude', '_test\\.(cc|h)$'],
+      ],
+      'conditions': [
         ['OS=="win"', {
           'sources/' : [
             ['exclude', 'fdutils.h'],
@@ -227,10 +294,10 @@
       'conditions': [
         ['OS != "mac" and dart_io_support==1 and dart_io_secure_socket==1', {
           'dependencies': [
-          '../third_party/boringssl/boringssl_dart.gyp:boringssl',
+            '../third_party/boringssl/boringssl_dart.gyp:boringssl',
           ],
         }],
-        ['dart_io_secure_socket==0', {
+        ['dart_io_secure_socket==0 or dart_io_support==0', {
           'defines': [
             'DART_IO_SECURE_SOCKET_DISABLED'
           ],
@@ -300,15 +367,80 @@
           'dependencies': [
             'bin/zlib.gyp:zlib_dart',
           ],
+        }, {  # dart_io_support == 0
+          'defines': [
+            'DART_IO_DISABLED',
+            'DART_IO_SECURE_SOCKET_DISABLED',
+          ],
+        }],
+        ['dart_io_secure_socket==0', {
+          'defines': [
+            'DART_IO_SECURE_SOCKET_DISABLED'
+          ],
         }],
         ['OS != "mac" and dart_io_support==1 and dart_io_secure_socket==1', {
           'dependencies': [
             '../third_party/boringssl/boringssl_dart.gyp:boringssl',
           ],
         }],
-        ['dart_io_secure_socket==0', {
+        ['OS=="win"', {
+          'link_settings': {
+            'libraries': [ '-liphlpapi.lib' ],
+          },
+          # TODO(antonm): fix the implementation.
+          # Current implementation accepts char* strings
+          # and therefore fails to compile once _UNICODE is
+          # enabled.  That should be addressed using -A
+          # versions of functions and adding necessary conversions.
+          'configurations': {
+            'Common_Base': {
+              'msvs_configuration_attributes': {
+                'CharacterSet': '0',
+              },
+            },
+          },
+        }],
+        ['OS=="mac"', {
+          'link_settings': {
+            'libraries': [
+              '$(SDKROOT)/System/Library/Frameworks/CoreFoundation.framework',
+              '$(SDKROOT)/System/Library/Frameworks/CoreServices.framework',
+              '$(SDKROOT)/System/Library/Frameworks/Security.framework',
+            ],
+          },
+        }],
+      ],
+    },
+    # This is the same as libdart_io, but the io support libraries are
+    # never disabled, even when dart_io_support==0. This is so that it can
+    # still be usefully linked into gen_snapshot.
+    {
+      'target_name': 'libdart_io_no_disable',
+      'type': 'static_library',
+      'toolsets': ['host'],
+      'include_dirs': [
+        '..',
+        '../../third_party',
+      ],
+      'includes': [
+        'io_impl_sources.gypi',
+      ],
+      'sources': [
+        'io_natives.h',
+        'io_natives.cc',
+      ],
+      'dependencies': [
+        'bin/zlib.gyp:zlib_dart',
+      ],
+      'conditions': [
+        ['dart_io_support==0 or dart_io_secure_socket==0', {
           'defines': [
-            'DART_IO_SECURE_SOCKET_DISABLED'
+            'DART_IO_SECURE_SOCKET_DISABLED',
+          ],
+        }],
+        ['OS != "mac" and dart_io_support==1 and dart_io_secure_socket==1', {
+          'dependencies': [
+            '../third_party/boringssl/boringssl_dart.gyp:boringssl',
           ],
         }],
         ['OS=="win"', {
@@ -377,9 +509,11 @@
       'dependencies': [
         'generate_resources_cc_file#host',
         'generate_observatory_assets_cc_file#host',
-        'libdart_nosnapshot',
-        'libdart_builtin',
-        'libdart_io',
+        'libdart_nosnapshot#host',
+        # If io is disabled for the VM, we still need it for gen snapshot, so
+        # use libdart_builtin and libdart_io that still have io enabled.
+        'libdart_builtin_no_disable#host',
+        'libdart_io_no_disable#host',
       ],
       'include_dirs': [
         '..',
@@ -547,6 +681,7 @@
       'target_name': 'dart_product',
       'type': 'executable',
       'dependencies': [
+        'bin/zlib.gyp:zlib_dart',
         'libdart',
         'libdart_builtin',
         'libdart_io',
@@ -560,13 +695,13 @@
       ],
       'sources': [
         'main.cc',
+        'builtin.h',
         'builtin_common.cc',
         'builtin_natives.cc',
         'builtin_nolib.cc',
-        'builtin.h',
         'io_natives.h',
-        'snapshot_empty.cc',
         'observatory_assets_empty.cc',
+        'snapshot_empty.cc',
       ],
       'conditions': [
         ['OS=="win"', {
@@ -581,13 +716,14 @@
       'target_name': 'dart',
       'type': 'executable',
       'dependencies': [
+        'bin/zlib.gyp:zlib_dart',
+        'build_observatory#host',
+        'generate_observatory_assets_cc_file#host',
+        'generate_resources_cc_file#host',
+        'generate_snapshot_file#host',
         'libdart',
         'libdart_builtin',
         'libdart_io',
-        'build_observatory#host',
-        'generate_snapshot_file#host',
-        'generate_resources_cc_file#host',
-        'generate_observatory_assets_cc_file#host',
       ],
       'include_dirs': [
         '..',
@@ -595,16 +731,16 @@
       ],
       'sources': [
         'main.cc',
+        'builtin.h',
         'builtin_common.cc',
         'builtin_natives.cc',
         'builtin_nolib.cc',
-        'builtin.h',
         'io_natives.h',
         'vmservice_impl.cc',
         'vmservice_impl.h',
-        '<(snapshot_cc_file)',
-        '<(resources_cc_file)',
         '<(observatory_assets_cc_file)',
+        '<(resources_cc_file)',
+        '<(snapshot_cc_file)',
       ],
       'conditions': [
         ['OS=="win"', {
@@ -636,30 +772,29 @@
       'target_name': 'dart_noopt',
       'type': 'executable',
       'dependencies': [
-        'libdart_noopt',
+        'build_observatory#host',
+        'generate_observatory_assets_cc_file#host',
+        'generate_resources_cc_file#host',
+        'generate_snapshot_file#host',
         'libdart_builtin',
         'libdart_io',
-        'build_observatory#host',
-        'generate_snapshot_file#host',
-        'generate_resources_cc_file#host',
-        'generate_observatory_assets_cc_file#host',
+        'libdart_noopt',
       ],
       'include_dirs': [
         '..',
-        '../../third_party/', # Zlib
       ],
       'sources': [
         'main.cc',
+        'builtin.h',
         'builtin_common.cc',
         'builtin_natives.cc',
         'builtin_nolib.cc',
-        'builtin.h',
         'io_natives.h',
         'vmservice_impl.cc',
         'vmservice_impl.h',
-        '<(snapshot_cc_file)',
-        '<(resources_cc_file)',
         '<(observatory_assets_cc_file)',
+        '<(resources_cc_file)',
+        '<(snapshot_cc_file)',
       ],
       'defines': [
         'DART_PRECOMPILER',
@@ -693,12 +828,13 @@
       'target_name': 'dart_precompiled_runtime',
       'type': 'executable',
       'dependencies': [
-        'libdart_precompiled_runtime',
+        'bin/zlib.gyp:zlib_dart',
+        'build_observatory#host',
+        'generate_observatory_assets_cc_file#host',
+        'generate_resources_cc_file#host',
         'libdart_builtin',
         'libdart_io',
-        'build_observatory#host',
-        'generate_resources_cc_file#host',
-        'generate_observatory_assets_cc_file#host',
+        'libdart_precompiled_runtime',
       ],
       'include_dirs': [
         '..',
@@ -706,16 +842,16 @@
       ],
       'sources': [
         'main.cc',
+        'builtin.h',
         'builtin_common.cc',
         'builtin_natives.cc',
         'builtin_nolib.cc',
-        'builtin.h',
         'io_natives.h',
+        'snapshot_empty.cc',
         'vmservice_impl.cc',
         'vmservice_impl.h',
-        'snapshot_empty.cc',
-        '<(resources_cc_file)',
         '<(observatory_assets_cc_file)',
+        '<(resources_cc_file)',
       ],
       'defines': [
         'DART_PRECOMPILED_RUNTIME',
@@ -742,22 +878,23 @@
       'type': 'executable',
       'toolsets':['host'],
       'dependencies': [
-        'libdart_nosnapshot',
+        'generate_resources_cc_file#host',
         'libdart_builtin',
         'libdart_io',
-        'generate_resources_cc_file#host',
+        'libdart_nosnapshot',
       ],
       'include_dirs': [
         '..',
-        '../../third_party/', # Zlib
       ],
       'sources': [
         'main.cc',
-        'builtin_common.cc',
-        'builtin_natives.cc',
         'builtin.cc',
         'builtin.h',
+        'builtin_common.cc',
+        'builtin_natives.cc',
         'io_natives.h',
+        'observatory_assets_empty.cc',
+        'snapshot_empty.cc',
         'vmservice_impl.cc',
         'vmservice_impl.h',
         # Include generated source files.
@@ -765,8 +902,6 @@
         '<(io_cc_file)',
         '<(io_patch_cc_file)',
         '<(resources_cc_file)',
-        'observatory_assets_empty.cc',
-        'snapshot_empty.cc',
       ],
       'defines': [
         'DART_NO_SNAPSHOT',
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index 054ec9b..eb90ddf 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -21,6 +21,7 @@
     'directory_android.cc',
     'directory_linux.cc',
     'directory_macos.cc',
+    'directory_unsupported.cc',
     'directory_win.cc',
     'eventhandler_test.cc',
     'extensions.h',
@@ -29,17 +30,19 @@
     'extensions_linux.cc',
     'extensions_macos.cc',
     'extensions_win.cc',
+    'fdutils.h',
+    'fdutils_android.cc',
+    'fdutils_linux.cc',
+    'fdutils_macos.cc',
     'file.cc',
     'file.h',
     'file_android.cc',
     'file_linux.cc',
     'file_macos.cc',
-    'file_win.cc',
+    'file_support.cc',
+    'file_unsupported.cc',
     'file_test.cc',
-    'fdutils.h',
-    'fdutils_android.cc',
-    'fdutils_linux.cc',
-    'fdutils_macos.cc',
+    'file_win.cc',
     'hashmap_test.cc',
     'io_buffer.cc',
     'io_buffer.h',
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 09258f7..9a2f9ec 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -4,22 +4,21 @@
 
 #include "bin/dartutils.h"
 
-#include "include/dart_api.h"
-#include "include/dart_tools_api.h"
-#include "include/dart_native_api.h"
-
-#include "platform/assert.h"
-#include "platform/globals.h"
-
 #include "bin/crypto.h"
 #include "bin/directory.h"
 #include "bin/extensions.h"
 #include "bin/file.h"
 #include "bin/io_buffer.h"
 #include "bin/platform.h"
-#include "bin/socket.h"
 #include "bin/utils.h"
 
+#include "include/dart_api.h"
+#include "include/dart_native_api.h"
+#include "include/dart_tools_api.h"
+
+#include "platform/assert.h"
+#include "platform/globals.h"
+
 // Return the error from the containing function if handle is in error handle.
 #define RETURN_IF_ERROR(handle)                                                \
   {                                                                            \
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index adc7d3f..f9a6d50 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -5,14 +5,12 @@
 #ifndef BIN_DARTUTILS_H_
 #define BIN_DARTUTILS_H_
 
+#include "bin/isolate_data.h"
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
-
 #include "platform/assert.h"
 #include "platform/globals.h"
 
-#include "bin/isolate_data.h"
-
 namespace dart {
 namespace bin {
 
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc
index c2f3dc8..982a4be 100644
--- a/runtime/bin/directory.cc
+++ b/runtime/bin/directory.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "bin/directory.h"
 
 #include "bin/dartutils.h"
@@ -422,3 +424,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/directory_unsupported.cc b/runtime/bin/directory_unsupported.cc
new file mode 100644
index 0000000..7e82bdd
--- /dev/null
+++ b/runtime/bin/directory_unsupported.cc
@@ -0,0 +1,70 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+void FUNCTION_NAME(Directory_Current)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_SetCurrent)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_Exists)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_Create)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_SystemTemp)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_CreateTemp)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_Delete)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_Rename)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Directory_List)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Directory is not supported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler.cc b/runtime/bin/eventhandler.cc
index 704cc85..8ce45b2 100644
--- a/runtime/bin/eventhandler.cc
+++ b/runtime/bin/eventhandler.cc
@@ -2,8 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "bin/dartutils.h"
+#if !defined(DART_IO_DISABLED)
+
 #include "bin/eventhandler.h"
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
 #include "bin/lockers.h"
 #include "bin/socket.h"
 #include "bin/thread.h"
@@ -142,3 +146,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index 5daeb78..1b7bbdb 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_ANDROID)
 
@@ -433,3 +435,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 6b69ffc..59cbdcd 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_LINUX)
 
@@ -437,3 +439,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 8d4c683..c2b7833 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_MACOS)
 
@@ -509,3 +511,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_MACOS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_unsupported.cc b/runtime/bin/eventhandler_unsupported.cc
new file mode 100644
index 0000000..c79ad24
--- /dev/null
+++ b/runtime/bin/eventhandler_unsupported.cc
@@ -0,0 +1,39 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/eventhandler.h"
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+void EventHandler::Start() {
+}
+
+
+void EventHandler::Stop() {
+}
+
+
+void FUNCTION_NAME(EventHandler_SendData)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "EventHandler is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(EventHandler_TimerMillisecondClock)(
+    Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "EventHandler is not supported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // defined(DART_IO_DISABLED)
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 2698253..dfd4985 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_WINDOWS)
 
@@ -1505,3 +1507,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_WINDOWS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 7d9ea28..e730b172 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "bin/file.h"
 
 #include "bin/builtin.h"
@@ -18,32 +20,6 @@
 
 static const int kMSPerSecond = 1000;
 
-// Are we capturing output from stdout for the VM service?
-static bool capture_stdout = false;
-
-// Are we capturing output from stderr for the VM service?
-static bool capture_stderr = false;
-
-void SetCaptureStdout(bool value) {
-  capture_stdout = value;
-}
-
-
-void SetCaptureStderr(bool value) {
-  capture_stderr = value;
-}
-
-
-bool ShouldCaptureStdout() {
-  return capture_stdout;
-}
-
-
-bool ShouldCaptureStderr() {
-  return capture_stderr;
-}
-
-
 // The file pointer has been passed into Dart as an intptr_t and it is safe
 // to pull it out of Dart as a 64-bit integer, cast it to an intptr_t and
 // from there to a File pointer.
@@ -53,70 +29,6 @@
 }
 
 
-bool File::ReadFully(void* buffer, int64_t num_bytes) {
-  int64_t remaining = num_bytes;
-  char* current_buffer = reinterpret_cast<char*>(buffer);
-  while (remaining > 0) {
-    int64_t bytes_read = Read(current_buffer, remaining);
-    if (bytes_read <= 0) {
-      return false;
-    }
-    remaining -= bytes_read;  // Reduce the number of remaining bytes.
-    current_buffer += bytes_read;  // Move the buffer forward.
-  }
-  return true;
-}
-
-
-bool File::WriteFully(const void* buffer, int64_t num_bytes) {
-  int64_t remaining = num_bytes;
-  const char* current_buffer = reinterpret_cast<const char*>(buffer);
-  while (remaining > 0) {
-    int64_t bytes_written = Write(current_buffer, remaining);
-    if (bytes_written < 0) {
-      return false;
-    }
-    remaining -= bytes_written;  // Reduce the number of remaining bytes.
-    current_buffer += bytes_written;  // Move the buffer forward.
-  }
-  if (capture_stdout || capture_stderr) {
-    intptr_t fd = GetFD();
-    if ((fd == STDOUT_FILENO) && capture_stdout) {
-      Dart_ServiceSendDataEvent("Stdout", "WriteEvent",
-                                reinterpret_cast<const uint8_t*>(buffer),
-                                num_bytes);
-    } else if ((fd == STDERR_FILENO) && capture_stderr) {
-      Dart_ServiceSendDataEvent("Stderr", "WriteEvent",
-                                reinterpret_cast<const uint8_t*>(buffer),
-                                num_bytes);
-    }
-  }
-  return true;
-}
-
-
-File::FileOpenMode File::DartModeToFileMode(DartFileOpenMode mode) {
-  ASSERT((mode == File::kDartRead) ||
-         (mode == File::kDartWrite) ||
-         (mode == File::kDartAppend) ||
-         (mode == File::kDartWriteOnly) ||
-         (mode == File::kDartWriteOnlyAppend));
-  if (mode == File::kDartWrite) {
-    return File::kWriteTruncate;
-  }
-  if (mode == File::kDartAppend) {
-    return File::kWrite;
-  }
-  if (mode == File::kDartWriteOnly) {
-    return File::kWriteOnlyTruncate;
-  }
-  if (mode == File::kDartWriteOnlyAppend) {
-    return File::kWriteOnly;
-  }
-  return File::kRead;
-}
-
-
 void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
   const char* filename =
       DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
@@ -1250,3 +1162,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_support.cc b/runtime/bin/file_support.cc
new file mode 100644
index 0000000..0ad5edc
--- /dev/null
+++ b/runtime/bin/file_support.cc
@@ -0,0 +1,109 @@
+// 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.
+
+#include "bin/file.h"
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "bin/embedded_dart_io.h"
+#include "bin/io_buffer.h"
+#include "bin/utils.h"
+
+#include "include/dart_api.h"
+#include "include/dart_tools_api.h"
+
+namespace dart {
+namespace bin {
+
+// Are we capturing output from stdout for the VM service?
+static bool capture_stdout = false;
+
+// Are we capturing output from stderr for the VM service?
+static bool capture_stderr = false;
+
+void SetCaptureStdout(bool value) {
+  capture_stdout = value;
+}
+
+
+void SetCaptureStderr(bool value) {
+  capture_stderr = value;
+}
+
+
+bool ShouldCaptureStdout() {
+  return capture_stdout;
+}
+
+
+bool ShouldCaptureStderr() {
+  return capture_stderr;
+}
+
+
+bool File::ReadFully(void* buffer, int64_t num_bytes) {
+  int64_t remaining = num_bytes;
+  char* current_buffer = reinterpret_cast<char*>(buffer);
+  while (remaining > 0) {
+    int64_t bytes_read = Read(current_buffer, remaining);
+    if (bytes_read <= 0) {
+      return false;
+    }
+    remaining -= bytes_read;  // Reduce the number of remaining bytes.
+    current_buffer += bytes_read;  // Move the buffer forward.
+  }
+  return true;
+}
+
+
+bool File::WriteFully(const void* buffer, int64_t num_bytes) {
+  int64_t remaining = num_bytes;
+  const char* current_buffer = reinterpret_cast<const char*>(buffer);
+  while (remaining > 0) {
+    int64_t bytes_written = Write(current_buffer, remaining);
+    if (bytes_written < 0) {
+      return false;
+    }
+    remaining -= bytes_written;  // Reduce the number of remaining bytes.
+    current_buffer += bytes_written;  // Move the buffer forward.
+  }
+  if (capture_stdout || capture_stderr) {
+    intptr_t fd = GetFD();
+    if ((fd == STDOUT_FILENO) && capture_stdout) {
+      Dart_ServiceSendDataEvent("Stdout", "WriteEvent",
+                                reinterpret_cast<const uint8_t*>(buffer),
+                                num_bytes);
+    } else if ((fd == STDERR_FILENO) && capture_stderr) {
+      Dart_ServiceSendDataEvent("Stderr", "WriteEvent",
+                                reinterpret_cast<const uint8_t*>(buffer),
+                                num_bytes);
+    }
+  }
+  return true;
+}
+
+
+File::FileOpenMode File::DartModeToFileMode(DartFileOpenMode mode) {
+  ASSERT((mode == File::kDartRead) ||
+         (mode == File::kDartWrite) ||
+         (mode == File::kDartAppend) ||
+         (mode == File::kDartWriteOnly) ||
+         (mode == File::kDartWriteOnlyAppend));
+  if (mode == File::kDartWrite) {
+    return File::kWriteTruncate;
+  }
+  if (mode == File::kDartAppend) {
+    return File::kWrite;
+  }
+  if (mode == File::kDartWriteOnly) {
+    return File::kWriteOnlyTruncate;
+  }
+  if (mode == File::kDartWriteOnlyAppend) {
+    return File::kWriteOnly;
+  }
+  return File::kRead;
+}
+
+}  // namespace bin
+}  // namespace dart
diff --git a/runtime/bin/file_system_watcher.cc b/runtime/bin/file_system_watcher.cc
index 5d8c0b8..317f59f 100644
--- a/runtime/bin/file_system_watcher.cc
+++ b/runtime/bin/file_system_watcher.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "bin/file_system_watcher.h"
 
 #include "bin/builtin.h"
@@ -73,3 +75,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher.h b/runtime/bin/file_system_watcher.h
index 7e142d8..5026da7 100644
--- a/runtime/bin/file_system_watcher.h
+++ b/runtime/bin/file_system_watcher.h
@@ -5,6 +5,10 @@
 #ifndef BIN_FILE_SYSTEM_WATCHER_H_
 #define BIN_FILE_SYSTEM_WATCHER_H_
 
+#if defined(DART_IO_DISABLED)
+#error "file_system_watcher.h can only be included on builds with IO enabled"
+#endif
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/runtime/bin/file_system_watcher_android.cc b/runtime/bin/file_system_watcher_android.cc
index ccf54da..4c0380e 100644
--- a/runtime/bin/file_system_watcher_android.cc
+++ b/runtime/bin/file_system_watcher_android.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_ANDROID)
 
@@ -144,3 +146,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_linux.cc b/runtime/bin/file_system_watcher_linux.cc
index e692f0d..ef4eaef 100644
--- a/runtime/bin/file_system_watcher_linux.cc
+++ b/runtime/bin/file_system_watcher_linux.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_LINUX)
 
@@ -145,3 +147,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index ff64288..7bc0e0c 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_MACOS)
 
@@ -458,3 +460,5 @@
 
 #endif  // !TARGET_OS_IOS
 #endif  // defined(TARGET_OS_MACOS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_unsupported.cc b/runtime/bin/file_system_watcher_unsupported.cc
new file mode 100644
index 0000000..7803215
--- /dev/null
+++ b/runtime/bin/file_system_watcher_unsupported.cc
@@ -0,0 +1,58 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+void FUNCTION_NAME(FileSystemWatcher_IsSupported)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "FileSystemWatcher is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(FileSystemWatcher_InitWatcher)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "FileSystemWatcher is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(FileSystemWatcher_CloseWatcher)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "FileSystemWatcher is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(FileSystemWatcher_WatchPath)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "FileSystemWatcher is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(FileSystemWatcher_UnwatchPath)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "FileSystemWatcher is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(FileSystemWatcher_ReadEvents)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "FileSystemWatcher is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(FileSystemWatcher_GetSocketId)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "FileSystemWatcher is not supported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_system_watcher_win.cc b/runtime/bin/file_system_watcher_win.cc
index e6b091a..698b049 100644
--- a/runtime/bin/file_system_watcher_win.cc
+++ b/runtime/bin/file_system_watcher_win.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_WINDOWS)
 
@@ -139,3 +141,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_WINDOWS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/file_unsupported.cc b/runtime/bin/file_unsupported.cc
new file mode 100644
index 0000000..2655f77
--- /dev/null
+++ b/runtime/bin/file_unsupported.cc
@@ -0,0 +1,202 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Exists)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Close)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_GetFD)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_ReadByte)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_WriteByte)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Read)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Position)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_SetPosition)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Truncate)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Length)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_LengthFromPath)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_LastModified)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Flush)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Lock)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_CreateLink)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_LinkTarget)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Delete)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_DeleteLink)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Rename)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_RenameLink)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Copy)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_ResolveSymbolicLinks)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_OpenStdio)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_GetStdioHandleType)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_GetType)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_Stat)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(File_AreIdentical)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "File is not supported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/filter.cc b/runtime/bin/filter.cc
index fb6c74b..60887ef 100644
--- a/runtime/bin/filter.cc
+++ b/runtime/bin/filter.cc
@@ -2,8 +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.
 
-#include "bin/dartutils.h"
+#if !defined(DART_IO_DISABLED)
+
 #include "bin/filter.h"
+
+#include "bin/dartutils.h"
 #include "bin/io_buffer.h"
 
 #include "include/dart_api.h"
@@ -465,3 +468,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/filter.h b/runtime/bin/filter.h
index 889326f..28c229f 100644
--- a/runtime/bin/filter.h
+++ b/runtime/bin/filter.h
@@ -5,6 +5,10 @@
 #ifndef BIN_FILTER_H_
 #define BIN_FILTER_H_
 
+#if defined(DART_IO_DISABLED)
+#error "filter.h can only be included on builds with IO enabled"
+#endif
+
 #include "bin/builtin.h"
 #include "bin/utils.h"
 
diff --git a/runtime/bin/filter_unsupported.cc b/runtime/bin/filter_unsupported.cc
index 442b9e6..37d7b6f 100644
--- a/runtime/bin/filter_unsupported.cc
+++ b/runtime/bin/filter_unsupported.cc
@@ -2,9 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if defined(DART_IO_DISABLED)
+
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
-
 #include "include/dart_api.h"
 
 namespace dart {
@@ -17,15 +18,23 @@
 
 
 void FUNCTION_NAME(Filter_CreateZLibDeflate)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "ZLibInflater and Deflater not supported on this platform"));
 }
 
 
 void FUNCTION_NAME(Filter_Process)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "ZLibInflater and Deflater not supported on this platform"));
 }
 
 
 void FUNCTION_NAME(Filter_Processed)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "ZLibInflater and Deflater not supported on this platform"));
 }
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // defined(DART_IO_DISABLED)
diff --git a/runtime/bin/io_impl_sources.gypi b/runtime/bin/io_impl_sources.gypi
index 9f1fe1b..af5c712 100644
--- a/runtime/bin/io_impl_sources.gypi
+++ b/runtime/bin/io_impl_sources.gypi
@@ -14,6 +14,7 @@
     'eventhandler_linux.h',
     'eventhandler_macos.cc',
     'eventhandler_macos.h',
+    'eventhandler_unsupported.cc',
     'eventhandler_win.cc',
     'eventhandler_win.h',
     'file_system_watcher.cc',
@@ -21,6 +22,7 @@
     'file_system_watcher_android.cc',
     'file_system_watcher_linux.cc',
     'file_system_watcher_macos.cc',
+    'file_system_watcher_unsupported.cc',
     'file_system_watcher_win.cc',
     'filter.cc',
     'filter.h',
@@ -35,14 +37,17 @@
     'platform_android.cc',
     'platform_linux.cc',
     'platform_macos.cc',
+    'platform_unsupported.cc',
     'platform_win.cc',
     'process.cc',
     'process.h',
     'process_android.cc',
     'process_linux.cc',
     'process_macos.cc',
+    'process_unsupported.cc',
     'process_win.cc',
     '../../third_party/root_certificates/root_certificates.cc',
+    'root_certificates_unsupported.cc',
     'secure_socket.h',
     'secure_socket_boringssl.cc',
     'secure_socket_boringssl.h',
@@ -57,6 +62,7 @@
     'socket_linux.h',
     'socket_macos.cc',
     'socket_macos.h',
+    'socket_unsupported.cc',
     'socket_win.cc',
     'socket_win.h',
     'stdio.cc',
@@ -64,58 +70,7 @@
     'stdio_android.cc',
     'stdio_linux.cc',
     'stdio_macos.cc',
+    'stdio_unsupported.cc',
     'stdio_win.cc',
   ],
-  'conditions': [
-    ['dart_io_support==1', {
-      'conditions': [
-        ['dart_io_secure_socket==1', {
-          'sources!' : [
-            'io_service_no_ssl.cc',
-            'io_service_no_ssl.h',
-            'secure_socket_unsupported.cc',
-          ],
-          'conditions': [
-            ['OS=="mac"', {
-              # On Mac, we use the system keystore, so do not compile in the
-              # root certs.
-              'sources!': [
-                '../../third_party/root_certificates/root_certificates.cc',
-              ],
-            }],
-          ],
-        }, {  # else dart_io_secure_socket == 0
-          'sources!' : [
-            '../../third_party/root_certificates/root_certificates.cc',
-            'io_service.cc',
-            'io_service.h',
-            'secure_socket.h',
-            'secure_socket_boringssl.cc',
-            'secure_socket_boringssl.h',
-            'secure_socket_macos.cc',
-            'secure_socket_macos.h',
-          ],
-        }],
-      ],
-      'sources!' : [
-        'filter_unsupported.cc',
-        'io_service_unsupported.cc',
-      ],
-    },{  # else dart_io_support == 0
-      'sources!' : [
-        'filter.cc',
-        'filter.h',
-        'io_service.cc',
-        'io_service.h',
-        'io_service_no_ssl.cc',
-        'io_service_no_ssl.h',
-        '../../third_party/root_certificates/root_certificates.cc',
-        'secure_socket.h',
-        'secure_socket_boringssl.cc',
-        'secure_socket_boringssl.h',
-        'secure_socket_macos.cc',
-        'secure_socket_macos.h',
-      ],
-    }],
-  ],
 }
diff --git a/runtime/bin/io_service.cc b/runtime/bin/io_service.cc
index 004e3d2..491fa29 100644
--- a/runtime/bin/io_service.cc
+++ b/runtime/bin/io_service.cc
@@ -2,11 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
+
+#include "bin/io_service.h"
+
 #include "bin/dartutils.h"
 #include "bin/directory.h"
 #include "bin/file.h"
 #include "bin/io_buffer.h"
-#include "bin/io_service.h"
 #include "bin/secure_socket.h"
 #include "bin/socket.h"
 #include "bin/utils.h"
@@ -72,3 +75,6 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED) &&
+        // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/io_service.h b/runtime/bin/io_service.h
index c165e90..209561a 100644
--- a/runtime/bin/io_service.h
+++ b/runtime/bin/io_service.h
@@ -5,6 +5,10 @@
 #ifndef BIN_IO_SERVICE_H_
 #define BIN_IO_SERVICE_H_
 
+#if defined(DART_IO_DISABLED) || defined(DART_IO_SECURE_SOCKET_DISABLED)
+#error "io_service.h can only be included on builds with IO and SSL enabled"
+#endif
+
 #include "bin/builtin.h"
 #include "bin/utils.h"
 
diff --git a/runtime/bin/io_service_no_ssl.cc b/runtime/bin/io_service_no_ssl.cc
index 5c70fe4..ece9ab8 100644
--- a/runtime/bin/io_service_no_ssl.cc
+++ b/runtime/bin/io_service_no_ssl.cc
@@ -2,11 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if !defined(DART_IO_DISABLED) && defined(DART_IO_SECURE_SOCKET_DISABLED)
+
+#include "bin/io_service_no_ssl.h"
+
 #include "bin/dartutils.h"
 #include "bin/directory.h"
 #include "bin/file.h"
 #include "bin/io_buffer.h"
-#include "bin/io_service_no_ssl.h"
 #include "bin/socket.h"
 #include "bin/utils.h"
 
@@ -71,3 +74,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED) && defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/io_service_no_ssl.h b/runtime/bin/io_service_no_ssl.h
index db2af1c..b8cb545 100644
--- a/runtime/bin/io_service_no_ssl.h
+++ b/runtime/bin/io_service_no_ssl.h
@@ -5,6 +5,10 @@
 #ifndef BIN_IO_SERVICE_NO_SSL_H_
 #define BIN_IO_SERVICE_NO_SSL_H_
 
+#if defined(DART_IO_DISABLED) || !defined(DART_IO_SECURE_SOCKET_DISABLED)
+#error "io_service_no_ssl.h can only be included on builds with IO enabled"
+#endif
+
 #include "bin/builtin.h"
 #include "bin/utils.h"
 
diff --git a/runtime/bin/io_service_unsupported.cc b/runtime/bin/io_service_unsupported.cc
index 29a8730..b8211e7 100644
--- a/runtime/bin/io_service_unsupported.cc
+++ b/runtime/bin/io_service_unsupported.cc
@@ -2,9 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if defined(DART_IO_DISABLED)
+
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
-
 #include "include/dart_api.h"
 
 namespace dart {
@@ -18,3 +19,4 @@
 }  // namespace bin
 }  // namespace dart
 
+#endif  // defined(DART_IO_DISABLED)
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 0eafb9c..8d58c70 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -26,7 +26,9 @@
 #include "platform/globals.h"
 #include "platform/hashmap.h"
 #include "platform/text_buffer.h"
+#if !defined(DART_PRECOMPILER)
 #include "zlib/zlib.h"
+#endif
 
 namespace dart {
 namespace bin {
@@ -743,31 +745,31 @@
                                                 char** error,
                                                 int* exit_code) {
   ASSERT(script_uri != NULL);
-#if defined(DART_PRODUCT_BINARY)
-  if (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0) {
-    // No service isolate support.
-    return NULL;
-  }
-#endif  // defined(DART_PRODUCT_BINARY)
 
-  if (run_full_snapshot &&
+#if defined(DART_PRODUCT_BINARY)
+  const bool run_service_isolate = false;
+#elif defined(PRODUCT)
+  const bool run_service_isolate = !run_full_snapshot &&
+                                   !run_precompiled_snapshot;
+#else
+  const bool run_service_isolate = !run_full_snapshot;
+#endif
+  if (!run_service_isolate &&
       (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0)) {
     // We do not create a service isolate when running a full application
-    // snapshot.
+    // snapshot or a precompiled snapshot in product mode.
     return NULL;
   }
+
   IsolateData* isolate_data = new IsolateData(script_uri,
                                               package_root,
                                               packages_config);
-  Dart_Isolate isolate = NULL;
-
-  isolate = Dart_CreateIsolate(script_uri,
-                               main,
-                               isolate_snapshot_buffer,
-                               flags,
-                               isolate_data,
-                               error);
-
+  Dart_Isolate isolate = Dart_CreateIsolate(script_uri,
+                                            main,
+                                            isolate_snapshot_buffer,
+                                            flags,
+                                            isolate_data,
+                                            error);
   if (isolate == NULL) {
     delete isolate_data;
     return NULL;
@@ -812,9 +814,12 @@
   result = DartUtils::PrepareForScriptLoading(false, trace_loading);
   CHECK_RESULT(result);
 
-  if (!run_full_snapshot) {
+  if (!run_precompiled_snapshot && !run_full_snapshot) {
     // Set up the load port provided by the service isolate so that we can
     // load scripts.
+    // With a full snapshot or a precompiled snapshot in product mode, there is
+    // no service isolate. A precompiled snapshot in release or debug mode does
+    // have the service isolate, but it doesn't use it for loading.
     result = DartUtils::SetupServiceLoadPort();
     CHECK_RESULT(result);
   }
@@ -1299,7 +1304,7 @@
         reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
     result = Dart_LibraryImportLibrary(
         isolate_data->builtin_lib(), root_lib, Dart_Null());
-#ifndef DART_PRODUCT_BINARY
+#if !defined(DART_PRODUCT_BINARY) && !defined(PRODUCT)
     if (is_noopt || gen_precompiled_snapshot) {
       // Load the embedder's portion of the VM service's Dart code so it will
       // be included in the precompiled snapshot.
@@ -1347,7 +1352,9 @@
         { "dart:io", "_ProcessStartStatus", "set:_errorMessage" },
         { "dart:io", "_SecureFilterImpl", "get:ENCRYPTED_SIZE" },
         { "dart:io", "_SecureFilterImpl", "get:SIZE" },
+#if !defined(PRODUCT)
         { "dart:vmservice_io", "::", "main" },
+#endif  // !PRODUCT
         { NULL, NULL, NULL }  // Must be terminated with NULL entries.
       };
 
diff --git a/runtime/bin/platform.cc b/runtime/bin/platform.cc
index 716ef29..2099ebb 100644
--- a/runtime/bin/platform.cc
+++ b/runtime/bin/platform.cc
@@ -2,21 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "bin/platform.h"
+#if !defined(DART_IO_DISABLED)
 
-#include "include/dart_api.h"
+#include "bin/platform.h"
 
 #include "bin/file.h"
 #include "bin/utils.h"
+#include "include/dart_api.h"
 
 namespace dart {
 namespace bin {
 
-const char* Platform::executable_name_ = NULL;
-char* Platform::resolved_executable_name_ = NULL;
-int Platform::script_index_ = 1;
-char** Platform::argv_ = NULL;
-
 void FUNCTION_NAME(Platform_NumberOfProcessors)(Dart_NativeArguments args) {
   Dart_SetReturnValue(args, Dart_NewInteger(Platform::NumberOfProcessors()));
 }
@@ -125,3 +121,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
index de60960..1f29b21 100644
--- a/runtime/bin/platform_android.cc
+++ b/runtime/bin/platform_android.cc
@@ -5,7 +5,6 @@
 #include "platform/globals.h"
 #if defined(TARGET_OS_ANDROID)
 
-#include "bin/file.h"
 #include "bin/platform.h"
 
 #include <signal.h>  // NOLINT
@@ -13,10 +12,16 @@
 #include <unistd.h>  // NOLINT
 
 #include "bin/fdutils.h"
+#include "bin/file.h"
 
 namespace dart {
 namespace bin {
 
+const char* Platform::executable_name_ = NULL;
+char* Platform::resolved_executable_name_ = NULL;
+int Platform::script_index_ = 1;
+char** Platform::argv_ = NULL;
+
 bool Platform::Initialize() {
   // Turn off the signal handler for SIGPIPE as it causes the process
   // to terminate on writing to a closed pipe. Without the signal
diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc
index c6dc3cc..054ff6d 100644
--- a/runtime/bin/platform_linux.cc
+++ b/runtime/bin/platform_linux.cc
@@ -5,7 +5,6 @@
 #include "platform/globals.h"
 #if defined(TARGET_OS_LINUX)
 
-#include "bin/file.h"
 #include "bin/platform.h"
 
 #include <signal.h>  // NOLINT
@@ -13,10 +12,16 @@
 #include <unistd.h>  // NOLINT
 
 #include "bin/fdutils.h"
+#include "bin/file.h"
 
 namespace dart {
 namespace bin {
 
+const char* Platform::executable_name_ = NULL;
+char* Platform::resolved_executable_name_ = NULL;
+int Platform::script_index_ = 1;
+char** Platform::argv_ = NULL;
+
 bool Platform::Initialize() {
   // Turn off the signal handler for SIGPIPE as it causes the process
   // to terminate on writing to a closed pipe. Without the signal
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index e21ff13..2641ac1 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -5,6 +5,8 @@
 #include "platform/globals.h"
 #if defined(TARGET_OS_MACOS)
 
+#include "bin/platform.h"
+
 #if !TARGET_OS_IOS
 #include <crt_externs.h>  // NOLINT
 #endif  // !TARGET_OS_IOS
@@ -17,11 +19,15 @@
 
 #include "bin/fdutils.h"
 #include "bin/file.h"
-#include "bin/platform.h"
 
 namespace dart {
 namespace bin {
 
+const char* Platform::executable_name_ = NULL;
+char* Platform::resolved_executable_name_ = NULL;
+int Platform::script_index_ = 1;
+char** Platform::argv_ = NULL;
+
 bool Platform::Initialize() {
   // Turn off the signal handler for SIGPIPE as it causes the process
   // to terminate on writing to a closed pipe. Without the signal
diff --git a/runtime/bin/platform_unsupported.cc b/runtime/bin/platform_unsupported.cc
new file mode 100644
index 0000000..83893fb
--- /dev/null
+++ b/runtime/bin/platform_unsupported.cc
@@ -0,0 +1,70 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+void FUNCTION_NAME(Platform_NumberOfProcessors)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_OperatingSystem)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_PathSeparator)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_LocalHostname)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_ExecutableName)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_ResolvedExecutableName)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_ExecutableArguments)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_Environment)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Platform_GetVersion)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Platform is not supported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 78f6cdc..1eb9d3b 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -5,10 +5,13 @@
 #include "platform/globals.h"
 #if defined(TARGET_OS_WINDOWS)
 
+#include "bin/platform.h"
+
 #include "bin/file.h"
 #include "bin/log.h"
-#include "bin/platform.h"
+#if !defined(DART_IO_DISABLED) && !defined(PLATFORM_DISABLE_SOCKET)
 #include "bin/socket.h"
+#endif
 #include "bin/utils.h"
 #include "bin/utils_win.h"
 
@@ -19,6 +22,11 @@
 
 namespace bin {
 
+const char* Platform::executable_name_ = NULL;
+char* Platform::resolved_executable_name_ = NULL;
+int Platform::script_index_ = 1;
+char** Platform::argv_ = NULL;
+
 bool Platform::Initialize() {
   // Nothing to do on Windows.
   return true;
@@ -43,7 +51,7 @@
 
 
 bool Platform::LocalHostname(char *buffer, intptr_t buffer_length) {
-#if defined(PLATFORM_DISABLE_SOCKET)
+#if defined(DART_IO_DISABLED) || defined(PLATFORM_DISABLE_SOCKET)
   return false;
 #else
   if (!Socket::Initialize()) {
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index 3896505..672b3e3 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -2,11 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if !defined(DART_IO_DISABLED)
+
+#include "bin/process.h"
+
 #include "bin/dartutils.h"
 #include "bin/io_buffer.h"
 #include "bin/log.h"
 #include "bin/platform.h"
-#include "bin/process.h"
 #include "bin/socket.h"
 #include "bin/utils.h"
 
@@ -17,9 +20,6 @@
 
 static const int kProcessIdNativeField = 0;
 
-int Process::global_exit_code_ = 0;
-Mutex* Process::global_exit_code_mutex_ = new Mutex();
-
 // Extract an array of C strings from a list of Dart strings.
 static char** ExtractCStringList(Dart_Handle strings,
                                  Dart_Handle status_handle,
@@ -367,3 +367,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 5e53dbe..00d6ca2 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_ANDROID)
 
@@ -30,6 +32,9 @@
 namespace dart {
 namespace bin {
 
+int Process::global_exit_code_ = 0;
+Mutex* Process::global_exit_code_mutex_ = new Mutex();
+
 // ProcessInfo is used to map a process id to the file descriptor for
 // the pipe used to communicate the exit code of the process to Dart.
 // ProcessInfo objects are kept in the static singly-linked
@@ -1037,3 +1042,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index b657235..e533cc5 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_LINUX)
 
@@ -21,6 +23,7 @@
 #include "bin/lockers.h"
 #include "bin/log.h"
 #include "bin/thread.h"
+
 #include "platform/signal_blocker.h"
 #include "platform/utils.h"
 
@@ -29,6 +32,9 @@
 namespace dart {
 namespace bin {
 
+int Process::global_exit_code_ = 0;
+Mutex* Process::global_exit_code_mutex_ = new Mutex();
+
 // ProcessInfo is used to map a process id to the file descriptor for
 // the pipe used to communicate the exit code of the process to Dart.
 // ProcessInfo objects are kept in the static singly-linked
@@ -1032,3 +1038,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 00b2d8e..b3b5662 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_MACOS)
 
@@ -31,6 +33,9 @@
 namespace dart {
 namespace bin {
 
+int Process::global_exit_code_ = 0;
+Mutex* Process::global_exit_code_mutex_ = new Mutex();
+
 // ProcessInfo is used to map a process id to the file descriptor for
 // the pipe used to communicate the exit code of the process to Dart.
 // ProcessInfo objects are kept in the static singly-linked
@@ -1104,3 +1109,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_MACOS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_unsupported.cc b/runtime/bin/process_unsupported.cc
new file mode 100644
index 0000000..64bed26
--- /dev/null
+++ b/runtime/bin/process_unsupported.cc
@@ -0,0 +1,97 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/process.h"
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+int Process::global_exit_code_ = 0;
+Mutex* Process::global_exit_code_mutex_ = new Mutex();
+
+void Process::TerminateExitCodeHandler() {
+}
+
+
+void FUNCTION_NAME(Process_Start)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_Wait)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_KillPid)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_Exit)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_SetExitCode)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_GetExitCode)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_Sleep)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_Pid)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_SetSignalHandler)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(Process_ClearSignalHandler)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(SystemEncodingToString)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+
+void FUNCTION_NAME(StringToSystemEncoding)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewInternalError(
+        "Process is not supported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index 9777c55..b96e67b 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_WINDOWS)
 
@@ -25,6 +27,8 @@
 static const int kReadHandle = 0;
 static const int kWriteHandle = 1;
 
+int Process::global_exit_code_ = 0;
+Mutex* Process::global_exit_code_mutex_ = new Mutex();
 
 // ProcessInfo is used to map a process id to the process handle,
 // wait handle for registered exit code event and the pipe used to
@@ -1082,3 +1086,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_WINDOWS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/root_certificates_unsupported.cc b/runtime/bin/root_certificates_unsupported.cc
new file mode 100644
index 0000000..a899e3c
--- /dev/null
+++ b/runtime/bin/root_certificates_unsupported.cc
@@ -0,0 +1,22 @@
+// 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.
+
+#if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
+
+#include "platform/globals.h"
+#if defined(TARGET_OS_MACOS) || defined(TARGET_OS_ANDROID)
+
+namespace dart {
+namespace bin {
+
+const unsigned char* root_certificates_pem = NULL;
+unsigned int root_certificates_pem_length = 0;
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // defined(TARGET_OS_MACOS) || defined(TARGET_OS_ANDROID)
+
+#endif  // !defined(DART_IO_DISABLED) &&
+        // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/secure_socket.h b/runtime/bin/secure_socket.h
index d9fb968..07ff2b0 100644
--- a/runtime/bin/secure_socket.h
+++ b/runtime/bin/secure_socket.h
@@ -5,7 +5,7 @@
 #ifndef BIN_SECURE_SOCKET_H_
 #define BIN_SECURE_SOCKET_H_
 
-#ifdef DART_IO_SECURE_SOCKET_DISABLED
+#if defined(DART_IO_DISABLED) || defined(DART_IO_SECURE_SOCKET_DISABLED)
 #error "secure_socket.h can only be included on builds with SSL enabled"
 #endif
 
diff --git a/runtime/bin/secure_socket_boringssl.cc b/runtime/bin/secure_socket_boringssl.cc
index 6c4df2b..530c21a 100644
--- a/runtime/bin/secure_socket_boringssl.cc
+++ b/runtime/bin/secure_socket_boringssl.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_ANDROID) || \
     defined(TARGET_OS_LINUX)   || \
@@ -774,6 +776,18 @@
 void FUNCTION_NAME(SecurityContext_TrustBuiltinRoots)(
     Dart_NativeArguments args) {
   SSL_CTX* context = GetSecurityContext(args);
+#if defined(TARGET_OS_ANDROID)
+  // On Android, we don't compile in the trusted root certificates. Insead,
+  // we use the directory of trusted certificates already present on the device.
+  // This saves ~240KB from the size of the binary. This has the drawback that
+  // SSL_do_handshake will synchronously hit the filesystem looking for root
+  // certs during its trust evaluation. We call SSL_do_handshake directly from
+  // the Dart thread so that Dart code can be invoked from the "bad certificate"
+  // callback called by SSL_do_handshake.
+  const char* android_cacerts = "/system/etc/security/cacerts";
+  int status = SSL_CTX_load_verify_locations(context, NULL, android_cacerts);
+  CheckStatus(status, "TlsException", "Failure trusting builtint roots");
+#else
   X509_STORE* store = SSL_CTX_get_cert_store(context);
   BIO* roots_bio =
       BIO_new_mem_buf(const_cast<unsigned char*>(root_certificates_pem),
@@ -786,6 +800,7 @@
     X509_STORE_add_cert(store, root_cert);
   }
   BIO_free(roots_bio);
+#endif  // defined(TARGET_OS_ANDROID)
 }
 
 
@@ -1667,3 +1682,6 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
+
+#endif  // !defined(DART_IO_DISABLED) &&
+        // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/secure_socket_macos.cc b/runtime/bin/secure_socket_macos.cc
index 53c9ae7..5e6e320 100644
--- a/runtime/bin/secure_socket_macos.cc
+++ b/runtime/bin/secure_socket_macos.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_MACOS)
 
@@ -54,6 +56,16 @@
 namespace dart {
 namespace bin {
 
+static const int kSSLFilterNativeFieldIndex = 0;
+static const int kSecurityContextNativeFieldIndex = 0;
+static const int kX509NativeFieldIndex = 0;
+
+static const bool SSL_LOG_STATUS = false;
+static const bool SSL_LOG_DATA = false;
+static const bool SSL_LOG_CERTS = false;
+static const int SSL_ERROR_MESSAGE_BUFFER_SIZE = 1000;
+static const intptr_t PEM_BUFSIZE = 1024;
+
 // SSLCertContext wraps the certificates needed for a SecureTransport
 // connection. Fields are protected by the mutex_ field, and may only be set
 // once. This is to allow access by both the Dart thread and the IOService
@@ -181,15 +193,6 @@
   DISALLOW_COPY_AND_ASSIGN(SSLCertContext);
 };
 
-static const int kSSLFilterNativeFieldIndex = 0;
-static const int kSecurityContextNativeFieldIndex = 0;
-static const int kX509NativeFieldIndex = 0;
-
-static const bool SSL_LOG_STATUS = false;
-static const bool SSL_LOG_DATA = false;
-static const bool SSL_LOG_CERTS = false;
-static const int SSL_ERROR_MESSAGE_BUFFER_SIZE = 1000;
-static const intptr_t PEM_BUFSIZE = 1024;
 
 static char* CFStringRefToCString(CFStringRef cfstring) {
   CFIndex len = CFStringGetLength(cfstring);
@@ -1840,30 +1843,6 @@
 }
 
 
-static intptr_t AvailableToRead(intptr_t start, intptr_t end, intptr_t size) {
-  intptr_t data_available = 0;
-  if (end < start) {
-    // Data may be split into two segments.  In this case,
-    // the first is [start, size).
-    intptr_t buffer_end = (start == 0) ? size - 1 : size;
-    intptr_t available = buffer_end - start;
-    start += available;
-    data_available += available;
-    ASSERT(start <= size);
-    if (start == size) {
-      start = 0;
-    }
-  }
-  if (start < end) {
-    intptr_t available = end - start;
-    start += available;
-    data_available += available;
-    ASSERT(start <= end);
-  }
-  return data_available;
-}
-
-
 OSStatus SSLFilter::SSLReadCallback(SSLConnectionRef connection,
                                     void* data, size_t* data_requested) {
   // Copy at most `data_requested` bytes from `buffers_[kReadEncrypted]` into
@@ -1882,11 +1861,6 @@
   intptr_t requested = static_cast<intptr_t>(*data_requested);
   intptr_t data_read = 0;
 
-  if (AvailableToRead(start, end, size) < requested) {
-    *data_requested = 0;
-    return errSSLWouldBlock;
-  }
-
   if (end < start) {
     // Data may be split into two segments.  In this case,
     // the first is [start, size).
@@ -1920,8 +1894,9 @@
   }
 
   filter->SetBufferStart(kReadEncrypted, start);
+  bool short_read = data_read < static_cast<intptr_t>(*data_requested);
   *data_requested = data_read;
-  return noErr;
+  return short_read ? errSSLWouldBlock : noErr;
 }
 
 
@@ -1939,6 +1914,9 @@
         reinterpret_cast<void*>((buffers_[kReadPlaintext] + start)),
         length,
         &bytes);
+    if (SSL_LOG_STATUS) {
+      Log::Print("SSLRead: status = %ld\n", static_cast<intptr_t>(status));
+    }
     if ((status != noErr) && (status != errSSLWouldBlock)) {
       *bytes_processed = 0;
       return status;
@@ -1953,35 +1931,6 @@
 }
 
 
-intptr_t SpaceToWrite(intptr_t start, intptr_t end, intptr_t size) {
-  intptr_t writable_space = 0;
-
-  // is full, neither if statement is executed and nothing happens.
-  if (start <= end) {
-    // If the free space may be split into two segments,
-    // then the first is [end, size), unless start == 0.
-    // Then, since the last free byte is at position start - 2,
-    // the interval is [end, size - 1).
-    intptr_t buffer_end = (start == 0) ? size - 1 : size;
-    intptr_t available = buffer_end - end;
-    end += available;
-    writable_space += available;
-    ASSERT(end <= size);
-    if (end == size) {
-      end = 0;
-    }
-  }
-  if (start > end + 1) {
-    intptr_t available = (start - 1) - end;
-    end += available;
-    writable_space += available;
-    ASSERT(end < start);
-  }
-
-  return writable_space;
-}
-
-
 OSStatus SSLFilter::SSLWriteCallback(SSLConnectionRef connection,
                                      const void* data, size_t* data_provided) {
   // Copy at most `data_provided` bytes from data into
@@ -2000,11 +1949,6 @@
   intptr_t provided = static_cast<intptr_t>(*data_provided);
   intptr_t data_written = 0;
 
-  if (SpaceToWrite(start, end, size) < provided) {
-    *data_provided = 0;
-    return errSSLWouldBlock;
-  }
-
   // is full, neither if statement is executed and nothing happens.
   if (start <= end) {
     // If the free space may be split into two segments,
@@ -2042,7 +1986,7 @@
 
   filter->SetBufferEnd(kWriteEncrypted, end);
   *data_provided = data_written;
-  return noErr;
+  return (data_written == 0) ? errSSLWouldBlock : noErr;
 }
 
 
@@ -2059,11 +2003,18 @@
         reinterpret_cast<void*>(buffers_[kWritePlaintext] + start),
         length,
         &bytes);
+    if (SSL_LOG_STATUS) {
+      Log::Print("SSLWrite: status = %ld\n", static_cast<intptr_t>(status));
+    }
     if ((status != noErr) && (status != errSSLWouldBlock)) {
       *bytes_processed = 0;
       return status;
     }
   }
+  if (SSL_LOG_DATA) {
+    Log::Print("ProcessWritePlaintextBuffer: requested: %ld, written: %ld\n",
+        length, bytes);
+  }
   *bytes_processed = static_cast<intptr_t>(bytes);
   return status;
 }
@@ -2072,3 +2023,6 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_MACOS)
+
+#endif  // !defined(DART_IO_DISABLED) &&
+        // !defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/secure_socket_unsupported.cc b/runtime/bin/secure_socket_unsupported.cc
index 1cd09d0..dc49825 100644
--- a/runtime/bin/secure_socket_unsupported.cc
+++ b/runtime/bin/secure_socket_unsupported.cc
@@ -2,9 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if defined(DART_IO_DISABLED) || defined(DART_IO_SECURE_SOCKET_DISABLED)
+
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
-
 #include "include/dart_api.h"
 
 namespace dart {
@@ -98,72 +99,85 @@
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_Allocate)(Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_UsePrivateKeyBytes)(
     Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_SetAlpnProtocols)(
     Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_SetClientAuthoritiesBytes)(
     Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_SetTrustedCertificatesBytes)(
     Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_AlpnSupported)(Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_TrustBuiltinRoots)(
     Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(SecurityContext_UseCertificateChainBytes)(
     Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(X509_Subject)(Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(X509_Issuer)(Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(X509_StartValidity)(Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 void FUNCTION_NAME(X509_EndValidity)(Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
 }
 
+
 class SSLFilter {
  public:
   static CObject* ProcessFilterRequest(const CObjectArray& request);
@@ -175,3 +189,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // defined(DART_IO_DISABLED) || defined(DART_IO_SECURE_SOCKET_DISABLED)
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index cba96c0..fb9704b 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -2,19 +2,22 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if !defined(DART_IO_DISABLED)
+
+#include "bin/socket.h"
+
 #include "bin/dartutils.h"
 #include "bin/io_buffer.h"
 #include "bin/isolate_data.h"
 #include "bin/lockers.h"
-#include "bin/socket.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
 
+#include "include/dart_api.h"
+
 #include "platform/globals.h"
 #include "platform/utils.h"
 
-#include "include/dart_api.h"
-
 namespace dart {
 namespace bin {
 
@@ -874,3 +877,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index b058a51..2cf940c 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -5,12 +5,11 @@
 #ifndef BIN_SOCKET_H_
 #define BIN_SOCKET_H_
 
-#include <map>
+#if defined(DART_IO_DISABLED)
+#error "socket.h can only be included on builds with IO enabled"
+#endif
 
 #include "platform/globals.h"
-
-#include "bin/builtin.h"
-#include "bin/dartutils.h"
 // Declare the OS-specific types ahead of defining the generic class.
 #if defined(TARGET_OS_ANDROID)
 #include "bin/socket_android.h"
@@ -23,6 +22,11 @@
 #else
 #error Unknown target os.
 #endif
+
+#include <map>
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
 
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 2d43a44..fd96a9a 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_ANDROID)
 
@@ -569,3 +571,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_android.h b/runtime/bin/socket_android.h
index 5970477..13ff16e 100644
--- a/runtime/bin/socket_android.h
+++ b/runtime/bin/socket_android.h
@@ -5,6 +5,10 @@
 #ifndef BIN_SOCKET_ANDROID_H_
 #define BIN_SOCKET_ANDROID_H_
 
+#if !defined(BIN_SOCKET_H_)
+#error Do not include socket_android.h directly. Use socket.h.
+#endif
+
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <sys/socket.h>
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index b9068d7..1befb69 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_LINUX)
 
@@ -585,3 +587,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_linux.h b/runtime/bin/socket_linux.h
index 4ad0db2..5d073c4 100644
--- a/runtime/bin/socket_linux.h
+++ b/runtime/bin/socket_linux.h
@@ -5,6 +5,10 @@
 #ifndef BIN_SOCKET_LINUX_H_
 #define BIN_SOCKET_LINUX_H_
 
+#if !defined(BIN_SOCKET_H_)
+#error Do not include socket_linux.h directly. Use socket.h.
+#endif
+
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <sys/socket.h>
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 8306b56..624da8e 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_MACOS)
 
@@ -623,3 +625,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_MACOS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_macos.h b/runtime/bin/socket_macos.h
index b77857c..dce6d97 100644
--- a/runtime/bin/socket_macos.h
+++ b/runtime/bin/socket_macos.h
@@ -5,6 +5,10 @@
 #ifndef BIN_SOCKET_MACOS_H_
 #define BIN_SOCKET_MACOS_H_
 
+#if !defined(BIN_SOCKET_H_)
+#error Do not include socket_macos.h directly. Use socket.h.
+#endif
+
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <sys/socket.h>
diff --git a/runtime/bin/socket_unsupported.cc b/runtime/bin/socket_unsupported.cc
new file mode 100644
index 0000000..933df53
--- /dev/null
+++ b/runtime/bin/socket_unsupported.cc
@@ -0,0 +1,148 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+void FUNCTION_NAME(InternetAddress_Parse)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_CreateConnect)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_CreateBindConnect)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_Read)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_GetRemotePeer)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_GetError)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_GetType)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_GetStdioHandle)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_GetSocketId)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_SetSocketId)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(ServerSocket_CreateBindListen)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Sockets unsupported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index ea306b7..4534c8c 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_WINDOWS)
 
@@ -712,3 +714,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_WINDOWS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/socket_win.h b/runtime/bin/socket_win.h
index ab32ed3..7b71e38 100644
--- a/runtime/bin/socket_win.h
+++ b/runtime/bin/socket_win.h
@@ -5,6 +5,10 @@
 #ifndef BIN_SOCKET_WIN_H_
 #define BIN_SOCKET_WIN_H_
 
+#if !defined(BIN_SOCKET_H_)
+#error Do not include socket_win.h directly. Use socket.h.
+#endif
+
 #include <iphlpapi.h>
 #include <mswsock.h>
 #include <winsock2.h>
diff --git a/runtime/bin/stdio.cc b/runtime/bin/stdio.cc
index b14fe92..47bd554 100644
--- a/runtime/bin/stdio.cc
+++ b/runtime/bin/stdio.cc
@@ -2,17 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "bin/stdio.h"
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
 #include "bin/utils.h"
 
+#include "include/dart_api.h"
+
 #include "platform/globals.h"
 #include "platform/utils.h"
 
-#include "include/dart_api.h"
-
 namespace dart {
 namespace bin {
 
@@ -69,3 +71,5 @@
 
 }  // namespace bin
 }  // namespace dart
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio.h b/runtime/bin/stdio.h
index afe4637..55884df 100644
--- a/runtime/bin/stdio.h
+++ b/runtime/bin/stdio.h
@@ -5,6 +5,10 @@
 #ifndef BIN_STDIO_H_
 #define BIN_STDIO_H_
 
+#if defined(DART_IO_DISABLED)
+#error "stdio.h can only be included on builds with IO enabled"
+#endif
+
 #include "bin/builtin.h"
 #include "bin/utils.h"
 
diff --git a/runtime/bin/stdio_android.cc b/runtime/bin/stdio_android.cc
index 8d2a3c5..019efeb 100644
--- a/runtime/bin/stdio_android.cc
+++ b/runtime/bin/stdio_android.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_ANDROID)
 
@@ -79,3 +81,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_ANDROID)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_linux.cc b/runtime/bin/stdio_linux.cc
index 8f51e7e..0634fa4 100644
--- a/runtime/bin/stdio_linux.cc
+++ b/runtime/bin/stdio_linux.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_LINUX)
 
@@ -79,3 +81,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_LINUX)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_macos.cc b/runtime/bin/stdio_macos.cc
index 7dc1141..d22f192 100644
--- a/runtime/bin/stdio_macos.cc
+++ b/runtime/bin/stdio_macos.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_MACOS)
 
@@ -79,3 +81,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_MACOS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_unsupported.cc b/runtime/bin/stdio_unsupported.cc
new file mode 100644
index 0000000..1e6c213
--- /dev/null
+++ b/runtime/bin/stdio_unsupported.cc
@@ -0,0 +1,52 @@
+// 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.
+
+#if defined(DART_IO_DISABLED)
+
+#include "bin/builtin.h"
+#include "bin/dartutils.h"
+#include "include/dart_api.h"
+
+namespace dart {
+namespace bin {
+
+void FUNCTION_NAME(Stdin_ReadByte)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Stdin unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Stdin_GetEchoMode)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Stdin unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Stdin_SetEchoMode)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Stdin unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Stdin_GetLineMode)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Stdin unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Stdin_SetLineMode)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Stdin unsupported on this platform"));
+}
+
+
+void FUNCTION_NAME(Stdout_GetTerminalSize)(Dart_NativeArguments args) {
+  Dart_ThrowException(DartUtils::NewDartArgumentError(
+      "Stdout unsupported on this platform"));
+}
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // defined(DART_IO_DISABLED)
diff --git a/runtime/bin/stdio_win.cc b/runtime/bin/stdio_win.cc
index 1cb6a527..d062826 100644
--- a/runtime/bin/stdio_win.cc
+++ b/runtime/bin/stdio_win.cc
@@ -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.
 
+#if !defined(DART_IO_DISABLED)
+
 #include "platform/globals.h"
 #if defined(TARGET_OS_WINDOWS)
 
@@ -92,3 +94,5 @@
 }  // namespace dart
 
 #endif  // defined(TARGET_OS_WINDOWS)
+
+#endif  // !defined(DART_IO_DISABLED)
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 6665e0a..a67f9e1 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -54,7 +54,8 @@
 #include <stdbool.h>
 #if __GNUC__ >= 4
 #if defined(DART_SHARED_LIB)
-#define DART_EXPORT DART_EXTERN_C __attribute__ ((visibility("default")))
+#define DART_EXPORT DART_EXTERN_C __attribute__ ((visibility("default"))) \
+    __attribute((used))
 #else
 #define DART_EXPORT DART_EXTERN_C
 #endif
@@ -528,8 +529,8 @@
  *   after the object is garbage collected, unless the handle has been deleted.
  *   A valid callback needs to be specified it cannot be NULL.
  *
- * \return Success if the weak persistent handle was
- *   created. Otherwise, returns an error.
+ * \return The weak persistent handle or NULL. NULL is returned in case of bad
+ *   parameters.
  */
 DART_EXPORT Dart_WeakPersistentHandle Dart_NewWeakPersistentHandle(
     Dart_Handle object,
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index 5bcb48e..1c2de88 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -22,13 +22,18 @@
   int _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE);
 
   // Fixed-length list of keys (set) or key/value at even/odd indices (map).
-  List _data = new List(_HashBase._INITIAL_INDEX_SIZE);
+  List _data;
 
   // Length of _data that is used (i.e., keys + values for a map).
   int _usedData = 0;
 
   // Number of deleted keys.
   int _deletedKeys = 0;
+
+  // Note: All fields are initialized in a single constructor so that the VM
+  // recognizes they cannot hold null values. This makes a big (20%) performance
+  // difference on some operations.
+  _HashFieldBase(int dataSize) : this._data = new List(dataSize);
 }
 
 // Base class for VM-internal classes; keep in sync with _HashFieldBase.
@@ -125,7 +130,7 @@
   int get length => (_usedData >> 1) - _deletedKeys;
   bool get isEmpty => length == 0;
   bool get isNotEmpty => !isEmpty;
-  
+
   void _rehash() {
     if ((_deletedKeys << 2) > _usedData) {
       // TODO(koda): Consider shrinking.
@@ -140,12 +145,12 @@
   void clear() {
     if (!isEmpty) {
       // Use _data.length, since _index might be null.
-      _init(_data.length, _hashMask);
+      _init(_data.length, _hashMask, null, 0);
     }
   }
 
   // Allocate new _index and _data, and optionally copy existing contents.
-  void _init(int size, int hashMask, [List oldData, int oldUsed]) {
+  void _init(int size, int hashMask, List oldData, int oldUsed) {
     assert(size & (size - 1) == 0);
     assert(_HashBase._UNUSED_PAIR == 0);
     _index = new Uint32List(size);
@@ -206,7 +211,7 @@
     int pair = _index[i];
     while (pair != _HashBase._UNUSED_PAIR) {
       if (pair == _HashBase._DELETED_PAIR) {
-        if (firstDeleted < 0){
+        if (firstDeleted < 0) {
           firstDeleted = i;
         }
       } else {
@@ -351,6 +356,8 @@
     with MapMixin<K, V>, _LinkedHashMapMixin<K, V>, _HashBase,
          _IdenticalAndIdentityHashCode
     implements LinkedHashMap<K, V> {
+
+  _CompactLinkedIdentityHashMap() : super(_HashBase._INITIAL_INDEX_SIZE);
 }
 
 class _CompactLinkedCustomHashMap<K, V> extends _HashFieldBase
@@ -369,7 +376,8 @@
   V remove(Object o) => _validKey(o) ? super.remove(o) : null;
 
   _CompactLinkedCustomHashMap(this._equality, this._hasher, validKey)
-      : _validKey = (validKey != null) ? validKey : new _TypeTest<K>().test;
+      : _validKey = (validKey != null) ? validKey : new _TypeTest<K>().test,
+        super(_HashBase._INITIAL_INDEX_SIZE);
 }
 
 // Iterates through _data[_offset + _step], _data[_offset + 2*_step], ...
@@ -426,10 +434,8 @@
     with _HashBase, _OperatorEqualsAndHashCode, SetMixin<E>
     implements LinkedHashSet<E> {
 
-  _CompactLinkedHashSet() {
+  _CompactLinkedHashSet() : super(_HashBase._INITIAL_INDEX_SIZE >> 1) {
     assert(_HashBase._UNUSED_PAIR == 0);
-    _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE);
-    _data = new List(_HashBase._INITIAL_INDEX_SIZE >> 1);
   }
 
   int get length => _usedData - _deletedKeys;
@@ -444,11 +450,11 @@
 
   void clear() {
     if (!isEmpty) {
-      _init(_index.length, _hashMask);
+      _init(_index.length, _hashMask, null, 0);
     }
   }
 
-  void _init(int size, int hashMask, [List oldData, int oldUsed]) {
+  void _init(int size, int hashMask, List oldData, int oldUsed) {
     _index = new Uint32List(size);
     _hashMask = hashMask;
     _data = new List(size >> 1);
@@ -475,7 +481,7 @@
     int pair = _index[i];
     while (pair != _HashBase._UNUSED_PAIR) {
       if (pair == _HashBase._DELETED_PAIR) {
-        if (firstDeleted < 0){
+        if (firstDeleted < 0) {
           firstDeleted = i;
         }
       } else {
diff --git a/runtime/lib/date.cc b/runtime/lib/date.cc
index cf92809..ba9fa95 100644
--- a/runtime/lib/date.cc
+++ b/runtime/lib/date.cc
@@ -12,13 +12,13 @@
 
 namespace dart {
 
-static int32_t kMaxAllowedSeconds = 2100000000;
+static int64_t kMaxAllowedSeconds = kMaxInt32;
 
 DEFINE_NATIVE_ENTRY(DateTime_timeZoneName, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(
       Integer, dart_seconds, arguments->NativeArgAt(0));
   int64_t seconds = dart_seconds.AsInt64Value();
-  if (seconds < 0 || seconds > kMaxAllowedSeconds) {
+  if (llabs(seconds) > kMaxAllowedSeconds) {
     Exceptions::ThrowArgumentError(dart_seconds);
   }
   const char* name = OS::GetTimeZoneName(seconds);
@@ -30,7 +30,7 @@
   GET_NON_NULL_NATIVE_ARGUMENT(
       Integer, dart_seconds, arguments->NativeArgAt(0));
   int64_t seconds = dart_seconds.AsInt64Value();
-  if (seconds < 0 || seconds > kMaxAllowedSeconds) {
+  if (llabs(seconds) > kMaxAllowedSeconds) {
     Exceptions::ThrowArgumentError(dart_seconds);
   }
   int offset = OS::GetTimeZoneOffsetInSeconds(seconds);
diff --git a/runtime/lib/date_patch.dart b/runtime/lib/date_patch.dart
index 4697901..1ecf812 100644
--- a/runtime/lib/date_patch.dart
+++ b/runtime/lib/date_patch.dart
@@ -284,14 +284,24 @@
     }
 
     if (!isUtc) {
-      // Note that we need to remove the local timezone adjustement before
+      // Note that we need to remove the local timezone adjustment before
       // asking for the correct zone offset.
       int adjustment = _localTimeZoneAdjustmentInSeconds() *
           Duration.MICROSECONDS_PER_SECOND;
+      // The adjustment is independent of the actual date and of the daylight
+      // saving time. It is positive east of the Prime Meridian and negative
+      // west of it, e.g. -28800 sec for America/Los_Angeles timezone.
 
       int zoneOffset =
           _timeZoneOffsetInSeconds(microsecondsSinceEpoch - adjustment);
+      // The zoneOffset depends on the actual date and reflects any daylight
+      // saving time and/or historical deviation relative to UTC time.
+      // It is positive east of the Prime Meridian and negative west of it,
+      // e.g. -25200 sec for America/Los_Angeles timezone during DST.
       microsecondsSinceEpoch -= zoneOffset * Duration.MICROSECONDS_PER_SECOND;
+      // The resulting microsecondsSinceEpoch value is therefore the calculated
+      // UTC value decreased by a (positive if east of GMT) timezone adjustment
+      // and decreased by typically one hour if DST is in effect.
     }
     if (microsecondsSinceEpoch.abs() >
         _MAX_MILLISECONDS_SINCE_EPOCH * Duration.MICROSECONDS_PER_MILLISECOND) {
@@ -314,7 +324,8 @@
    * Adapted from V8's date implementation. See ECMA 262 - 15.9.1.9.
    */
   static int _equivalentYear(int year) {
-    // Returns the week day (in range 0 - 6).
+    // Returns year y so that _weekDay(y) == _weekDay(year).
+    // _weekDay returns the week day (in range 0 - 6).
     // 1/1/1956 was a Sunday (i.e. weekday 0). 1956 was a leap-year.
     // 1/1/1967 was a Sunday (i.e. weekday 0).
     // Without leap years a subsequent year has a week day + 1 (for example
@@ -352,22 +363,24 @@
   }
 
   /**
-   * Returns a date in seconds that is equivalent to the current date. An
-   * equivalent date has the same fields (`month`, `day`, etc.) as the
-   * [this], but the `year` is in the range [1970..2037].
+   * Returns a date in seconds that is equivalent to the given
+   * date in microseconds [microsecondsSinceEpoch]. An equivalent
+   * date has the same fields (`month`, `day`, etc.) as the given
+   * date, but the `year` is in the range [1901..2038].
    *
    * * The time since the beginning of the year is the same.
-   * * If [this] is in a leap year then the returned seconds are in a leap
-   *   year, too.
-   * * The week day of [this] is the same as the one for the returned date.
+   * * If the given date is in a leap year then the returned
+   *   seconds are in a leap year, too.
+   * * The week day of given date is the same as the one for the
+   *   returned date.
    */
   static int _equivalentSeconds(int microsecondsSinceEpoch) {
-    const int CUT_OFF_SECONDS = 2100000000;
+    const int CUT_OFF_SECONDS = 0x7FFFFFFF;
 
     int secondsSinceEpoch = _flooredDivision(microsecondsSinceEpoch,
                                              Duration.MICROSECONDS_PER_SECOND);
 
-    if (secondsSinceEpoch < 0 || secondsSinceEpoch >= CUT_OFF_SECONDS) {
+    if (secondsSinceEpoch.abs() > CUT_OFF_SECONDS) {
       int year = _yearsFromSecondsSinceEpoch(secondsSinceEpoch);
       int days = _dayFromYear(year);
       int equivalentYear = _equivalentYear(year);
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index d24f75c..5127dce 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -333,12 +333,6 @@
     return CreateTypedefMirror(cls, type, is_declaration, owner_mirror);
   }
 
-  const Error& error = Error::Handle(cls.EnsureIsFinalized(Thread::Current()));
-  if (!error.IsNull()) {
-    Exceptions::PropagateError(error);
-    UNREACHABLE();
-  }
-
   const Array& args = Array::Handle(Array::New(9));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
   args.SetAt(1, type);
@@ -1471,6 +1465,12 @@
   GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
   GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
 
+  const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread));
+  if (!error.IsNull()) {
+    Exceptions::PropagateError(error);
+    UNREACHABLE();
+  }
+
   Function& function = Function::Handle(
       klass.LookupStaticFunction(function_name));
 
@@ -1543,6 +1543,11 @@
   // with its cousins.
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
   const Class& klass = Class::Handle(ref.GetClassReferent());
+  const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread));
+  if (!error.IsNull()) {
+    Exceptions::PropagateError(error);
+    UNREACHABLE();
+  }
   GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2));
   return InvokeClassGetter(klass, getter_name, true);
 }
@@ -1557,6 +1562,12 @@
   GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2));
   GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3));
 
+  const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread));
+  if (!error.IsNull()) {
+    Exceptions::PropagateError(error);
+    UNREACHABLE();
+  }
+
   // Check for real fields and user-defined setters.
   const Field& field = Field::Handle(klass.LookupStaticField(setter_name));
   Function& setter = Function::Handle();
@@ -1616,6 +1627,12 @@
   GET_NON_NULL_NATIVE_ARGUMENT(Array, explicit_args, arguments->NativeArgAt(3));
   GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
 
+  const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread));
+  if (!error.IsNull()) {
+    Exceptions::PropagateError(error);
+    UNREACHABLE();
+  }
+
   // By convention, the static function implementing a named constructor 'C'
   // for class 'A' is labeled 'A.C', and the static function implementing the
   // unnamed constructor for class 'A' is labeled 'A.'.
diff --git a/runtime/observatory/lib/app.dart b/runtime/observatory/lib/app.dart
index a0e52bb..15e802d 100644
--- a/runtime/observatory/lib/app.dart
+++ b/runtime/observatory/lib/app.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:html';
+import 'dart:math' as math;
 
 import 'package:logging/logging.dart';
 import 'package:observatory/service_html.dart';
diff --git a/runtime/observatory/lib/src/app/view_model.dart b/runtime/observatory/lib/src/app/view_model.dart
index 94edb49..6562e1f 100644
--- a/runtime/observatory/lib/src/app/view_model.dart
+++ b/runtime/observatory/lib/src/app/view_model.dart
@@ -4,6 +4,384 @@
 
 part of app;
 
+abstract class VirtualTreeRow {
+  // Number of ems each subtree is indented.
+  static const subtreeIndent = 1.05;
+
+  static const redColor = '#F44336';
+  static const blueColor = '#3F51B5';
+  static const purpleColor = '#673AB7';
+  static const greenColor = '#4CAF50';
+  static const orangeColor = '#FF9800';
+  static const lightGrayColor = '#FAFAFA';
+
+  List backgroundColors = const [
+    purpleColor,
+    redColor,
+    greenColor,
+    blueColor,
+    orangeColor,
+  ];
+
+  final VirtualTree tree;
+  final List<VirtualTreeRow> children = [];
+  final List<StreamSubscription> _listeners = [];
+  final int depth;
+  bool _expanded = false;
+
+  VirtualTreeRow(this.tree, this.depth);
+
+  bool get expanded => _expanded;
+
+  set expanded(bool expanded) {
+    var changed = _expanded != expanded;
+    _expanded = expanded;
+    if (!changed) {
+      return;
+    }
+    if (_expanded) {
+      _expand();
+    } else {
+      _collapse();
+    }
+  }
+
+  Element makeColorBar() {
+    var element = new SpanElement();
+    element.style.paddingLeft = '2px';
+    element.style.paddingRight = '2px';
+    element.style.flexBasis = '2px';
+    element.style.height = '${tree.rowHeight}px';
+    element.style.minHeight = '${tree.rowHeight}px';
+    if (depth > 0) {
+      var colorIndex = (depth - 1) % backgroundColors.length;
+      element.style.backgroundColor = backgroundColors[colorIndex];
+    }
+    return element;
+  }
+
+  Element makeExpander() {
+    SpanElement element = new SpanElement();
+    element.style.flexBasis = '2em';
+    if (!hasChildren()) {
+      element.style.visibility = 'hidden';
+    } else {
+      element.style.visibility = 'visible';
+      element.children.add(expanded ?
+          new Element.tag('icon-expand-more') :
+          new Element.tag('icon-chevron-right'));
+    }
+    _listeners.add(element.onClick.listen((e) {
+      e.stopPropagation();
+      toggle();
+    }));
+    return element;
+  }
+
+  Element makeIndenter({colored: true}) {
+    SpanElement element = new SpanElement();
+    element.style.paddingLeft = '${subtreeIndent * depth}em';
+    element.style.flexBasis = '${subtreeIndent * depth}em';
+    element.style.height = '${tree.rowHeight}px';
+    element.style.minHeight = '${tree.rowHeight}px';
+    if (colored) {
+      if (depth > 0) {
+        var colorIndex = (depth - 1) % backgroundColors.length;
+        element.style.backgroundColor = backgroundColors[colorIndex];
+      }
+    }
+    return element;
+  }
+
+  Element makeText(String text, {String toolTip, String flexBasis: '7em'}) {
+    SpanElement element = new SpanElement();
+    element.text = text;
+    if (toolTip != null) {
+      element.title = toolTip;
+    }
+    if (flexBasis != null) {
+      element.style.flexBasis = flexBasis;
+    }
+    return element;
+  }
+
+  Element makeGap({double ems: 0.5}) {
+    SpanElement element = new SpanElement();
+    var flexBasis = '${ems}em';
+    element.style.flexBasis = flexBasis;
+    return element;
+  }
+
+  void _cleanupListeners() {
+    for (var listener in _listeners) {
+      listener.cancel();
+    }
+    _listeners.clear();
+  }
+
+  void _expand() {
+    onShow();
+    tree._onExpand(this);
+    if (children.length == 1) {
+      children[0]._expand();
+    }
+    _expanded = true;
+  }
+
+  void _collapse() {
+    _expanded = false;
+    for (var i = 0; i < children.length; i++) {
+      if (children[i].expanded) {
+        children[i]._collapse();
+      }
+    }
+    tree._onCollapse(this);
+  }
+
+  void toggle() {
+    expanded = !expanded;
+  }
+
+  void _render(DivElement rowDiv) {
+    rowDiv.style.display = 'flex';
+    rowDiv.style.alignItems = 'center';
+    _cleanupListeners();
+    onShow();
+    onRender(rowDiv);
+  }
+
+  /// Called when you should render into [rowDiv].
+  void onRender(DivElement rowDiv);
+
+  // Called when this row is visible.
+  void onShow();
+
+  // Return the number of children this node has.
+  int get childCount => 0;
+
+  // Return true if this node can be expanded.
+  bool hasChildren() => childCount > 0;
+
+  // Called when this row is not visible.
+  void onHide() {
+    _cleanupListeners();
+  }
+}
+
+class VirtualTree {
+  final int rowHeight;
+  final List<VirtualTreeRow> rows = [];
+  final DivElement root;
+  final Stopwatch _clock = new Stopwatch();
+
+  DivElement _treeHeightElement;
+  DivElement _tree;
+
+  StreamSubscription _scrollSubscription;
+  StreamSubscription _resizeSubscription;
+
+  // Height of [root] in pixels.
+  int viewHeight;
+
+  // Number of pixels view can be scrolled before a redraw occurs.
+  int redrawThresholdPixels;
+
+  // Number of rows visible at any given time.
+  int numVisibleRows;
+  // Number of rows above the current view that are in the dom.
+  int extraRowsAbove;
+  // Number of rows below the current view that are in the dom.
+  int extraRowsBelow;
+
+  // The scroll top of the last scroll event.
+  int lastPaintScrollTop;
+
+  // The starting row of the last paint.
+  int lastPaintStartingRow = 0;
+
+  bool paintScheduled = false;
+
+  bool scrolled = false;
+
+  static const scrollStopThresholdMilliseconds = 100;
+
+  VirtualTree(this.rowHeight, this.root) {
+    _clock.start();
+    _install();
+    _resize();
+    _schedulePaint(0);
+  }
+
+  void uninstall() => _uninstall();
+
+  void refresh() {
+    _resize();
+    _schedulePaint(lastPaintStartingRow);
+  }
+
+  // Clear the tree.
+  void clear() {
+    rows.clear();
+    _resize();
+  }
+
+  void _onExpand(VirtualTreeRow parent) {
+    int index = rows.indexOf(parent);
+    if (index == -1) {
+      return;
+    }
+    rows.insertAll(index + 1, parent.children);
+    refresh();
+  }
+
+  void _onCollapse(VirtualTreeRow parent) {
+    int index = rows.indexOf(parent);
+    if (index == -1) {
+      return;
+    }
+    int start = index + 1;
+    int end = start + parent.children.length;
+    rows.removeRange(start, end);
+    refresh();
+  }
+
+  void _resize() {
+    if (viewHeight != root.offsetHeight) {
+      viewHeight = root.offsetHeight;
+      numVisibleRows = (viewHeight ~/ rowHeight) + 1;
+      extraRowsAbove = numVisibleRows ~/ 2;
+      extraRowsBelow = numVisibleRows - extraRowsAbove;
+      redrawThresholdPixels =
+          math.min(extraRowsAbove, extraRowsBelow) * rowHeight;
+    }
+    _treeHeightElement.style.height = '${_treeHeight()}px';
+  }
+
+  int _treeHeight() {
+    return rows.length * rowHeight;
+  }
+
+  int _pixelsFromLastScroll(int currentScrollTop) {
+    if (lastPaintScrollTop == null) {
+      return currentScrollTop;
+    }
+
+    return (currentScrollTop - lastPaintScrollTop).abs();
+  }
+
+  int _pixelToRow(int pixelY) {
+    int result = pixelY ~/ rowHeight;
+    return result;
+  }
+
+  void _install() {
+    // This element controls the height of the tree's scrollable region.
+    // It is one pixel wide and the height is set to rowHeight * numRows.
+    _treeHeightElement = new DivElement();
+    _treeHeightElement.style.position = 'absolute';
+    _treeHeightElement.style.top = '0';
+    _treeHeightElement.style.left = '0';
+    _treeHeightElement.style.width = '1px';
+
+    // This element holds the visible tree rows and the height controlling
+    // element. It takes the full width and height of its parent element.
+    _tree = new DivElement();
+    _tree.children.add(_treeHeightElement);
+    _tree.style.width = '100%';
+    _tree.style.height = '100%';
+    _tree.style.position = 'relative';
+    _tree.style.overflow = 'auto';
+
+    // Listen for scroll events on the tree.
+    _scrollSubscription = _tree.onScroll.listen(_onScroll);
+
+    root.children.add(_tree);
+
+    // Listen for resize events.
+    _resizeSubscription = window.onResize.listen((_) {
+      _resize();
+      _schedulePaint(lastPaintStartingRow);
+    });
+  }
+
+  void _uninstall() {
+    root.children.clear();
+    _scrollSubscription?.cancel();
+    _scrollSubscription = null;
+    _resizeSubscription?.cancel();
+    _resizeSubscription = null;
+  }
+
+  void _onScroll(Event scrollEvent) {
+    Element target = scrollEvent.target;
+    int scrollTop = target.scrollTop;
+    if (_pixelsFromLastScroll(scrollTop) > redrawThresholdPixels) {
+      _schedulePaint(lastPaintStartingRow);
+      scrolled = true;
+    }
+    scrollEvent.preventDefault();
+  }
+
+  void _schedulePaint(int startingRow) {
+    if (paintScheduled) {
+      return;
+    }
+    paintScheduled = true;
+    window.requestAnimationFrame(
+        (timestamp) => _onRenderFrame(timestamp, startingRow));
+  }
+
+  void _onRenderFrame(int timestamp, int startingRow) {
+    paintScheduled = false;
+    _paint(startingRow);
+  }
+
+  void _paint(int startingRow) {
+    if (scrolled) {
+      startingRow = math.max(_pixelToRow(_tree.scrollTop), 0);
+      scrolled = false;
+    }
+    lastPaintScrollTop = _tree.scrollTop;
+    lastPaintStartingRow = startingRow;
+
+    int endingRow =
+        math.min(rows.length, startingRow + numVisibleRows + extraRowsBelow);
+
+    startingRow =
+        math.max(0, startingRow - extraRowsAbove);
+
+    print('PAINT $startingRow $endingRow');
+
+    for (int i = startingRow; i < endingRow; i++) {
+      // We add 1 because _tree.children[0] contains the height control element.
+      int cacheIndex = (i - startingRow) + 1;
+      DivElement row;
+      if (cacheIndex < _tree.children.length) {
+        // re-use existing row.
+        row = _tree.children[cacheIndex];
+        row.children.clear();
+      } else {
+        // Allocate a new row.
+        row = new DivElement();
+        row.style.position = 'absolute';
+        row.style.height = '${rowHeight}px';
+        row.style.maxHeight = '${rowHeight}px';
+        row.style.margin = '0';
+        row.style.width = '100%';
+        row.style.left = '0';
+        _tree.children.add(row);
+      }
+      row.style.top = '${(i * rowHeight)}px';
+      // Render the row.
+      rows[i]._render(row);
+    }
+    int necessaryChildren = (endingRow - startingRow) + 1;
+    while (_tree.children.length > necessaryChildren) {
+      _tree.children.removeLast();
+    }
+  }
+}
+
 abstract class TableTreeRow extends Observable {
   static const arrowRight = '\u2192';
   static const arrowDownRight = '\u21b3';
diff --git a/runtime/observatory/lib/src/elements/code_view.dart b/runtime/observatory/lib/src/elements/code_view.dart
index 9234164..d8fa1c7 100644
--- a/runtime/observatory/lib/src/elements/code_view.dart
+++ b/runtime/observatory/lib/src/elements/code_view.dart
@@ -210,7 +210,7 @@
       if (content is ServiceObject) {
         ServiceRefElement element = new Element.tag('any-service-ref');
         element.ref = content;
-        cell.append(element);
+        cell.children = [element];
       } else if (content != null) {
         cell.text = content.toString();
       }
diff --git a/runtime/observatory/lib/src/elements/cpu_profile.dart b/runtime/observatory/lib/src/elements/cpu_profile.dart
index c026d7c..6f74bbc 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile.dart
@@ -569,6 +569,109 @@
   @observable String directionSelector = 'Up';
 }
 
+class FunctionCallTreeNodeRow extends VirtualTreeRow {
+  final CpuProfile profile;
+  final FunctionCallTreeNode node;
+  final String selfPercent;
+  final String totalPercent;
+  final String percent;
+
+  FunctionCallTreeNodeRow(VirtualTree tree,
+                          int depth,
+                          this.profile,
+                          FunctionCallTreeNode node)
+      : node = node,
+        selfPercent = Utils.formatPercentNormalized(node.profileFunction.normalizedExclusiveTicks),
+        totalPercent = Utils.formatPercentNormalized(node.profileFunction.normalizedInclusiveTicks),
+        percent = Utils.formatPercentNormalized(node.percentage),
+        super(tree, depth) {
+  }
+
+  void onRender(DivElement rowDiv) {
+    rowDiv.children.add(
+        makeText(totalPercent, toolTip: 'global % on stack'));
+    rowDiv.children.add(makeGap());
+    rowDiv.children.add(
+        makeText(selfPercent, toolTip: 'global % executing'));
+    rowDiv.children.add(makeGap());
+    rowDiv.children.add(makeIndenter(colored: false));
+    rowDiv.children.add(makeColorBar());
+    rowDiv.children.add(makeGap(ems: 1.0));
+    rowDiv.children.add(makeExpander());
+    rowDiv.children.add(
+        makeText(percent, toolTip: 'tree node %', flexBasis: null));
+    rowDiv.children.add(makeGap(ems: 0.5));
+    functionRef.ref = node.profileFunction.function;
+    rowDiv.children.add(functionRef);
+  }
+
+  var functionRef = new Element.tag('function-ref');
+
+  int get childCount => node.children.length;
+
+  void onShow() {
+    if (children.length > 0) {
+      return;
+    }
+    for (var childNode in node.children) {
+      var row = new FunctionCallTreeNodeRow(tree, depth + 1, profile, childNode);
+      children.add(row);
+    }
+  }
+}
+
+
+class CodeCallTreeNodeRow extends VirtualTreeRow {
+  final CpuProfile profile;
+  final CodeCallTreeNode node;
+  final String selfPercent;
+  final String totalPercent;
+  final String percent;
+
+  CodeCallTreeNodeRow(VirtualTree tree,
+                      int depth,
+                      this.profile,
+                      CodeCallTreeNode node)
+      : node = node,
+        selfPercent = Utils.formatPercentNormalized(node.profileCode.normalizedExclusiveTicks),
+        totalPercent = Utils.formatPercentNormalized(node.profileCode.normalizedInclusiveTicks),
+        percent = Utils.formatPercentNormalized(node.percentage),
+        super(tree, depth) {
+  }
+
+  void onRender(DivElement rowDiv) {
+    rowDiv.children.add(
+        makeText(totalPercent, toolTip: 'global % on stack'));
+    rowDiv.children.add(makeGap());
+    rowDiv.children.add(
+        makeText(selfPercent, toolTip: 'global % executing'));
+    rowDiv.children.add(makeGap());
+    rowDiv.children.add(makeIndenter(colored: false));
+    rowDiv.children.add(makeColorBar());
+    rowDiv.children.add(makeGap(ems: 1.0));
+    rowDiv.children.add(makeExpander());
+    rowDiv.children.add(
+        makeText(percent, toolTip: 'tree node %', flexBasis: null));
+    rowDiv.children.add(makeGap(ems: 0.5));
+    codeRef.ref = node.profileCode.code;
+    rowDiv.children.add(codeRef);
+  }
+
+  var codeRef = new Element.tag('code-ref');
+
+  int get childCount => node.children.length;
+
+  void onShow() {
+    if (children.length > 0) {
+      return;
+    }
+    for (var childNode in node.children) {
+      var row = new CodeCallTreeNodeRow(tree, depth + 1, profile, childNode);
+      children.add(row);
+    }
+  }
+}
+
 /// Displays a CpuProfile
 @CustomTag('cpu-profile')
 class CpuProfileElement extends ObservatoryElement {
@@ -587,10 +690,32 @@
         shadowRoot.querySelector('#stackTraceTreeConfig');
     assert(stackTraceTreeConfigElement != null);
     stackTraceTreeConfigElement.onTreeConfigChange = onTreeConfigChange;
-    cpuProfileTreeElement = shadowRoot.querySelector('#cpuProfileTree');
-    assert(cpuProfileTreeElement != null);
-    cpuProfileTreeElement.profile = sampleBufferControlElement.profile;
+    cpuProfileVirtualTreeElement = shadowRoot.querySelector('#cpuProfileVirtualTree');
+    assert(cpuProfileVirtualTreeElement != null);
+    cpuProfileVirtualTreeElement.profile = sampleBufferControlElement.profile;
+    _resizeSubscription = window.onResize.listen((_) => _updateSize());
     _updateTask.queue();
+    _updateSize();
+  }
+
+  detached() {
+    super.detached();
+    if (_resizeSubscription != null) {
+      _resizeSubscription.cancel();
+    }
+  }
+
+  _updateSize() {
+    var applySize = (e) {
+      Rectangle rect = e.getBoundingClientRect();
+      final totalHeight = window.innerHeight;
+      final top = rect.top;
+      final bottomMargin = 200;
+      final mainHeight = totalHeight - top - bottomMargin;
+      e.style.setProperty('height', '${mainHeight}px');
+    };
+    HtmlElement e2 = $['cpuProfileVirtualTree'];
+    applySize(e2);
   }
 
   isolateChanged(oldValue) {
@@ -616,8 +741,8 @@
     if (modeSelector == 'Code') {
       mode = ProfileTreeMode.Code;
     }
-    cpuProfileTreeElement.direction = direction;
-    cpuProfileTreeElement.mode = mode;
+    cpuProfileVirtualTreeElement.direction = direction;
+    cpuProfileVirtualTreeElement.mode = mode;
     _renderTask.queue();
   }
 
@@ -633,16 +758,17 @@
   }
 
   render() {
-    cpuProfileTreeElement.render();
+    cpuProfileVirtualTreeElement.render();
   }
 
   @published Isolate isolate;
 
+  StreamSubscription _resizeSubscription;
   Task _updateTask;
   Task _renderTask;
   SampleBufferControlElement sampleBufferControlElement;
   StackTraceTreeConfigElement stackTraceTreeConfigElement;
-  CpuProfileTreeElement cpuProfileTreeElement;
+  CpuProfileVirtualTreeElement cpuProfileVirtualTreeElement;
 }
 
 class NameSortedTable extends SortedTable {
@@ -1140,6 +1266,85 @@
   Function,
 }
 
+@CustomTag('cpu-profile-virtual-tree')
+class CpuProfileVirtualTreeElement extends ObservatoryElement {
+  ProfileTreeDirection direction = ProfileTreeDirection.Exclusive;
+  ProfileTreeMode mode = ProfileTreeMode.Function;
+  CpuProfile profile;
+  VirtualTree virtualTree;
+  FunctionCallTreeNodeFilter functionFilter;
+  @observable bool show = true;
+
+  CpuProfileVirtualTreeElement.created() : super.created();
+
+  void render() {
+    _updateView();
+  }
+
+  showChanged(oldValue) {
+    var treeTable = shadowRoot.querySelector('#treeTable');
+    assert(treeTable != null);
+    treeTable.style.display = show ? 'table' : 'none';
+  }
+
+  void _updateView() {
+    virtualTree?.clear();
+    virtualTree?.uninstall();
+    virtualTree = null;
+    bool exclusive = direction == ProfileTreeDirection.Exclusive;
+    if (mode == ProfileTreeMode.Code) {
+      _buildCodeTree(exclusive);
+    } else {
+      assert(mode == ProfileTreeMode.Function);
+      _buildFunctionTree(exclusive);
+    }
+    virtualTree?.refresh();
+  }
+
+  void _buildFunctionTree(bool exclusive) {
+    var treeBody = shadowRoot.querySelector('#tree');
+    assert(treeBody != null);
+    virtualTree = new VirtualTree(32, treeBody);
+    if (profile == null) {
+      return;
+    }
+    var tree = profile.loadFunctionTree(exclusive ? 'exclusive' : 'inclusive');
+    if (tree == null) {
+      return;
+    }
+    if (functionFilter != null) {
+      tree = tree.filtered(functionFilter);
+    }
+    for (var child in tree.root.children) {
+      virtualTree.rows.add(
+          new FunctionCallTreeNodeRow(virtualTree, 0, profile, child));
+    }
+    if (virtualTree.rows.length == 1) {
+      virtualTree.rows[0].expanded = true;
+    }
+  }
+
+  void _buildCodeTree(bool exclusive) {
+    var treeBody = shadowRoot.querySelector('#tree');
+    assert(treeBody != null);
+    virtualTree = new VirtualTree(32, treeBody);
+    if (profile == null) {
+      return;
+    }
+    var tree = profile.loadCodeTree(exclusive ? 'exclusive' : 'inclusive');
+    if (tree == null) {
+      return;
+    }
+    for (var child in tree.root.children) {
+      virtualTree.rows.add(
+          new CodeCallTreeNodeRow(virtualTree, 0, profile, child));
+    }
+    if (virtualTree.rows.length == 1) {
+      virtualTree.rows[0].expanded = true;
+    }
+  }
+}
+
 @CustomTag('cpu-profile-tree')
 class CpuProfileTreeElement extends ObservatoryElement {
   ProfileTreeDirection direction = ProfileTreeDirection.Exclusive;
diff --git a/runtime/observatory/lib/src/elements/cpu_profile.html b/runtime/observatory/lib/src/elements/cpu_profile.html
index d76cb19..68eb99a 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile.html
+++ b/runtime/observatory/lib/src/elements/cpu_profile.html
@@ -237,6 +237,20 @@
   </template>
 </polymer-element>
 
+<polymer-element name="cpu-profile-virtual-tree" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <style>
+    .full {
+      height: 50%;
+      width: 100%;
+    }
+    </style>
+    <div id="tree" class="full"></div>
+  </template>
+</polymer-element>
+
+
 <polymer-element name="cpu-profile-table" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -472,12 +486,7 @@
     <br>
     <stack-trace-tree-config id="stackTraceTreeConfig"></stack-trace-tree-config>
     <br>
-    <div class="content-centered-big">
-      <div class="tableWell shadow">
-        <cpu-profile-tree id="cpuProfileTree"></cpu-profile-tree>
-      </div>
-    </div>
-    <view-footer></view-footer>
+    <cpu-profile-virtual-tree class="shadow" id="cpuProfileVirtualTree"></cpu-profile-virtual-tree>
   </template>
 </polymer-element>
 
diff --git a/runtime/observatory/lib/src/elements/nav_bar.html b/runtime/observatory/lib/src/elements/nav_bar.html
index 4299d0c..983f8af 100644
--- a/runtime/observatory/lib/src/elements/nav_bar.html
+++ b/runtime/observatory/lib/src/elements/nav_bar.html
@@ -386,7 +386,7 @@
         margin-top: 10px;
         margin-right: 10px;
         padding-right: 25px;
-        width: 250px;
+        width: 500px;
         color: #ddd;
         background: rgba(0,0,0,.6);
         border: solid 2px white;
@@ -428,6 +428,9 @@
       a.boxclose:hover {
         background: rgba(255,255,255,0.5);
       }
+      .stacktrace {
+        white-space: pre
+      }
     </style>
     <template if="{{ isUnexpectedError }}">
       <!-- TODO(turnidge): Add a file-a-bug link to this notification -->
@@ -436,7 +439,7 @@
         <div class="indent">{{ exception.toString() }}</div><br>
         <template if="{{ stacktrace != null }}">
           Stacktrace:<br><br>
-          <div class="indent">{{ stacktrace.toString() }}</div>
+          <div class="indent stacktrace">{{ stacktrace.toString() }}</div>
           <br>
         </template>
         [<a class="link" on-click="{{ goto }}"
diff --git a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
index 3b646c7..73218e4 100644
--- a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
@@ -31,7 +31,7 @@
   (VM vm) async {
     // Modify a flag.
     var params = {
-      'name' : 'trace_isolates',
+      'name' : 'trace_profiler',
       'value' : '123',
     };
     var result = await vm.invokeRpcNoUpgrade('_setFlag', params);
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index ea968d8..b19dfc8 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -100,17 +100,13 @@
   assert(defined(invoker.filename), "Need a filename in $target_name")
   assert(defined(invoker.kind), "Need kind in $target_name")
   assert(defined(invoker.output), "Need output in $target_name")
+  assert(defined(invoker.path), "Need path in $target_name")
   action(target_name) {
     visibility = [ ":*" ]  # Only targets in this file can see this.
     libname = invoker.libname
     filename = invoker.filename
     kind = invoker.kind
-
-    if (kind == "source") {
-      path = "../../sdk/lib/${filename}"
-    } else {
-      path = "../lib"
-    }
+    path = invoker.path
 
     lib_sources_gypi =
         exec_script("../../tools/gypi_to_gn.py",
@@ -155,17 +151,24 @@
   foreach(lib, invoker.sources) {
     libname = lib[0]
     filename = lib[1]
+    do_patch = lib[2]
+    source_path = lib[3]
     generate_library_source("generate_${filename}_cc_file") {
       libname = libname
       filename = filename
       kind = "source"
+      path = source_path
       output = "$target_gen_dir/${filename}_gen.cc"
     }
-    generate_library_source("generate_${filename}_patch_cc_file") {
-      libname = libname
-      filename = filename
-      kind = "patch"
-      output = "$target_gen_dir/${filename}_patch_gen.cc"
+    if (do_patch) {
+      patch_path = lib[4]
+      generate_library_source("generate_${filename}_patch_cc_file") {
+        libname = libname
+        filename = filename
+        kind = "patch"
+        path = patch_path
+        output = "$target_gen_dir/${filename}_patch_gen.cc"
+      }
     }
     lib_sources_gypi =
         exec_script("../../tools/gypi_to_gn.py",
@@ -173,10 +176,12 @@
                     "scope",
                     ["../lib/${filename}_sources.gypi"])
     libsources += rebase_path(lib_sources_gypi.sources, ".", "../lib")
-    liboutputs += ["$target_gen_dir/${filename}_gen.cc",
-                   "$target_gen_dir/${filename}_patch_gen.cc"]
-    libdeps += [":generate_${filename}_cc_file",
-                ":generate_${filename}_patch_cc_file"]
+    liboutputs += ["$target_gen_dir/${filename}_gen.cc"]
+    libdeps += [":generate_${filename}_cc_file"]
+    if (do_patch) {
+      liboutputs += ["$target_gen_dir/${filename}_patch_gen.cc"]
+      libdeps += [":generate_${filename}_patch_cc_file"]
+    }
   }
 
   static_library("libdart_lib_nosnapshot") {
@@ -207,17 +212,17 @@
 
 generate_core_libraries("core_libraries") {
   sources = [
-    ["async", "async"],
-    ["core", "core"],
-    ["collection", "collection"],
-    ["convert", "convert"],
-    ["developer", "developer"],
-    ["_internal", "internal"],
-    ["isolate", "isolate"],
-    ["math", "math"],
-    ["mirrors", "mirrors"],
-    ["profiler", "profiler"],
-    ["typed_data", "typed_data"],
-    ["_vmservice", "vmservice"],
+    ["async", "async", true, "../../sdk/lib/async", "../lib"],
+    ["core", "core", true, "../../sdk/lib/core", "../lib"],
+    ["collection", "collection", true, "../../sdk/lib/collection", "../lib"],
+    ["convert", "convert", true, "../../sdk/lib/convert", "../lib"],
+    ["developer", "developer", true, "../../sdk/lib/developer", "../lib"],
+    ["_internal", "internal", true, "../../sdk/lib/internal", "../lib"],
+    ["isolate", "isolate", true, "../../sdk/lib/isolate", "../lib"],
+    ["math", "math", true, "../../sdk/lib/math", "../lib"],
+    ["mirrors", "mirrors", true, "../../sdk/lib/mirrors", "../lib"],
+    ["profiler", "profiler", false, "../../sdk/lib/profiler"],
+    ["typed_data", "typed_data", false, "../lib"],
+    ["_vmservice", "vmservice", true, "../../sdk/lib/vmservice", "../lib"],
   ]
 }
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
index 102cf96..1e72f79 100644
--- a/runtime/vm/aot_optimizer.cc
+++ b/runtime/vm/aot_optimizer.cc
@@ -227,32 +227,6 @@
     }
   }
 
-  // Check if getter or setter in function's class and class is currently leaf.
-  if (FLAG_guess_icdata_cid &&
-      ((call->token_kind() == Token::kGET) ||
-          (call->token_kind() == Token::kSET))) {
-    const Class& owner_class = Class::Handle(Z, function().Owner());
-    if (!owner_class.is_abstract() &&
-        !CHA::HasSubclasses(owner_class) &&
-        !CHA::IsImplemented(owner_class)) {
-      const Array& args_desc_array = Array::Handle(Z,
-          ArgumentsDescriptor::New(call->ArgumentCount(),
-                                   call->argument_names()));
-      ArgumentsDescriptor args_desc(args_desc_array);
-      const Function& function = Function::Handle(Z,
-          Resolver::ResolveDynamicForReceiverClass(owner_class,
-                                                   call->function_name(),
-                                                   args_desc));
-      if (!function.IsNull()) {
-        const ICData& ic_data = ICData::ZoneHandle(Z,
-            ICData::NewFrom(*call->ic_data(), class_ids.length()));
-        ic_data.AddReceiverCheck(owner_class.id(), function);
-        call->set_ic_data(&ic_data);
-        return true;
-      }
-    }
-  }
-
   return false;
 }
 
@@ -2405,6 +2379,25 @@
 }
 
 
+static bool HasLikelySmiOperand(InstanceCallInstr* instr) {
+  // Phis with at least one known smi are // guessed to be likely smi as well.
+  for (intptr_t i = 0; i < instr->ArgumentCount(); ++i) {
+    PhiInstr* phi = instr->ArgumentAt(i)->AsPhi();
+    if (phi != NULL) {
+      for (intptr_t j = 0; j < phi->InputCount(); ++j) {
+        if (phi->InputAt(j)->Type()->ToCid() == kSmiCid) return true;
+      }
+    }
+  }
+  // If all of the inputs are known smis or the result of CheckedSmiOp,
+  // we guess the operand to be likely smi.
+  for (intptr_t i = 0; i < instr->ArgumentCount(); ++i) {
+    if (!instr->ArgumentAt(i)->IsCheckedSmiOp()) return false;
+  }
+  return true;
+}
+
+
 // Tries to optimize instance call by replacing it with a faster instruction
 // (e.g, binary op, field load, ..).
 void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) {
@@ -2495,8 +2488,10 @@
     case Token::kBIT_XOR:
     case Token::kBIT_AND:
     case Token::kADD:
-    case Token::kSUB: {
-      if (HasOnlyTwoOf(*instr->ic_data(), kSmiCid)) {
+    case Token::kSUB:
+    case Token::kMUL: {
+      if (HasOnlyTwoOf(*instr->ic_data(), kSmiCid) ||
+          HasLikelySmiOperand(instr)) {
         Definition* left = instr->ArgumentAt(0);
         Definition* right = instr->ArgumentAt(1);
         CheckedSmiOpInstr* smi_op =
@@ -2508,11 +2503,56 @@
         ReplaceCall(instr, smi_op);
         return;
       }
+      break;
     }
     default:
       break;
   }
 
+  // No IC data checks. Try resolve target using the propagated type.
+  // If the propagated type has a method with the target name and there are
+  // no overrides with that name according to CHA, call the method directly.
+  const intptr_t receiver_cid =
+      instr->PushArgumentAt(0)->value()->Type()->ToCid();
+  if (receiver_cid != kDynamicCid) {
+    const Class& receiver_class = Class::Handle(Z,
+        isolate()->class_table()->At(receiver_cid));
+
+    const Array& args_desc_array = Array::Handle(Z,
+        ArgumentsDescriptor::New(instr->ArgumentCount(),
+                                 instr->argument_names()));
+    ArgumentsDescriptor args_desc(args_desc_array);
+    const Function& function = Function::Handle(Z,
+        Resolver::ResolveDynamicForReceiverClass(
+            receiver_class,
+            instr->function_name(),
+            args_desc));
+    if (!function.IsNull()) {
+      if (!thread()->cha()->HasOverride(receiver_class,
+                                        instr->function_name())) {
+        if (FLAG_trace_cha) {
+          THR_Print("  **(CHA) Instance call needs no check, "
+              "no overrides of '%s' '%s'\n",
+              instr->function_name().ToCString(), receiver_class.ToCString());
+        }
+
+        // Create fake IC data with the resolved target.
+        const ICData& ic_data = ICData::Handle(
+            ICData::New(flow_graph_->function(),
+                        instr->function_name(),
+                        args_desc_array,
+                        Thread::kNoDeoptId,
+                        /* args_tested = */ 1));
+        ic_data.AddReceiverCheck(receiver_class.id(), function);
+        PolymorphicInstanceCallInstr* call =
+            new(Z) PolymorphicInstanceCallInstr(instr, ic_data,
+                                                /* with_checks = */ false);
+        instr->ReplaceWith(call, current_iterator());
+        return;
+      }
+    }
+  }
+
   // More than one targets. Generate generic polymorphic call without
   // deoptimization.
   if (instr->ic_data()->NumberOfUsedChecks() > 0) {
@@ -2525,49 +2565,6 @@
     instr->ReplaceWith(call, current_iterator());
     return;
   }
-
-  // No IC data checks. Try resolve target using the propagated type.
-  // If the propagated type has a method with the target name and there are
-  // no overrides with that name according to CHA, call the method directly.
-  const intptr_t receiver_cid =
-      instr->PushArgumentAt(0)->value()->Type()->ToCid();
-  if (receiver_cid == kDynamicCid) return;
-  const Class& receiver_class = Class::Handle(Z,
-      isolate()->class_table()->At(receiver_cid));
-
-  const Array& args_desc_array = Array::Handle(Z,
-      ArgumentsDescriptor::New(instr->ArgumentCount(),
-                               instr->argument_names()));
-  ArgumentsDescriptor args_desc(args_desc_array);
-  const Function& function = Function::Handle(Z,
-      Resolver::ResolveDynamicForReceiverClass(
-          receiver_class,
-          instr->function_name(),
-          args_desc));
-  if (function.IsNull()) {
-    return;
-  }
-  if (!thread()->cha()->HasOverride(receiver_class, instr->function_name())) {
-    if (FLAG_trace_cha) {
-      THR_Print("  **(CHA) Instance call needs no check, "
-          "no overrides of '%s' '%s'\n",
-          instr->function_name().ToCString(), receiver_class.ToCString());
-    }
-    thread()->cha()->AddToLeafClasses(receiver_class);
-
-    // Create fake IC data with the resolved target.
-    const ICData& ic_data = ICData::Handle(
-        ICData::New(flow_graph_->function(),
-                    instr->function_name(),
-                    args_desc_array,
-                    Thread::kNoDeoptId,
-                    /* args_tested = */ 1));
-    ic_data.AddReceiverCheck(receiver_class.id(), function);
-    PolymorphicInstanceCallInstr* call =
-        new(Z) PolymorphicInstanceCallInstr(instr, ic_data,
-                                            /* with_checks = */ false);
-    instr->ReplaceWith(call, current_iterator());
-  }
 }
 
 
diff --git a/runtime/vm/atomic.h b/runtime/vm/atomic.h
index bd489d0..fc6257e 100644
--- a/runtime/vm/atomic.h
+++ b/runtime/vm/atomic.h
@@ -53,6 +53,12 @@
   static uword LoadRelaxed(uword* ptr) {
     return *static_cast<volatile uword*>(ptr);
   }
+
+  // Performs a load of a word from 'ptr', but without any guarantees about
+  // memory order (i.e., no load barriers/fences).
+  static intptr_t LoadRelaxedIntPtr(intptr_t* ptr) {
+    return *static_cast<volatile intptr_t*>(ptr);
+  }
 };
 
 
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index bb7d5e0..11b7f8c 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1793,6 +1793,17 @@
 // materialization phase.
 DEFINE_RUNTIME_ENTRY(DeoptimizeMaterialize, 0) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
+#if defined(DEBUG)
+  {
+    // We may rendezvous for a safepoint at entry or GC from the allocations
+    // below. Check the stack is walkable.
+    StackFrameIterator frames_iterator(StackFrameIterator::kValidateFrames);
+    StackFrame* frame = frames_iterator.NextFrame();
+    while (frame != NULL) {
+      frame = frames_iterator.NextFrame();
+    }
+  }
+#endif
   DeoptContext* deopt_context = isolate->deopt_context();
   intptr_t deopt_arg_count = deopt_context->MaterializeDeferredObjects();
   isolate->set_deopt_context(NULL);
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index d7a889c..bf5eac5 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -378,10 +378,9 @@
         optimized_(optimized),
         osr_id_(osr_id),
         thread_(Thread::Current()),
-        cha_invalidation_gen_at_start_(isolate()->cha_invalidation_gen()),
         field_invalidation_gen_at_start_(isolate()->field_invalidation_gen()),
-        prefix_invalidation_gen_at_start_(
-            isolate()->prefix_invalidation_gen()) {
+        loading_invalidation_gen_at_start_(
+            isolate()->loading_invalidation_gen()) {
   }
 
   bool Compile(CompilationPipeline* pipeline);
@@ -392,14 +391,11 @@
   intptr_t osr_id() const { return osr_id_; }
   Thread* thread() const { return thread_; }
   Isolate* isolate() const { return thread_->isolate(); }
-  uint32_t cha_invalidation_gen_at_start() const {
-    return cha_invalidation_gen_at_start_;
-  }
-  uint32_t field_invalidation_gen_at_start() const {
+  intptr_t field_invalidation_gen_at_start() const {
     return field_invalidation_gen_at_start_;
   }
-  uint32_t prefix_invalidation_gen_at_start() const {
-    return prefix_invalidation_gen_at_start_;
+  intptr_t loading_invalidation_gen_at_start() const {
+    return loading_invalidation_gen_at_start_;
   }
   void FinalizeCompilation(Assembler* assembler,
                            FlowGraphCompiler* graph_compiler,
@@ -409,9 +405,8 @@
   const bool optimized_;
   const intptr_t osr_id_;
   Thread* const thread_;
-  const uint32_t cha_invalidation_gen_at_start_;
-  const uint32_t field_invalidation_gen_at_start_;
-  const uint32_t prefix_invalidation_gen_at_start_;
+  const intptr_t field_invalidation_gen_at_start_;
+  const intptr_t loading_invalidation_gen_at_start_;
 
   DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper);
 };
@@ -501,15 +496,6 @@
       const bool trace_compiler =
           FLAG_trace_compiler || FLAG_trace_optimizing_compiler;
       bool code_is_valid = true;
-      if (!thread()->cha()->leaf_classes().is_empty()) {
-        if (cha_invalidation_gen_at_start() !=
-            isolate()->cha_invalidation_gen()) {
-          code_is_valid = false;
-          if (trace_compiler) {
-            THR_Print("--> FAIL: CHA invalidation.");
-          }
-        }
-      }
       if (!flow_graph->parsed_function().guarded_fields()->is_empty()) {
         if (field_invalidation_gen_at_start() !=
             isolate()->field_invalidation_gen()) {
@@ -519,13 +505,11 @@
           }
         }
       }
-      if (parsed_function()->HasDeferredPrefixes()) {
-        if (prefix_invalidation_gen_at_start() !=
-            isolate()->prefix_invalidation_gen()) {
-          code_is_valid = false;
-          if (trace_compiler) {
-            THR_Print("--> FAIL: Prefix invalidation.");
-          }
+      if (loading_invalidation_gen_at_start() !=
+          isolate()->loading_invalidation_gen()) {
+        code_is_valid = false;
+        if (trace_compiler) {
+          THR_Print("--> FAIL: Loading invalidation.");
         }
       }
       if (code_is_valid) {
@@ -1154,6 +1138,9 @@
     if (optimized) {
       INC_STAT(thread, num_functions_optimized, 1);
     }
+    // Makes sure no classes are loaded during parsing in background.
+    const intptr_t loading_invalidation_gen_at_start =
+        isolate->loading_invalidation_gen();
     {
       HANDLESCOPE(thread);
       const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed);
@@ -1164,13 +1151,29 @@
                num_tokens_after - num_tokens_before);
     }
 
+
     CompileParsedFunctionHelper helper(parsed_function, optimized, osr_id);
+
+    if (Compiler::IsBackgroundCompilation()) {
+      if (isolate->IsTopLevelParsing() ||
+              (loading_invalidation_gen_at_start !=
+               isolate->loading_invalidation_gen())) {
+        // Loading occured while parsing. We need to abort here because state
+        // changed while compiling.
+        Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+      }
+    }
+
     const bool success = helper.Compile(pipeline);
     if (!success) {
       if (optimized) {
         if (Compiler::IsBackgroundCompilation()) {
           // Try again later, background compilation may abort because of
           // state change during compilation.
+          if (FLAG_trace_compiler) {
+            THR_Print("Aborted background compilation: %s\n",
+                function.ToFullyQualifiedCString());
+          }
           return Error::null();
         }
         // Optimizer bailed out. Disable optimizations and never try again.
@@ -1225,9 +1228,18 @@
     Thread* const thread = Thread::Current();
     StackZone stack_zone(thread);
     Error& error = Error::Handle();
-    // We got an error during compilation.
+    // We got an error during compilation or it is a bailout from background
+    // compilation (e.g., during parsing with EnsureIsFinalized).
     error = thread->sticky_error();
     thread->clear_sticky_error();
+    if (error.raw() == Object::background_compilation_error().raw()) {
+      // Exit compilation, retry it later.
+      if (FLAG_trace_bailout) {
+        THR_Print("Aborted background compilation: %s\n",
+            function.ToFullyQualifiedCString());
+      }
+      return Error::null();
+    }
     // Unoptimized compilation or precompilation may encounter compile-time
     // errors, but regular optimized compilation should not.
     ASSERT(!optimized);
@@ -1364,6 +1376,8 @@
   // IsIrregexpFunction have eager var descriptors generation.
   ASSERT(!function.IsIrregexpFunction());
   // Parser should not produce any errors, therefore no LongJumpScope needed.
+  // (exception is background compilation).
+  ASSERT(!Compiler::IsBackgroundCompilation());
   Parser::ParseFunction(parsed_function);
   parsed_function->AllocateVariables();
   var_descs = parsed_function->node_sequence()->scope()->
diff --git a/runtime/vm/compiler_stats.cc b/runtime/vm/compiler_stats.cc
index 7905ed8..d7950c1 100644
--- a/runtime/vm/compiler_stats.cc
+++ b/runtime/vm/compiler_stats.cc
@@ -20,9 +20,8 @@
 
 class TokenStreamVisitor : public ObjectVisitor {
  public:
-  TokenStreamVisitor(Isolate* isolate, CompilerStats* compiler_stats)
-      : ObjectVisitor(isolate),
-        obj_(Object::Handle()),
+  explicit TokenStreamVisitor(CompilerStats* compiler_stats)
+      : obj_(Object::Handle()),
         stats_(compiler_stats) {
   }
 
@@ -113,7 +112,7 @@
   // Traverse the heap and compute number of tokens in all
   // TokenStream objects.
   num_tokens_total = 0;
-  TokenStreamVisitor visitor(isolate_, this);
+  TokenStreamVisitor visitor(this);
   isolate_->heap()->IterateObjects(&visitor);
   Dart::vm_isolate()->heap()->IterateObjects(&visitor);
 }
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 24110b4..5764745 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -246,6 +246,7 @@
 const Register ARGS_DESC_REG = R4;
 const Register CODE_REG = R6;
 const Register THR = R10;  // Caches current thread in generated code.
+const Register CALLEE_SAVED_TEMP = R6;
 
 // R15 encodes APSR in the vmrs instruction.
 const Register APSR = R15;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 7a0a18b..870bb34 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -117,7 +117,8 @@
 const Register ICREG = R5;  // IC data register.
 const Register ARGS_DESC_REG = R4;  // Arguments descriptor register.
 const Register THR = R26;  // Caches current thread in generated code.
-
+const Register CALLEE_SAVED_TEMP = R19;
+const Register CALLEE_SAVED_TEMP2 = R20;
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 466dd42..adf988a 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -68,7 +68,8 @@
 const Register ICREG = ECX;  // IC data register.
 const Register ARGS_DESC_REG = EDX;  // Arguments descriptor register.
 const Register THR = ESI;  // Caches current thread in generated code.
-
+const Register CALLEE_SAVED_TEMP = EBX;
+const Register CALLEE_SAVED_TEMP2 = EDI;
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index bcde75e..9a79f53 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -186,7 +186,7 @@
 const Register ICREG = S5;  // IC data register.
 const Register ARGS_DESC_REG = S4;
 const Register THR = S3;  // Caches current thread in generated code.
-
+const Register CALLEE_SAVED_TEMP = S5;
 
 // The code that generates a comparison can be far away from the code that
 // generates the branch that uses the result of that comparison. In this case,
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 9c92faa..0cfee29 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -93,7 +93,7 @@
 const Register ARGS_DESC_REG = R10;  // Arguments descriptor register.
 const Register CODE_REG = R12;
 const Register THR = R14;  // Caches current thread in generated code.
-
+const Register CALLEE_SAVED_TEMP = R13;
 
 // Exception object is passed in this register to the catch handlers when an
 // exception is thrown.
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 9c07dc0..d8367fe 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -36,10 +36,7 @@
 namespace dart {
 
 DECLARE_FLAG(bool, print_class_table);
-DECLARE_FLAG(bool, trace_isolates);
 DECLARE_FLAG(bool, trace_time_all);
-DECLARE_FLAG(bool, pause_isolates_on_start);
-DECLARE_FLAG(bool, pause_isolates_on_exit);
 DEFINE_FLAG(bool, keep_code, false,
             "Keep deoptimized code for profiling.");
 DEFINE_FLAG(bool, shutdown, true, "Do a clean shutdown of the VM");
@@ -164,9 +161,9 @@
       StubCode::InitOnce();
     }
     if (vm_isolate_snapshot != NULL) {
-      if (instructions_snapshot != NULL) {
-        vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
-        ASSERT(data_snapshot != NULL);
+      NOT_IN_PRODUCT(TimelineDurationScope tds(Timeline::GetVMStream(),
+                                               "VMIsolateSnapshot"));
+      if (data_snapshot != NULL) {
         vm_isolate_->SetupDataSnapshotPage(data_snapshot);
       }
       const Snapshot* snapshot = Snapshot::SetupFromBuffer(vm_isolate_snapshot);
@@ -207,7 +204,11 @@
       return "SSE2 is required.";
     }
 #endif
-    Object::FinalizeVMIsolate(vm_isolate_);
+    {
+      NOT_IN_PRODUCT(TimelineDurationScope tds(Timeline::GetVMStream(),
+                                               "FinalizeVMIsolate"));
+      Object::FinalizeVMIsolate(vm_isolate_);
+    }
 #if defined(DEBUG)
     vm_isolate_->heap()->Verify(kRequireMarked);
 #endif
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index cb540bc..5f314a6 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -97,7 +97,6 @@
 class FunctionVisitor : public ObjectVisitor {
  public:
   explicit FunctionVisitor(Thread* thread) :
-      ObjectVisitor(thread->isolate()),
       classHandle_(Class::Handle(thread->zone())),
       funcHandle_(Function::Handle(thread->zone())),
       typeHandle_(AbstractType::Handle(thread->zone())) {}
@@ -1466,6 +1465,7 @@
     intptr_t* isolate_snapshot_size) {
   ASSERT(FLAG_load_deferred_eagerly);
   DARTSCOPE(Thread::Current());
+  API_TIMELINE_DURATION;
   Isolate* I = T->isolate();
   if (vm_isolate_snapshot_buffer != NULL &&
       vm_isolate_snapshot_size == NULL) {
@@ -1537,6 +1537,7 @@
 
 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer,
                                                   intptr_t* size) {
+  API_TIMELINE_DURATION;
   return createLibrarySnapshot(Dart_Null(), buffer, size);
 }
 
@@ -1544,6 +1545,7 @@
 DART_EXPORT Dart_Handle Dart_CreateLibrarySnapshot(Dart_Handle library,
                                                    uint8_t** buffer,
                                                    intptr_t* size) {
+  API_TIMELINE_DURATION;
   return createLibrarySnapshot(library, buffer, size);
 }
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index e9951c8..b30a331 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -45,7 +45,6 @@
             "handler instead.  This handler dispatches breakpoints to "
             "the VM service.");
 
-DECLARE_FLAG(bool, trace_isolates);
 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger);
 
 
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 8b0aa72..fffd667 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -666,9 +666,14 @@
       return;
     }
 
-    *dest_addr = reinterpret_cast<intptr_t>(Object::null());
-    deopt_context->DeferPcMarkerMaterialization(
-        object_table_index_, dest_addr);
+    // We don't always have the Code object for the frame's corresponding
+    // unoptimized code as it may have been collected. Use a stub as the pc
+    // marker until we can recreate that Code object during deferred
+    // materialization to maintain the invariant that Dart frames always have
+    // a pc marker.
+    *reinterpret_cast<RawObject**>(dest_addr) =
+        StubCode::FrameAwaitingMaterialization_entry()->code();
+    deopt_context->DeferPcMarkerMaterialization(object_table_index_, dest_addr);
   }
 
  private:
diff --git a/runtime/vm/disassembler.cc b/runtime/vm/disassembler.cc
index 5ba92d9..9f3d4a3 100644
--- a/runtime/vm/disassembler.cc
+++ b/runtime/vm/disassembler.cc
@@ -99,8 +99,7 @@
 
 class FindAddrVisitor : public FindObjectVisitor {
  public:
-  explicit FindAddrVisitor(uword addr)
-      : FindObjectVisitor(Isolate::Current()), addr_(addr) { }
+  explicit FindAddrVisitor(uword addr) : addr_(addr) { }
   virtual ~FindAddrVisitor() { }
 
   virtual uword filter_addr() const { return addr_; }
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index a879dda..5a55b8a 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -27,6 +27,8 @@
   "Instance call always as megamorphic.")                                      \
 C(background_compilation, false, false, bool, false,                           \
   "Run optimizing compilation in background")                                  \
+R(break_at_isolate_spawn, false, bool, false,                                  \
+  "Insert a one-time breakpoint at the entrypoint for all spawned isolates")   \
 C(collect_code, false, true, bool, true,                                       \
   "Attempt to GC infrequently used code.")                                     \
 P(collect_dynamic_function_names, bool, false,                                 \
@@ -55,6 +57,9 @@
   "Report error for bad overrides.")                                           \
 R(error_on_bad_type, false, bool, false,                                       \
   "Report error for malformed types.")                                         \
+P(external_max_size, int, (kWordSize <= 4) ? 512 : 1024,                       \
+  "Max total size of external allocations in MB, or 0 for unlimited,"          \
+  "e.g: --external_max_size=1024 allows up to 1024MB of externals")            \
 P(fields_may_be_reset, bool, false,                                            \
   "Don't optimize away static field initialization")                           \
 C(force_clone_compiler_objects, false, false, bool, false,                     \
@@ -83,8 +88,19 @@
   "Merge sin/cos into sincos")                                                 \
 P(new_gen_ext_limit, int, 64,                                                  \
   "maximum total external size (MB) in new gen before triggering GC")          \
+P(new_gen_semi_max_size, int, (kWordSize <= 4) ? 16 : 32,                      \
+  "Max size of new gen semi space in MB")                                      \
 P(optimization_counter_threshold, int, 30000,                                  \
   "Function's usage-counter value before it is optimized, -1 means never")     \
+P(old_gen_heap_size, int, (kWordSize <= 4) ? 1536 : 0,                         \
+  "Max size of old gen heap size in MB, or 0 for unlimited,"                   \
+  "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap")            \
+R(pause_isolates_on_start, false, bool, false,                                 \
+  "Pause isolates before starting.")                                           \
+R(pause_isolates_on_exit, false, bool, false,                                  \
+  "Pause isolates exiting.")                                                   \
+R(pause_isolates_on_unhandled_exceptions, false, bool, false,                  \
+  "Pause isolates on unhandled exceptions.")                                   \
 P(polymorphic_with_deopt, bool, true,                                          \
   "Polymorphic calls with deoptimization / megamorphic call")                  \
 P(precompiled_mode, bool, false,                                               \
@@ -127,10 +143,16 @@
   "Trace CHA operations")                                                      \
 D(trace_field_guards, bool, false,                                             \
   "Trace changes in field's cids.")                                            \
+D(trace_isolates, bool, false,                                                 \
+  "Trace isolate creation and shut down.")                                     \
 D(trace_handles, bool, false,                                                  \
   "Traces allocation of handles.")                                             \
 D(trace_optimization, bool, false,                                             \
   "Print optimization details.");                                              \
+R(trace_profiler, false, bool, false,                                          \
+  "Profiler trace")                                                            \
+D(trace_profiler_verbose, bool, false,                                         \
+  "Verbose profiler trace")                                                    \
 D(trace_ssa_allocator, bool, false,                                            \
   "Trace register allocation over SSA.")                                       \
 D(trace_zones, bool, false,                                                    \
@@ -154,4 +176,5 @@
 D(verify_on_transition, bool, false,                                           \
   "Verify on dart <==> VM.")                                                   \
 
+
 #endif  // VM_FLAG_LIST_H_
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 437c684..f3d3406 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -14,7 +14,6 @@
 #include "vm/flow_graph_compiler.h"
 #include "vm/flow_graph_type_propagator.h"
 #include "vm/il_printer.h"
-#include "vm/intrinsifier.h"
 #include "vm/jit_optimizer.h"
 #include "vm/longjump.h"
 #include "vm/object.h"
@@ -629,6 +628,15 @@
       return false;
     }
 
+    // Don't inline any intrinsified functions in precompiled mode
+    // to reduce code size and make sure we use the intrinsic code.
+    if (FLAG_precompiled_mode && function.is_intrinsic()) {
+      TRACE_INLINING(THR_Print("     Bailout: intrinisic\n"));
+      PRINT_INLINING_TREE("intrinsic",
+          &call_data->caller, &function, call_data->call);
+      return false;
+    }
+
     // Function has no type feedback. With precompilation we don't rely on
     // type feedback.
     if (!FLAG_precompiled_mode &&
@@ -694,14 +702,28 @@
       // Install bailout jump.
       LongJumpScope jump;
       if (setjmp(*jump.Set()) == 0) {
+        Isolate* isolate = Isolate::Current();
+        // Makes sure no classes are loaded during parsing in background.
+        const intptr_t loading_invalidation_gen_at_start =
+            isolate->loading_invalidation_gen();
         // Parse the callee function.
         bool in_cache;
         ParsedFunction* parsed_function;
-        {
+       {
           CSTAT_TIMER_SCOPE(thread(), graphinliner_parse_timer);
           parsed_function = GetParsedFunction(function, &in_cache);
         }
 
+        if (Compiler::IsBackgroundCompilation()) {
+          if (isolate->IsTopLevelParsing() ||
+                  (loading_invalidation_gen_at_start !=
+                   isolate->loading_invalidation_gen())) {
+            // Loading occured while parsing. We need to abort here because
+            // state changed while compiling.
+            Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+          }
+        }
+
         // Load IC data for the callee.
         ZoneGrowableArray<const ICData*>* ic_data_array =
               new(Z) ZoneGrowableArray<const ICData*>();
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 138e9b1..0cd9f41 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -260,6 +260,12 @@
 }
 
 
+void Heap::IterateOldObjectsNoEmbedderPages(ObjectVisitor* visitor) const {
+  HeapIterationScope heap_iteration_scope;
+  old_space_.VisitObjectsNoEmbedderPages(visitor);
+}
+
+
 void Heap::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
   new_space_.VisitObjectPointers(visitor);
   old_space_.VisitObjectPointers(visitor);
@@ -511,10 +517,10 @@
 }
 
 
-void Heap::WriteProtect(bool read_only, bool include_code_pages) {
+void Heap::WriteProtect(bool read_only) {
   read_only_ = read_only;
   new_space_.WriteProtect(read_only);
-  old_space_.WriteProtect(read_only, include_code_pages);
+  old_space_.WriteProtect(read_only);
 }
 
 
@@ -840,16 +846,15 @@
 }
 
 
-WritableVMIsolateScope::WritableVMIsolateScope(Thread* thread,
-                                               bool include_code_pages)
-    : StackResource(thread), include_code_pages_(include_code_pages) {
-  Dart::vm_isolate()->heap()->WriteProtect(false, include_code_pages_);
+WritableVMIsolateScope::WritableVMIsolateScope(Thread* thread)
+    : StackResource(thread) {
+  Dart::vm_isolate()->heap()->WriteProtect(false);
 }
 
 
 WritableVMIsolateScope::~WritableVMIsolateScope() {
   ASSERT(Dart::vm_isolate()->heap()->UsedInWords(Heap::kNew) == 0);
-  Dart::vm_isolate()->heap()->WriteProtect(true, include_code_pages_);
+  Dart::vm_isolate()->heap()->WriteProtect(true);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 6fd1934..6732c1b 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -102,6 +102,7 @@
 
   void IterateObjects(ObjectVisitor* visitor) const;
   void IterateOldObjects(ObjectVisitor* visitor) const;
+  void IterateOldObjectsNoEmbedderPages(ObjectVisitor* visitor) const;
   void IterateObjectPointers(ObjectVisitor* visitor) const;
 
   // Find an object by visiting all pointers in the specified heap space,
@@ -138,7 +139,7 @@
 
   // Protect access to the heap. Note: Code pages are made
   // executable/non-executable when 'read_only' is true/false, respectively.
-  void WriteProtect(bool read_only, bool include_code_pages);
+  void WriteProtect(bool read_only);
   void WriteProtectCode(bool read_only) {
     old_space_.WriteProtectCode(read_only);
   }
@@ -391,11 +392,8 @@
 // Note: During this scope, the code pages are non-executable.
 class WritableVMIsolateScope : StackResource {
  public:
-  explicit WritableVMIsolateScope(Thread* thread, bool include_code_pages);
+  explicit WritableVMIsolateScope(Thread* thread);
   ~WritableVMIsolateScope();
-
- private:
-  bool include_code_pages_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index c76297d..80319e3 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -236,8 +236,7 @@
 
 class FindOnly : public FindObjectVisitor {
  public:
-  FindOnly(Isolate* isolate, RawObject* target)
-      : FindObjectVisitor(isolate), target_(target) {
+  explicit FindOnly(RawObject* target) : target_(target) {
 #if defined(DEBUG)
     EXPECT_GT(Thread::Current()->no_safepoint_scope_depth(), 0);
 #endif
@@ -254,7 +253,7 @@
 
 class FindNothing : public FindObjectVisitor {
  public:
-  FindNothing() : FindObjectVisitor(Isolate::Current()) { }
+  FindNothing() { }
   virtual ~FindNothing() { }
   virtual bool FindObject(RawObject* obj) const { return false; }
 };
@@ -268,7 +267,7 @@
     const String& obj = String::Handle(String::New("x", spaces[space]));
     {
       NoSafepointScope no_safepoint;
-      FindOnly find_only(isolate, obj.raw());
+      FindOnly find_only(obj.raw());
       EXPECT(obj.raw() == heap->FindObject(&find_only));
     }
   }
@@ -284,9 +283,9 @@
   const String& obj = String::Handle(String::New("x", Heap::kOld));
   Heap* heap = Thread::Current()->isolate()->heap();
   EXPECT(heap->Contains(RawObject::ToAddr(obj.raw())));
-  heap->WriteProtect(true, true /* include_code_pages */);
+  heap->WriteProtect(true);
   EXPECT(heap->Contains(RawObject::ToAddr(obj.raw())));
-  heap->WriteProtect(false, true /* include_code_pages */);
+  heap->WriteProtect(false);
   EXPECT(heap->Contains(RawObject::ToAddr(obj.raw())));
 }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 4b55595..59cb8ab 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -3550,6 +3550,8 @@
     case MethodRecognizer::kMathTan:
     case MethodRecognizer::kMathAcos:
     case MethodRecognizer::kMathAsin:
+    case MethodRecognizer::kMathSin:
+    case MethodRecognizer::kMathCos:
       return 1;
     case MethodRecognizer::kDoubleMod:
     case MethodRecognizer::kMathDoublePow:
@@ -3636,6 +3638,10 @@
       return kLibcTanRuntimeEntry;
     case MethodRecognizer::kMathAsin:
       return kLibcAsinRuntimeEntry;
+    case MethodRecognizer::kMathSin:
+      return kLibcSinRuntimeEntry;
+    case MethodRecognizer::kMathCos:
+      return kLibcCosRuntimeEntry;
     case MethodRecognizer::kMathAcos:
       return kLibcAcosRuntimeEntry;
     case MethodRecognizer::kMathAtan:
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 6b180bd..dfe3fc5 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -3093,8 +3093,20 @@
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   Register result = locs()->out(0).reg();
-  __ orr(result, left, Operand(right));
-  __ tst(result, Operand(kSmiTagMask));
+  intptr_t left_cid = this->left()->Type()->ToCid();
+  intptr_t right_cid = this->right()->Type()->ToCid();
+  bool combined_smi_check = false;
+  if (this->left()->definition() == this->right()->definition()) {
+    __ tst(left, Operand(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
+    __ tst(right, Operand(kSmiTagMask));
+  } else if (right_cid == kSmiCid) {
+    __ tst(left, Operand(kSmiTagMask));
+  } else {
+    combined_smi_check = true;
+    __ orr(result, left, Operand(right));
+    __ tst(result, Operand(kSmiTagMask));
+  }
   __ b(slow_path->entry_label(), NE);
   switch (op_kind()) {
     case Token::kADD:
@@ -3105,8 +3117,18 @@
       __ subs(result, left, Operand(right));
       __ b(slow_path->entry_label(), VS);
       break;
+    case Token::kMUL:
+      __ SmiUntag(IP, left);
+      __ smull(result, IP, IP, right);
+      // IP: result bits 32..63.
+      __ cmp(IP, Operand(result, ASR, 31));
+      __ b(slow_path->entry_label(), NE);
+      break;
     case Token::kBIT_OR:
-      // Operation part of combined smi check.
+      // Operation may be part of combined smi check.
+      if (!combined_smi_check) {
+        __ orr(result, left, Operand(right));
+      }
       break;
     case Token::kBIT_AND:
       __ and_(result, left, Operand(right));
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index cb225a2..239ad0b 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -2809,8 +2809,21 @@
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   Register result = locs()->out(0).reg();
-  __ orr(result, left, Operand(right));
-  __ tsti(result, Immediate(kSmiTagMask));
+  intptr_t left_cid = this->left()->Type()->ToCid();
+  intptr_t right_cid = this->right()->Type()->ToCid();
+  bool combined_smi_check = false;
+  if (this->left()->definition() == this->right()->definition()) {
+    __ tsti(left, Immediate(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
+    __ tsti(right, Immediate(kSmiTagMask));
+  } else if (right_cid == kSmiCid) {
+    __ tsti(left, Immediate(kSmiTagMask));
+  } else {
+    combined_smi_check = true;
+    __ orr(result, left, Operand(right));
+    __ tsti(result, Immediate(kSmiTagMask));
+  }
+
   __ b(slow_path->entry_label(), NE);
   switch (op_kind()) {
     case Token::kADD:
@@ -2821,8 +2834,19 @@
       __ subs(result, left, Operand(right));
       __ b(slow_path->entry_label(), VS);
       break;
+    case Token::kMUL:
+      __ SmiUntag(TMP, left);
+      __ mul(result, TMP, right);
+      __ smulh(TMP, TMP, right);
+      // TMP: result bits 64..127.
+      __ cmp(TMP, Operand(result, ASR, 63));
+      __ b(slow_path->entry_label(), NE);
+      break;
     case Token::kBIT_OR:
-      // Operation part of combined smi check.
+      // Operation may be part of combined smi check.
+      if (!combined_smi_check) {
+        __ orr(result, left, Operand(right));
+      }
       break;
     case Token::kBIT_AND:
       __ and_(result, left, Operand(right));
@@ -3155,7 +3179,9 @@
   intptr_t right_cid = right()->Type()->ToCid();
   const Register left = locs()->in(0).reg();
   const Register right = locs()->in(1).reg();
-  if (left_cid == kSmiCid) {
+  if (this->left()->definition() == this->right()->definition()) {
+    __ tsti(left, Immediate(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
     __ tsti(right, Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
     __ tsti(left, Immediate(kSmiTagMask));
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 7342fb6..022d6b5 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -2928,8 +2928,20 @@
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   Register result = locs()->out(0).reg();
-  __ or_(result, left, right);
-  __ andi(CMPRES1, result, Immediate(kSmiTagMask));
+  intptr_t left_cid = this->left()->Type()->ToCid();
+  intptr_t right_cid = this->right()->Type()->ToCid();
+  bool combined_smi_check = false;
+  if (this->left()->definition() == this->right()->definition()) {
+    __ andi(CMPRES1, left, Immediate(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
+    __ andi(CMPRES1, right, Immediate(kSmiTagMask));
+  } else if (right_cid == kSmiCid) {
+    __ andi(CMPRES1, left, Immediate(kSmiTagMask));
+  } else {
+    combined_smi_check = true;
+    __ or_(result, left, right);
+    __ andi(CMPRES1, result, Immediate(kSmiTagMask));
+  }
   __ bne(CMPRES1, ZR, slow_path->entry_label());
   switch (op_kind()) {
     case Token::kADD:
@@ -2940,8 +2952,19 @@
       __ SubuDetectOverflow(result, left, right, CMPRES1);
       __ bltz(CMPRES1, slow_path->entry_label());
       break;
+    case Token::kMUL:
+      __ sra(TMP, left, kSmiTagSize);
+      __ mult(TMP, right);
+      __ mflo(result);
+      __ mfhi(CMPRES2);
+      __ sra(CMPRES1, result, 31);
+      __ bne(CMPRES1, CMPRES2, slow_path->entry_label());
+      break;
     case Token::kBIT_OR:
       // Operation part of combined smi check.
+      if (!combined_smi_check) {
+        __ or_(result, left, right);
+      }
       break;
     case Token::kBIT_AND:
       __ and_(result, left, right);
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 1738532..d94b5f6 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -2829,6 +2829,7 @@
     case Token::kGTE:
     case Token::kADD:
     case Token::kSUB:
+    case Token::kMUL:
       summary->set_out(0, Location::RequiresRegister());
       break;
     case Token::kBIT_OR:
@@ -2848,13 +2849,24 @@
       new CheckedSmiSlowPath(this, compiler->CurrentTryIndex());
   compiler->AddSlowPathCode(slow_path);
   // Test operands if necessary.
+
+  intptr_t left_cid = left()->Type()->ToCid();
+  intptr_t right_cid = right()->Type()->ToCid();
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
-  Register result = locs()->out(0).reg();
-  __ movq(TMP, left);
-  __ orq(TMP, right);
-  __ testq(TMP, Immediate(kSmiTagMask));
+  if (this->left()->definition() == this->right()->definition()) {
+    __ testq(left, Immediate(kSmiTagMask));
+  } else if (left_cid == kSmiCid) {
+    __ testq(right, Immediate(kSmiTagMask));
+  } else if (right_cid == kSmiCid) {
+    __ testq(left, Immediate(kSmiTagMask));
+  } else {
+    __ movq(TMP, left);
+    __ orq(TMP, right);
+    __ testq(TMP, Immediate(kSmiTagMask));
+  }
   __ j(NOT_ZERO, slow_path->entry_label());
+  Register result = locs()->out(0).reg();
   switch (op_kind()) {
     case Token::kADD:
       __ movq(result, left);
@@ -2866,6 +2878,12 @@
       __ subq(result, right);
       __ j(OVERFLOW, slow_path->entry_label());
       break;
+    case Token::kMUL:
+      __ movq(result, left);
+      __ SmiUntag(result);
+      __ imulq(result, right);
+      __ j(OVERFLOW, slow_path->entry_label());
+      break;
     case Token::kBIT_OR:
       ASSERT(left == result);
       __ orq(result, right);
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index af15e7a..f42d85e 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -5,6 +5,7 @@
 
 #include "vm/assembler.h"
 #include "vm/compiler.h"
+#include "vm/cpu.h"
 #include "vm/flags.h"
 #include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
@@ -21,16 +22,39 @@
 namespace dart {
 
 DEFINE_FLAG(bool, intrinsify, true, "Instrinsify when possible");
+DEFINE_FLAG(bool, trace_intrinsifier, false, "Trace intrinsifier");
 DECLARE_FLAG(bool, code_comments);
 DECLARE_FLAG(bool, print_flow_graph);
 DECLARE_FLAG(bool, print_flow_graph_optimized);
 
 bool Intrinsifier::CanIntrinsify(const Function& function) {
+  if (FLAG_trace_intrinsifier) {
+    THR_Print("CanIntrinsify %s ->", function.ToQualifiedCString());
+  }
   if (!FLAG_intrinsify) return false;
-  if (function.IsClosureFunction()) return false;
+  if (function.IsClosureFunction()) {
+    if (FLAG_trace_intrinsifier) {
+      THR_Print("No, closure function.\n");
+    }
+    return false;
+  }
   // Can occur because of compile-all flag.
-  if (function.is_external()) return false;
-  return function.is_intrinsic();
+  if (function.is_external()) {
+    if (FLAG_trace_intrinsifier) {
+      THR_Print("No, external function.\n");
+    }
+    return false;
+  }
+  if (!function.is_intrinsic()) {
+    if (FLAG_trace_intrinsifier) {
+      THR_Print("No, not intrinsic function.\n");
+    }
+    return false;
+  }
+  if (FLAG_trace_intrinsifier) {
+    THR_Print("Yes.\n");
+  }
+  return true;
 }
 
 
@@ -78,6 +102,7 @@
   lib = Library::MathLibrary();
   ASSERT(!lib.IsNull());
   MATH_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
+  GRAPH_MATH_LIB_INTRINSIC_LIST(SETUP_FUNCTION);
 
   // Set up all dart:typed_data lib functions that can be intrinsified.
   lib = Library::TypedDataLibrary();
@@ -94,12 +119,11 @@
 }
 #endif  // defined(DART_NO_SNAPSHOT).
 
-
 static void EmitCodeFor(FlowGraphCompiler* compiler,
                         FlowGraph* graph) {
   // The FlowGraph here is constructed by the intrinsics builder methods, and
   // is different from compiler->flow_graph(), the original method's flow graph.
-  compiler->assembler()->Comment("Graph intrinsic");
+  compiler->assembler()->Comment("Graph intrinsic begin");
   for (intptr_t i = 0; i < graph->reverse_postorder().length(); i++) {
     BlockEntryInstr* block = graph->reverse_postorder()[i];
     if (block->IsGraphEntry()) continue;  // No code for graph entry needed.
@@ -115,6 +139,11 @@
       if (instr->IsParallelMove()) {
         compiler->parallel_move_resolver()->EmitNativeCode(
             instr->AsParallelMove());
+      } else if (instr->IsInvokeMathCFunction()) {
+        ASSERT(instr->locs() != NULL);
+        Intrinsifier::IntrinsicCallPrologue(compiler->assembler());
+        instr->EmitNativeCode(compiler);
+        Intrinsifier::IntrinsicCallEpilogue(compiler->assembler());
       } else {
         ASSERT(instr->locs() != NULL);
         // Calls are not supported in intrinsics code.
@@ -123,6 +152,7 @@
       }
     }
   }
+  compiler->assembler()->Comment("Graph intrinsic end");
 }
 
 
@@ -224,6 +254,11 @@
 }
 
 
+// Notes about the graph intrinsics:
+//
+// IR instructions which would jump to a deoptimization sequence on failure
+// instead branch to the intrinsic slow path.
+//
 class BlockBuilder : public ValueObject {
  public:
   BlockBuilder(FlowGraph* flow_graph, TargetEntryInstr* entry)
@@ -269,17 +304,45 @@
         new ConstantInstr(Object::ZoneHandle(Object::null())));
   }
 
-  Definition* AddUnboxInstr(Representation rep, Value* value) {
+  Definition* AddUnboxInstr(Representation rep,
+                            Value* value,
+                            bool is_checked) {
     Definition* unboxed_value = AddDefinition(
         UnboxInstr::Create(rep, value, Thread::kNoDeoptId));
-    // Manually adjust reaching type because there is no type propagation
-    // when building intrinsics.
-    unboxed_value->AsUnbox()->value()->SetReachingType(ZoneCompileType::Wrap(
-        CompileType::FromCid(CidForRepresentation(rep))));
+    if (is_checked) {
+      // The type of |value| has already been checked and it is safe to
+      // adjust reaching type. This is done manually because there is no type
+      // propagation when building intrinsics.
+      unboxed_value->AsUnbox()->value()->SetReachingType(ZoneCompileType::Wrap(
+          CompileType::FromCid(CidForRepresentation(rep))));
+    }
     return unboxed_value;
   }
 
+  Definition* AddUnboxInstr(Representation rep,
+                            Definition* boxed,
+                            bool is_checked) {
+    return AddUnboxInstr(rep, new Value(boxed), is_checked);
+  }
+
+  Definition* InvokeMathCFunction(MethodRecognizer::Kind recognized_kind,
+                                  ZoneGrowableArray<Value*>* args) {
+    return InvokeMathCFunctionHelper(recognized_kind, args);
+  }
+
  private:
+  Definition* InvokeMathCFunctionHelper(MethodRecognizer::Kind recognized_kind,
+                                        ZoneGrowableArray<Value*>* args) {
+    InvokeMathCFunctionInstr* invoke_math_c_function =
+        new InvokeMathCFunctionInstr(args,
+                                     Thread::kNoDeoptId,
+                                     recognized_kind,
+                                     TokenPos());
+    AddDefinition(invoke_math_c_function);
+    return invoke_math_c_function;
+  }
+
+
   FlowGraph* flow_graph_;
   BlockEntryInstr* entry_;
   Instruction* current_;
@@ -460,7 +523,9 @@
   PrepareIndexedOp(&builder, array, index, TypedData::length_offset());
 
   Definition* unboxed_value =
-      builder.AddUnboxInstr(kUnboxedUint32, new Value(value));
+      builder.AddUnboxInstr(kUnboxedUint32,
+                            new Value(value),
+                            /* is_checked = */ true);
 
   builder.AddInstruction(
       new StoreIndexedInstr(new Value(array),
@@ -528,7 +593,9 @@
                           value_check,
                           builder.TokenPos()));
   Definition* double_value =
-      builder.AddUnboxInstr(kUnboxedDouble, new Value(value));
+      builder.AddUnboxInstr(kUnboxedDouble,
+                            new Value(value),
+                            /* is_checked = */ true);
 
   builder.AddInstruction(
       new StoreIndexedInstr(new Value(array),
@@ -596,10 +663,14 @@
                           value_check,
                           builder.TokenPos()));
   Definition* left_simd =
-      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(left));
+      builder.AddUnboxInstr(kUnboxedFloat32x4,
+                            new Value(left),
+                            /* is_checked = */ true);
 
   Definition* right_simd =
-      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(right));
+      builder.AddUnboxInstr(kUnboxedFloat32x4,
+                            new Value(right),
+                            /* is_checked = */ true);
 
   Definition* unboxed_result = builder.AddDefinition(
       new BinaryFloat32x4OpInstr(kind,
@@ -638,7 +709,9 @@
   Definition* receiver = builder.AddParameter(1);
 
   Definition* unboxed_receiver =
-      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(receiver));
+      builder.AddUnboxInstr(kUnboxedFloat32x4,
+                            new Value(receiver),
+                            /* is_checked = */ true);
 
   Definition* unboxed_result = builder.AddDefinition(
       new Simd32x4ShuffleInstr(kind,
@@ -872,7 +945,9 @@
 
   Definition* receiver = builder.AddParameter(1);
   Definition* unboxed_value =
-      builder.AddUnboxInstr(kUnboxedDouble, new Value(receiver));
+      builder.AddUnboxInstr(kUnboxedDouble,
+                            new Value(receiver),
+                            /* is_checked = */ true);
   Definition* unboxed_result = builder.AddDefinition(
       new UnaryDoubleOpInstr(Token::kNEGATE,
                              new Value(unboxed_value),
@@ -883,4 +958,185 @@
   return true;
 }
 
+
+static bool BuildInvokeMathCFunction(BlockBuilder* builder,
+                                     MethodRecognizer::Kind kind,
+                                     intptr_t num_parameters = 1) {
+  ZoneGrowableArray<Value*>* args =
+      new ZoneGrowableArray<Value*>(num_parameters);
+
+  for (intptr_t i = 0; i < num_parameters; i++) {
+    const intptr_t parameter_index = (num_parameters - i);
+    Definition* value = builder->AddParameter(parameter_index);
+    Definition* unboxed_value =
+        builder->AddUnboxInstr(kUnboxedDouble, value, /* is_checked = */ false);
+    args->Add(new Value(unboxed_value));
+  }
+
+  Definition* unboxed_result =
+      builder->InvokeMathCFunction(kind, args);
+
+  Definition* result = builder->AddDefinition(
+      BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
+
+  builder->AddIntrinsicReturn(new Value(result));
+
+  return true;
+}
+
+
+bool Intrinsifier::Build_MathSin(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kMathSin);
+}
+
+
+bool Intrinsifier::Build_MathCos(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kMathCos);
+}
+
+
+bool Intrinsifier::Build_MathTan(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kMathTan);
+}
+
+
+bool Intrinsifier::Build_MathAsin(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kMathAsin);
+}
+
+
+bool Intrinsifier::Build_MathAcos(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kMathAcos);
+}
+
+
+bool Intrinsifier::Build_MathAtan(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kMathAtan);
+}
+
+
+bool Intrinsifier::Build_MathAtan2(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kMathAtan2,
+                                  /* num_parameters = */ 2);
+}
+
+
+bool Intrinsifier::Build_DoubleMod(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kDoubleMod,
+                                  /* num_parameters = */ 2);
+}
+
+
+bool Intrinsifier::Build_DoubleCeil(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+  // TODO(johnmccutchan): On X86 this intrinsic can be written in a different
+  // way.
+  if (TargetCPUFeatures::double_truncate_round_supported()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kDoubleCeil);
+}
+
+
+bool Intrinsifier::Build_DoubleFloor(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+  // TODO(johnmccutchan): On X86 this intrinsic can be written in a different
+  // way.
+  if (TargetCPUFeatures::double_truncate_round_supported()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kDoubleFloor);
+}
+
+
+bool Intrinsifier::Build_DoubleTruncate(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+  // TODO(johnmccutchan): On X86 this intrinsic can be written in a different
+  // way.
+  if (TargetCPUFeatures::double_truncate_round_supported()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kDoubleTruncate);
+}
+
+
+bool Intrinsifier::Build_DoubleRound(FlowGraph* flow_graph) {
+  if (!FlowGraphCompiler::SupportsUnboxedDoubles()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  return BuildInvokeMathCFunction(&builder,
+                                  MethodRecognizer::kDoubleRound);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 0203632..1a7e07a 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -32,6 +32,9 @@
 
   static intptr_t ParameterSlotFromSp();
 
+  static void IntrinsicCallPrologue(Assembler* assembler);
+  static void IntrinsicCallEpilogue(Assembler* assembler);
+
  private:
   static bool CanIntrinsify(const Function& function);
 
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 4eeee12..7afb021 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -32,6 +32,20 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
+void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  // Save LR by moving it to a callee saved temporary register.
+  assembler->Comment("IntrinsicCallPrologue");
+  assembler->mov(CALLEE_SAVED_TEMP, Operand(LR));
+}
+
+
+void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
+  // Restore LR.
+  assembler->Comment("IntrinsicCallEpilogue");
+  assembler->mov(LR, Operand(CALLEE_SAVED_TEMP));
+}
+
+
 // Intrinsify only for Smi value and index. Non-smi values need a store buffer
 // update. Array length is always a Smi.
 void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
@@ -1288,11 +1302,12 @@
 // Both arguments are on stack.
 static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
   if (TargetCPUFeatures::vfp_supported()) {
-    Label fall_through;
+    Label fall_through, is_smi, double_op;
 
-    TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+    TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
     // Both arguments are double, right operand is in R0.
     __ LoadDFromOffset(D1, R0, Double::value_offset() - kHeapObjectTag);
+    __ Bind(&double_op);
     __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
     __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     switch (kind) {
@@ -1307,6 +1322,11 @@
     __ TryAllocate(double_class, &fall_through, R0, R1);  // Result register.
     __ StoreDToOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
     __ Ret();
+    __ Bind(&is_smi);  // Convert R0 to a double.
+    __ SmiUntag(R0);
+    __ vmovsr(S0, R0);
+    __ vcvtdi(D1, S0);
+    __ b(&double_op);
     __ Bind(&fall_through);
   }
 }
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index f8611a1..e4e5b11 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -31,6 +31,20 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
+void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallPrologue");
+  assembler->mov(CALLEE_SAVED_TEMP, LR);
+  assembler->mov(CALLEE_SAVED_TEMP2, R4);
+}
+
+
+void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallEpilogue");
+  assembler->mov(LR, CALLEE_SAVED_TEMP);
+  assembler->mov(R4, CALLEE_SAVED_TEMP2);
+}
+
+
 // Intrinsify only for Smi value and index. Non-smi values need a store buffer
 // update. Array length is always a Smi.
 void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
@@ -1384,11 +1398,12 @@
 // Expects left argument to be double (receiver). Right argument is unknown.
 // Both arguments are on stack.
 static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
-  Label fall_through;
+  Label fall_through, is_smi, double_op;
 
-  TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Both arguments are double, right operand is in R0.
   __ LoadDFieldFromOffset(V1, R0, Double::value_offset());
+  __ Bind(&double_op);
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Left argument.
   __ LoadDFieldFromOffset(V0, R0, Double::value_offset());
   switch (kind) {
@@ -1403,6 +1418,12 @@
   __ TryAllocate(double_class, &fall_through, R0, R1);
   __ StoreDFieldToOffset(V0, R0, Double::value_offset());
   __ ret();
+
+  __ Bind(&is_smi);  // Convert R0 to a double.
+  __ SmiUntag(R0);
+  __ scvtfdx(V1, R0);
+  __ b(&double_op);
+
   __ Bind(&fall_through);
 }
 
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 4e2a8e9..3c4a470 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -39,6 +39,20 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return 0; }
 
 
+void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallPrologue");
+  assembler->movl(CALLEE_SAVED_TEMP, ICREG);
+  assembler->movl(CALLEE_SAVED_TEMP2, ARGS_DESC_REG);
+}
+
+
+void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallEpilogue");
+  assembler->movl(ICREG, CALLEE_SAVED_TEMP);
+  assembler->movl(ARGS_DESC_REG, CALLEE_SAVED_TEMP2);
+}
+
+
 static intptr_t ComputeObjectArrayTypeArgumentsOffset() {
   const Library& core_lib = Library::Handle(Library::CoreLibrary());
   const Class& cls = Class::Handle(
@@ -1441,10 +1455,11 @@
 // Expects left argument to be double (receiver). Right argument is unknown.
 // Both arguments are on stack.
 static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
-  Label fall_through;
-  TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+  Label fall_through, is_smi, double_op;
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Both arguments are double, right operand is in EAX.
   __ movsd(XMM1, FieldAddress(EAX, Double::value_offset()));
+  __ Bind(&double_op);
   __ movl(EAX, Address(ESP, + 2 * kWordSize));  // Left argument.
   __ movsd(XMM0, FieldAddress(EAX, Double::value_offset()));
   switch (kind) {
@@ -1463,6 +1478,10 @@
                  EBX);
   __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
   __ ret();
+  __ Bind(&is_smi);
+  __ SmiUntag(EAX);
+  __ cvtsi2sd(XMM1, EAX);
+  __ jmp(&double_op);
   __ Bind(&fall_through);
 }
 
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 1fd65bc..63b7755 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -31,6 +31,18 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return -1; }
 
 
+void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallPrologue");
+  assembler->mov(CALLEE_SAVED_TEMP, RA);
+}
+
+
+void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallEpilogue");
+  assembler->mov(RA, CALLEE_SAVED_TEMP);
+}
+
+
 // Intrinsify only for Smi value and index. Non-smi values need a store buffer
 // update. Array length is always a Smi.
 void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
@@ -1347,8 +1359,9 @@
   __ Bind(&is_smi);
   __ SmiUntag(T0);
   __ mtc1(T0, STMP1);
-  __ cvtdw(D1, STMP1);
   __ b(&double_op);
+  __ delay_slot()->cvtdw(D1, STMP1);
+
 
   __ Bind(&fall_through);
 }
@@ -1382,12 +1395,13 @@
 // Expects left argument to be double (receiver). Right argument is unknown.
 // Both arguments are on stack.
 static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
-  Label fall_through;
+  Label fall_through, is_smi, double_op;
 
-  TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Both arguments are double, right operand is in T0.
   __ lwc1(F2, FieldAddress(T0, Double::value_offset()));
   __ lwc1(F3, FieldAddress(T0, Double::value_offset() + kWordSize));
+  __ Bind(&double_op);
   __ lw(T0, Address(SP, 1 * kWordSize));  // Left argument.
   __ lwc1(F0, FieldAddress(T0, Double::value_offset()));
   __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize));
@@ -1405,6 +1419,13 @@
   __ Ret();
   __ delay_slot()->swc1(F1,
                         FieldAddress(V0, Double::value_offset() + kWordSize));
+
+  __ Bind(&is_smi);
+  __ SmiUntag(T0);
+  __ mtc1(T0, STMP1);
+  __ b(&double_op);
+  __ delay_slot()->cvtdw(D1, STMP1);
+
   __ Bind(&fall_through);
 }
 
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 5fd3ad7..c3954fd 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -31,6 +31,18 @@
 intptr_t Intrinsifier::ParameterSlotFromSp() { return 0; }
 
 
+void Intrinsifier::IntrinsicCallPrologue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallPrologue");
+  assembler->movq(CALLEE_SAVED_TEMP, R10);
+}
+
+
+void Intrinsifier::IntrinsicCallEpilogue(Assembler* assembler) {
+  assembler->Comment("IntrinsicCallEpilogue");
+  assembler->movq(R10, CALLEE_SAVED_TEMP);
+}
+
+
 void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler) {
   if (Isolate::Current()->type_checks()) {
     return;
@@ -1295,10 +1307,11 @@
 // Expects left argument to be double (receiver). Right argument is unknown.
 // Both arguments are on stack.
 static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
-  Label fall_through;
-  TestLastArgumentIsDouble(assembler, &fall_through, &fall_through);
+  Label fall_through, is_smi, double_op;
+  TestLastArgumentIsDouble(assembler, &is_smi, &fall_through);
   // Both arguments are double, right operand is in RAX.
   __ movsd(XMM1, FieldAddress(RAX, Double::value_offset()));
+  __ Bind(&double_op);
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left argument.
   __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
   switch (kind) {
@@ -1317,6 +1330,10 @@
                  R13);
   __ movsd(FieldAddress(RAX, Double::value_offset()), XMM0);
   __ ret();
+  __ Bind(&is_smi);
+  __ SmiUntag(RAX);
+  __ cvtsi2sdq(XMM1, RAX);
+  __ jmp(&double_op);
   __ Bind(&fall_through);
 }
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 7678eef..a7ebef5 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -53,29 +53,6 @@
 DECLARE_FLAG(bool, print_metrics);
 DECLARE_FLAG(bool, timing);
 DECLARE_FLAG(bool, trace_service);
-
-DEFINE_FLAG(bool, trace_isolates, false,
-            "Trace isolate creation and shut down.");
-DEFINE_FLAG(bool, pause_isolates_on_start, false,
-            "Pause isolates before starting.");
-DEFINE_FLAG(bool, pause_isolates_on_exit, false,
-            "Pause isolates exiting.");
-DEFINE_FLAG(bool, pause_isolates_on_unhandled_exceptions, false,
-            "Pause isolates on unhandled exceptions.");
-
-DEFINE_FLAG(bool, break_at_isolate_spawn, false,
-            "Insert a one-time breakpoint at the entrypoint for all spawned "
-            "isolates");
-
-DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32,
-            "Max size of new gen semi space in MB");
-DEFINE_FLAG(int, old_gen_heap_size, 0,
-            "Max size of old gen heap size in MB, or 0 for unlimited,"
-            "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap");
-DEFINE_FLAG(int, external_max_size, (kWordSize <= 4) ? 512 : 1024,
-            "Max total size of external allocations in MB, or 0 for unlimited,"
-            "e.g: --external_max_size=1024 allows up to 1024MB of externals");
-
 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger);
 
 NOT_IN_PRODUCT(
@@ -817,9 +794,9 @@
       all_classes_finalized_(false),
       next_(NULL),
       pause_loop_monitor_(NULL),
-      cha_invalidation_gen_(kInvalidGen),
       field_invalidation_gen_(kInvalidGen),
-      prefix_invalidation_gen_(kInvalidGen),
+      loading_invalidation_gen_(kInvalidGen),
+      top_level_parsing_count_(0),
       boxed_field_list_mutex_(new Mutex()),
       boxed_field_list_(GrowableObjectArray::null()),
       spawn_count_monitor_(new Monitor()),
@@ -969,23 +946,6 @@
 }
 
 
-void Isolate::SetupInstructionsSnapshotPage(
-    const uint8_t* instructions_snapshot_buffer) {
-  InstructionsSnapshot snapshot(instructions_snapshot_buffer);
-#if defined(DEBUG)
-  if (FLAG_trace_isolates) {
-    OS::Print("Precompiled instructions are at [0x%" Px ", 0x%" Px ")\n",
-              reinterpret_cast<uword>(snapshot.instructions_start()),
-              reinterpret_cast<uword>(snapshot.instructions_start()) +
-              snapshot.instructions_size());
-  }
-#endif
-  heap_->SetupExternalPage(snapshot.instructions_start(),
-                           snapshot.instructions_size(),
-                           /* is_executable = */ true);
-}
-
-
 void Isolate::SetupDataSnapshotPage(const uint8_t* data_snapshot_buffer) {
   DataSnapshot snapshot(data_snapshot_buffer);
 #if defined(DEBUG)
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 8d2508f..58ca52c 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -228,8 +228,6 @@
     library_tag_handler_ = value;
   }
 
-  void SetupInstructionsSnapshotPage(
-      const uint8_t* instructions_snapshot_buffer);
   void SetupDataSnapshotPage(
       const uint8_t* instructions_snapshot_buffer);
 
@@ -487,30 +485,40 @@
     all_classes_finalized_ = value;
   }
 
-  static const uint32_t kInvalidGen = 0;
-
-  void IncrCHAInvalidationGen() {
-    cha_invalidation_gen_++;
-    if (cha_invalidation_gen_ == kInvalidGen) cha_invalidation_gen_++;
+  // True during top level parsing.
+  bool IsTopLevelParsing() {
+    const intptr_t value =
+        AtomicOperations::LoadRelaxedIntPtr(&top_level_parsing_count_);
+    ASSERT(value >= 0);
+    return value > 0;
   }
-  void ResetCHAInvalidationGen() { cha_invalidation_gen_ = kInvalidGen; }
-  uint32_t cha_invalidation_gen() const { return cha_invalidation_gen_; }
 
+  void IncrTopLevelParsingCount() {
+    AtomicOperations::IncrementBy(&top_level_parsing_count_, 1);
+  }
+  void DecrTopLevelParsingCount() {
+    AtomicOperations::DecrementBy(&top_level_parsing_count_, 1);
+  }
+
+  static const intptr_t kInvalidGen = 0;
 
   void IncrFieldInvalidationGen() {
-    field_invalidation_gen_++;
-    if (field_invalidation_gen_ == kInvalidGen) field_invalidation_gen_++;
+    AtomicOperations::IncrementBy(&field_invalidation_gen_, 1);
+    if (field_invalidation_gen_ == kInvalidGen) {
+      AtomicOperations::IncrementBy(&field_invalidation_gen_, 1);
+    }
   }
+  intptr_t field_invalidation_gen() const { return field_invalidation_gen_; }
 
-  void ResetFieldInvalidationGen() { field_invalidation_gen_ = kInvalidGen; }
-  uint32_t field_invalidation_gen() const { return field_invalidation_gen_; }
-
-  void IncrPrefixInvalidationGen() {
-    prefix_invalidation_gen_++;
-    if (prefix_invalidation_gen_ == kInvalidGen) prefix_invalidation_gen_++;
+  void IncrLoadingInvalidationGen() {
+    AtomicOperations::IncrementBy(&loading_invalidation_gen_, 1);
+    if (loading_invalidation_gen_ == kInvalidGen) {
+      AtomicOperations::IncrementBy(&loading_invalidation_gen_, 1);
+    }
   }
-  void ResetPrefixInvalidationGen() { prefix_invalidation_gen_ = kInvalidGen; }
-  uint32_t prefix_invalidation_gen() const { return prefix_invalidation_gen_; }
+  intptr_t loading_invalidation_gen() {
+    return AtomicOperations::LoadRelaxedIntPtr(&loading_invalidation_gen_);
+  }
 
   // Used by background compiler which field became boxed and must trigger
   // deoptimization in the mutator thread.
@@ -730,9 +738,9 @@
   // Invalidation generations; used to track events occuring in parallel
   // to background compilation. The counters may overflow, which is OK
   // since we check for equality to detect if an event occured.
-  uint32_t cha_invalidation_gen_;
-  uint32_t field_invalidation_gen_;
-  uint32_t prefix_invalidation_gen_;
+  intptr_t field_invalidation_gen_;
+  intptr_t loading_invalidation_gen_;
+  intptr_t top_level_parsing_count_;
 
   // Protect access to boxed_field_list_.
   Mutex* boxed_field_list_mutex_;
diff --git a/runtime/vm/jit_optimizer.cc b/runtime/vm/jit_optimizer.cc
index c02fa8c..edb2524 100644
--- a/runtime/vm/jit_optimizer.cc
+++ b/runtime/vm/jit_optimizer.cc
@@ -3118,6 +3118,7 @@
     AddReceiverCheck(instr);
   }
   if (field.guarded_cid() != kDynamicCid) {
+    ASSERT(FLAG_use_field_guards);
     InsertBefore(instr,
                  new(Z) GuardFieldClassInstr(
                      new(Z) Value(instr->ArgumentAt(1)),
@@ -3128,6 +3129,7 @@
   }
 
   if (field.needs_length_check()) {
+    ASSERT(FLAG_use_field_guards);
     InsertBefore(instr,
                  new(Z) GuardFieldLengthInstr(
                      new(Z) Value(instr->ArgumentAt(1)),
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index eecd798..a6626d0 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -15,7 +15,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, trace_isolates);
 DECLARE_FLAG(bool, trace_service_pause_events);
 
 class MessageHandlerTask : public ThreadPool::Task {
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index f4d6b06..7efa6e7 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -43,22 +43,10 @@
   V(_IntegerImplementation, toDouble, IntegerToDouble, 150718448)              \
   V(_IntegerImplementation, _leftShiftWithMask32,                              \
       IntegerLeftShiftWithMask32, 1634465017)                                  \
-  V(_Double, truncateToDouble, DoubleTruncate, 791143891)                      \
-  V(_Double, roundToDouble, DoubleRound, 797558034)                            \
-  V(_Double, floorToDouble, DoubleFloor, 1789426271)                           \
-  V(_Double, ceilToDouble, DoubleCeil, 453271198)                              \
-  V(_Double, _modulo, DoubleMod, 1093862165)                                   \
   V(_Double, _add, DoubleAdd, 1190606283)                                      \
   V(_Double, _sub, DoubleSub, 1086286468)                                      \
   V(_Double, _mul, DoubleMul, 166332351)                                       \
   V(_Double, _div, DoubleDiv, 821396195)                                       \
-  V(::, sin, MathSin, 939048573)                                               \
-  V(::, cos, MathCos, 1148850331)                                              \
-  V(::, tan, MathTan, 179725235)                                               \
-  V(::, asin, MathAsin, 848695059)                                             \
-  V(::, acos, MathAcos, 337299516)                                             \
-  V(::, atan, MathAtan, 866406810)                                             \
-  V(::, atan2, MathAtan2, 1901969510)                                          \
   V(::, min, MathMin, 1115051548)                                              \
   V(::, max, MathMax, 1410473322)                                              \
   V(::, _doublePow, MathDoublePow, 562154128)                                  \
@@ -243,6 +231,14 @@
   V(::, sqrt, MathSqrt, 1446681622)                                            \
   V(_Random, _nextState, Random_nextState, 1241583299)                         \
 
+#define GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                       \
+  V(::, sin, MathSin, 939048573)                                               \
+  V(::, cos, MathCos, 1148850331)                                              \
+  V(::, tan, MathTan, 179725235)                                               \
+  V(::, asin, MathAsin, 848695059)                                             \
+  V(::, acos, MathAcos, 337299516)                                             \
+  V(::, atan, MathAtan, 866406810)                                             \
+  V(::, atan2, MathAtan2, 1901969510)                                          \
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
   V(Int8List, ., TypedData_Int8Array_factory, 779569635)                       \
@@ -290,11 +286,18 @@
   V(_GrowableList, [], GrowableArrayGetIndexed, 1957529650)                    \
   V(_GrowableList, []=, GrowableArraySetIndexed, 225246870)                    \
   V(_StringBase, get:length, StringBaseLength, 707533587)                      \
-  V(_Double, unary-, DoubleFlipSignBit, 1783281169)
+  V(_Double, unary-, DoubleFlipSignBit, 1783281169)                            \
+  V(_Double, truncateToDouble, DoubleTruncate, 791143891)                      \
+  V(_Double, roundToDouble, DoubleRound, 797558034)                            \
+  V(_Double, floorToDouble, DoubleFloor, 1789426271)                           \
+  V(_Double, ceilToDouble, DoubleCeil, 453271198)                              \
+  V(_Double, _modulo, DoubleMod, 1093862165)
+
 
 #define GRAPH_INTRINSICS_LIST(V)                                               \
   GRAPH_CORE_INTRINSICS_LIST(V)                                                \
   GRAPH_TYPED_DATA_INTRINSICS_LIST(V)                                          \
+  GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                             \
 
 #define DEVELOPER_LIB_INTRINSIC_LIST(V)                                        \
   V(_UserTag, makeCurrent, UserTag_makeCurrent, 187721469)                     \
@@ -423,6 +426,30 @@
   V(_Bigint, _sqrAdd, Bigint_sqrAdd, 372896038)                                \
   V(_Bigint, _estQuotientDigit, Bigint_estQuotientDigit, 540033329)            \
   V(_Montgomery, _mulMod, Montgomery_mulMod, 118781828)                        \
+  V(_Double, >, Double_greaterThan, 1413076759)                                \
+  V(_Double, >=, Double_greaterEqualThan, 1815180096)                          \
+  V(_Double, <, Double_lessThan, 652059836)                                    \
+  V(_Double, <=, Double_lessEqualThan, 512138528)                              \
+  V(_Double, ==, Double_equal, 752327620)                                      \
+  V(_Double, +, Double_add, 854024064)                                         \
+  V(_Double, -, Double_sub, 685132889)                                         \
+  V(_Double, *, Double_mul, 542254390)                                         \
+  V(_Double, /, Double_div, 1145710768)                                        \
+  V(_IntegerImplementation, +, Integer_add, 364498398)                         \
+  V(_IntegerImplementation, -, Integer_sub, 1682674911)                        \
+  V(_IntegerImplementation, *, Integer_mul, 1651115456)                        \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 108494012)                \
+  V(_IntegerImplementation, unary-, Integer_negate, 1507648892)                \
+  V(_IntegerImplementation, &, Integer_bitAnd, 286231290)                      \
+  V(_IntegerImplementation, |, Integer_bitOr, 1111108792)                      \
+  V(_IntegerImplementation, ^, Integer_bitXor, 1884808537)                     \
+  V(_IntegerImplementation, >, Integer_greaterThan, 293890061)                 \
+  V(_IntegerImplementation, ==, Integer_equal, 4489308)                        \
+  V(_IntegerImplementation, <, Integer_lessThan, 652059836)                    \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 512138528)              \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 1815180096)          \
+  V(_IntegerImplementation, <<, Integer_shl, 293751452)                        \
+  V(_IntegerImplementation, >>, Integer_sar, 125091101)                        \
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 8922db4..894452d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -908,22 +908,14 @@
 // premark all objects in the vm_isolate_ heap.
 class PremarkingVisitor : public ObjectVisitor {
  public:
-  explicit PremarkingVisitor(Isolate* isolate) : ObjectVisitor(isolate) {}
+  PremarkingVisitor() { }
 
   void VisitObject(RawObject* obj) {
     // Free list elements should never be marked.
+    ASSERT(!obj->IsMarked());
     if (!obj->IsFreeListElement()) {
       ASSERT(obj->IsVMHeapObject());
-      if (obj->IsMarked()) {
-        // Precompiled objects are loaded pre-marked.
-        ASSERT(Dart::IsRunningPrecompiledCode());
-        ASSERT(obj->IsInstructions() ||
-               obj->IsPcDescriptors() ||
-               obj->IsStackmap() ||
-               obj->IsOneByteString());
-      } else {
-        obj->SetMarkBitUnsynchronized();
-      }
+      obj->SetMarkBitUnsynchronized();
     }
   }
 };
@@ -994,11 +986,10 @@
 
   {
     ASSERT(isolate == Dart::vm_isolate());
-    bool include_code_pages = !Dart::IsRunningPrecompiledCode();
-    WritableVMIsolateScope scope(Thread::Current(), include_code_pages);
-    PremarkingVisitor premarker(isolate);
+    WritableVMIsolateScope scope(Thread::Current());
+    PremarkingVisitor premarker;
     ASSERT(isolate->heap()->UsedInWords(Heap::kNew) == 0);
-    isolate->heap()->IterateOldObjects(&premarker);
+    isolate->heap()->IterateOldObjectsNoEmbedderPages(&premarker);
     // Make the VM isolate read-only again after setting all objects as marked.
   }
 }
@@ -2733,9 +2724,7 @@
     }
   }
 
-  virtual void IncrementInvalidationGen() {
-    Isolate::Current()->IncrCHAInvalidationGen();
-  }
+  virtual void IncrementInvalidationGen() {}
 
  private:
   const Class& cls_;
@@ -2982,6 +2971,9 @@
   if (is_finalized()) {
     return Error::null();
   }
+  if (Compiler::IsBackgroundCompilation()) {
+    Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+  }
   ASSERT(thread->IsMutatorThread());
   ASSERT(thread != NULL);
   const Error& error = Error::Handle(
@@ -3339,6 +3331,10 @@
   const Script& scr = Script::Handle(script());
   ASSERT(!scr.IsNull());
   const TokenStream& tkns = TokenStream::Handle(scr.tokens());
+  if (tkns.IsNull()) {
+    ASSERT(Dart::IsRunningPrecompiledCode());
+    return TokenPosition::kNoSource;
+  }
   TokenStream::Iterator tkit(tkns,
                              token_pos(),
                              TokenStream::Iterator::kNoNewlines);
@@ -5171,6 +5167,11 @@
 }
 
 
+intptr_t Function::Hash() const {
+  return String::HashRawSymbol(name());
+}
+
+
 bool Function::HasBreakpoint() const {
   if (!FLAG_support_debugger) {
     return false;
@@ -9493,11 +9494,21 @@
 
 
 // Lookup a name in the library's re-export namespace.
+// This lookup can occur from two different threads: background compiler and
+// mutator thread.
 RawObject* Library::LookupReExport(const String& name) const {
   if (HasExports()) {
-    const Array& exports = Array::Handle(this->exports());
-    // Break potential export cycle while looking up name.
-    StorePointer(&raw_ptr()->exports_, Object::empty_array().raw());
+    const bool is_background_compiler = Compiler::IsBackgroundCompilation();
+    Array& exports = Array::Handle();
+    if (is_background_compiler) {
+      exports = this->exports2();
+      // Break potential export cycle while looking up name.
+      StorePointer(&raw_ptr()->exports2_, Object::empty_array().raw());
+    } else {
+      exports = this->exports();
+      // Break potential export cycle while looking up name.
+      StorePointer(&raw_ptr()->exports_, Object::empty_array().raw());
+    }
     Namespace& ns = Namespace::Handle();
     Object& obj = Object::Handle();
     for (int i = 0; i < exports.Length(); i++) {
@@ -9513,7 +9524,11 @@
         }
       }
     }
-    StorePointer(&raw_ptr()->exports_, exports.raw());
+    if (is_background_compiler) {
+      StorePointer(&raw_ptr()->exports2_, exports.raw());
+    } else {
+      StorePointer(&raw_ptr()->exports_, exports.raw());
+    }
     return obj.raw();
   }
   return Object::null();
@@ -9960,6 +9975,7 @@
 void Library::DropDependencies() const {
   StorePointer(&raw_ptr()->imports_, Array::null());
   StorePointer(&raw_ptr()->exports_, Array::null());
+  StorePointer(&raw_ptr()->exports2_, Array::null());
 }
 
 
@@ -9992,6 +10008,7 @@
   intptr_t num_exports = exports.Length();
   exports = Array::Grow(exports, num_exports + 1);
   StorePointer(&raw_ptr()->exports_, exports.raw());
+  StorePointer(&raw_ptr()->exports2_, exports.raw());
   exports.SetAt(num_exports, ns);
 }
 
@@ -10059,6 +10076,8 @@
                                                Heap::kOld));
   result.StorePointer(&result.raw_ptr()->imports_, Object::empty_array().raw());
   result.StorePointer(&result.raw_ptr()->exports_, Object::empty_array().raw());
+  result.StorePointer(&result.raw_ptr()->exports2_,
+      Object::empty_array().raw());
   result.StorePointer(&result.raw_ptr()->loaded_scripts_, Array::null());
   result.StorePointer(&result.raw_ptr()->load_error_, Instance::null());
   result.set_native_entry_resolver(NULL);
@@ -10599,9 +10618,7 @@
     }
   }
 
-  virtual void IncrementInvalidationGen() {
-    Isolate::Current()->IncrPrefixInvalidationGen();
-  }
+  virtual void IncrementInvalidationGen() {}
 
  private:
   const LibraryPrefix& prefix_;
@@ -10800,6 +10817,15 @@
   if (obj.IsNull() || obj.IsLibraryPrefix()) {
     // Lookup in the re-exported symbols.
     obj = lib.LookupReExport(name);
+    if (obj.IsNull() && !Field::IsSetterName(name)) {
+      // LookupReExport() only returns objects that match the given name.
+      // If there is no field/func/getter, try finding a setter.
+      const String& setter_name =
+          String::Handle(Field::LookupSetterSymbol(name));
+      if (!setter_name.IsNull()) {
+        obj = lib.LookupReExport(setter_name);
+      }
+    }
   }
   if (obj.IsNull() || HidesName(name) || obj.IsLibraryPrefix()) {
     return Object::null();
@@ -12954,6 +12980,26 @@
 }
 
 
+uword Code::EntryPoint() const {
+  RawObject* instr = instructions();
+  if (!instr->IsHeapObject()) {
+    return active_entry_point();
+  } else {
+    return Instructions::EntryPoint(instructions());
+  }
+}
+
+
+intptr_t Code::Size() const {
+  RawObject* instr = instructions();
+  if (!instr->IsHeapObject()) {
+    return Smi::Value(raw_ptr()->precompiled_instructions_size_);
+  } else {
+    return instructions()->ptr()->size_;
+  }
+}
+
+
 bool Code::HasBreakpoint() const {
   if (!FLAG_support_debugger) {
     return false;
@@ -13299,10 +13345,13 @@
     }
 
     // Hook up Code and Instructions objects.
-    code.SetActiveInstructions(instrs.raw());
     code.set_instructions(instrs.raw());
+    code.SetActiveInstructions(instrs.raw());
     code.set_is_alive(true);
 
+    ASSERT(code.EntryPoint() == instrs.EntryPoint());
+    ASSERT(code.Size() == instrs.size());
+
     // Set object pool in Instructions object.
     INC_STAT(Thread::Current(),
              total_code_size, object_pool.Length() * sizeof(uintptr_t));
@@ -13500,9 +13549,10 @@
 void Code::DisableDartCode() const {
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   ASSERT(IsFunctionCode());
-  ASSERT(instructions() == active_instructions());
+  ASSERT(!IsDisabled());
   const Code& new_code =
       Code::Handle(StubCode::FixCallersTarget_entry()->code());
+  ASSERT(new_code.instructions()->IsVMHeapObject());
   SetActiveInstructions(new_code.instructions());
 }
 
@@ -13510,9 +13560,10 @@
 void Code::DisableStubCode() const {
   ASSERT(Thread::Current()->IsMutatorThread());
   ASSERT(IsAllocationStubCode());
-  ASSERT(instructions() == active_instructions());
+  ASSERT(!IsDisabled());
   const Code& new_code =
       Code::Handle(StubCode::FixAllocationStubTarget_entry()->code());
+  ASSERT(new_code.instructions()->IsVMHeapObject());
   SetActiveInstructions(new_code.instructions());
 }
 
@@ -13521,7 +13572,6 @@
   DEBUG_ASSERT(IsMutatorOrAtSafepoint() || !is_alive());
   // RawInstructions are never allocated in New space and hence a
   // store buffer update is not needed here.
-  StorePointer(&raw_ptr()->active_instructions_, instructions);
   StoreNonPointer(&raw_ptr()->entry_point_,
                   reinterpret_cast<uword>(instructions->ptr()) +
                   Instructions::HeaderSize());
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 1ed09f7..8a818f6 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2249,6 +2249,8 @@
     return OFFSET_OF(RawFunction, entry_point_);
   }
 
+  virtual intptr_t Hash() const;
+
   // Returns true if there is at least one debugger breakpoint
   // set in this function.
   bool HasBreakpoint() const;
@@ -3552,6 +3554,7 @@
   // Library imports.
   RawArray* imports() const { return raw_ptr()->imports_; }
   RawArray* exports() const { return raw_ptr()->exports_; }
+  RawArray* exports2() const { return raw_ptr()->exports2_; }
   void AddImport(const Namespace& ns) const;
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
   RawNamespace* ImportAt(intptr_t index) const;
@@ -3856,7 +3859,10 @@
   intptr_t size() const { return raw_ptr()->size_; }  // Excludes HeaderSize().
 
   uword EntryPoint() const {
-    return reinterpret_cast<uword>(raw_ptr()) + HeaderSize();
+    return EntryPoint(raw());
+  }
+  static uword EntryPoint(RawInstructions* instr) {
+    return reinterpret_cast<uword>(instr->ptr()) + HeaderSize();
   }
 
   static const intptr_t kMaxElements = (kMaxInt32 -
@@ -4323,9 +4329,7 @@
 
 class Code : public Object {
  public:
-  RawInstructions* active_instructions() const {
-    return raw_ptr()->active_instructions_;
-  }
+  uword active_entry_point() const { return raw_ptr()->entry_point_; }
 
   RawInstructions* instructions() const { return raw_ptr()->instructions_; }
 
@@ -4355,20 +4359,15 @@
   }
   void set_is_alive(bool value) const;
 
-  uword EntryPoint() const {
-    return Instructions::Handle(instructions()).EntryPoint();
-  }
-  intptr_t Size() const {
-    const Instructions& instr = Instructions::Handle(instructions());
-    return instr.size();
-  }
+  uword EntryPoint() const;
+  intptr_t Size() const;
+
   RawObjectPool* GetObjectPool() const {
     return object_pool();
   }
   bool ContainsInstructionAt(uword addr) const {
-    const Instructions& instr = Instructions::Handle(instructions());
-    const uword offset = addr - instr.EntryPoint();
-    return offset < static_cast<uword>(instr.size());
+    const uword offset = addr - EntryPoint();
+    return offset < static_cast<uword>(Size());
   }
 
   // Returns true if there is a debugger breakpoint set in this code object.
@@ -4607,12 +4606,11 @@
   void Enable() const {
     if (!IsDisabled()) return;
     ASSERT(Thread::Current()->IsMutatorThread());
-    ASSERT(instructions() != active_instructions());
     SetActiveInstructions(instructions());
   }
 
   bool IsDisabled() const {
-    return instructions() != active_instructions();
+    return active_entry_point() != EntryPoint();
   }
 
  private:
@@ -4638,8 +4636,7 @@
 
   class SlowFindRawCodeVisitor : public FindObjectVisitor {
    public:
-    explicit SlowFindRawCodeVisitor(uword pc)
-        : FindObjectVisitor(Isolate::Current()), pc_(pc) { }
+    explicit SlowFindRawCodeVisitor(uword pc) : pc_(pc) { }
     virtual ~SlowFindRawCodeVisitor() { }
 
     // Check if object matches find condition.
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 145b84e..bbecac7 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -138,7 +138,7 @@
 
 class Unmarker : public ObjectVisitor {
  public:
-  explicit Unmarker(Isolate* isolate) : ObjectVisitor(isolate) { }
+  Unmarker() { }
 
   void VisitObject(RawObject* obj) {
     if (obj->IsMarked()) {
@@ -147,7 +147,7 @@
   }
 
   static void UnmarkAll(Isolate* isolate) {
-    Unmarker unmarker(isolate);
+    Unmarker unmarker;
     isolate->heap()->IterateObjects(&unmarker);
   }
 
@@ -192,10 +192,8 @@
 
 class InstanceAccumulator : public ObjectVisitor {
  public:
-  explicit InstanceAccumulator(ObjectGraph::Stack* stack,
-                               intptr_t class_id,
-                               Isolate* isolate)
-    : ObjectVisitor(isolate), stack_(stack), class_id_(class_id) { }
+  InstanceAccumulator(ObjectGraph::Stack* stack, intptr_t class_id)
+      : stack_(stack), class_id_(class_id) { }
 
   void VisitObject(RawObject* obj) {
     if (obj->GetClassId() == class_id_) {
@@ -217,7 +215,7 @@
   NoSafepointScope no_safepoint_scope_;
   Stack stack(isolate());
 
-  InstanceAccumulator accumulator(&stack, class_id, isolate());
+  InstanceAccumulator accumulator(&stack, class_id);
   isolate()->heap()->IterateObjects(&accumulator);
 
   stack.TraverseGraph(visitor);
@@ -376,7 +374,7 @@
                            RawObject* target,
                            const Array& references,
                            Object* scratch)
-    : ObjectVisitor(isolate), ObjectPointerVisitor(isolate), source_(NULL),
+    : ObjectPointerVisitor(isolate), source_(NULL),
       target_(target), references_(references), scratch_(scratch), length_(0) {
     ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0);
   }
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index e793b9b..b1243e9 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -4121,7 +4121,7 @@
 class ObjectAccumulator : public ObjectVisitor {
  public:
   explicit ObjectAccumulator(GrowableArray<Object*>* objects)
-      : ObjectVisitor(Isolate::Current()), objects_(objects) {}
+      : objects_(objects) { }
   virtual ~ObjectAccumulator() { }
   virtual void VisitObject(RawObject* obj) {
     // Free-list elements cannot even be wrapped in handles.
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 177b091..05e01fb 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -611,6 +611,15 @@
 }
 
 
+void PageSpace::VisitObjectsNoEmbedderPages(ObjectVisitor* visitor) const {
+  for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
+    if (!it.page()->embedder_allocated()) {
+      it.page()->VisitObjects(visitor);
+    }
+  }
+}
+
+
 void PageSpace::VisitObjectPointers(ObjectPointerVisitor* visitor) const {
   for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
     it.page()->VisitObjectPointers(visitor);
@@ -652,15 +661,13 @@
 }
 
 
-void PageSpace::WriteProtect(bool read_only, bool include_code_pages) {
+void PageSpace::WriteProtect(bool read_only) {
   if (read_only) {
     // Avoid MakeIterable trying to write to the heap.
     AbandonBumpAllocation();
   }
   for (ExclusivePageIterator it(this); !it.Done(); it.Advance()) {
-    HeapPage::PageType page_type = it.page()->type();
-    if ((page_type != HeapPage::kReadOnlyData) &&
-        ((page_type != HeapPage::kExecutable) || include_code_pages)) {
+    if (!it.page()->embedder_allocated()) {
       it.page()->WriteProtect(read_only);
     }
   }
@@ -698,8 +705,7 @@
 
 class HeapMapAsJSONVisitor : public ObjectVisitor {
  public:
-  explicit HeapMapAsJSONVisitor(JSONArray* array)
-      : ObjectVisitor(NULL), array_(array) {}
+  explicit HeapMapAsJSONVisitor(JSONArray* array) : array_(array) { }
   virtual void VisitObject(RawObject* obj) {
     array_->AddValue(obj->Size() / kObjectAlignment);
     array_->AddValue(obj->GetClassId());
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index bd4ab5c..ff1ca15 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -52,6 +52,8 @@
     return type_;
   }
 
+  bool embedder_allocated() const { return memory_->embedder_allocated(); }
+
   void VisitObjects(ObjectVisitor* visitor) const;
   void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
 
@@ -254,6 +256,7 @@
   }
 
   void VisitObjects(ObjectVisitor* visitor) const;
+  void VisitObjectsNoEmbedderPages(ObjectVisitor* visitor) const;
   void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
 
   RawObject* FindObject(FindObjectVisitor* visitor,
@@ -292,7 +295,7 @@
 
   // Note: Code pages are made executable/non-executable when 'read_only' is
   // true/false, respectively.
-  void WriteProtect(bool read_only, bool include_code_pages);
+  void WriteProtect(bool read_only);
   void WriteProtectCode(bool read_only);
 
   void AddGCTime(int64_t micros) {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 315d5a1..3e89bad 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -491,6 +491,20 @@
 }
 
 
+// Set state and increments generational count so that thge background compiler
+// can detect if loading/top-level-parsing occured during compilation.
+class TopLevelParsingScope : public StackResource {
+ public:
+  explicit TopLevelParsingScope(Thread* thread) : StackResource(thread) {
+    isolate()->IncrTopLevelParsingCount();
+  }
+  ~TopLevelParsingScope() {
+    isolate()->DecrTopLevelParsingCount();
+    isolate()->IncrLoadingInvalidationGen();
+  }
+};
+
+
 void Parser::ParseCompilationUnit(const Library& library,
                                   const Script& script) {
   Thread* thread = Thread::Current();
@@ -507,6 +521,7 @@
   }
 #endif
 
+  TopLevelParsingScope scope(thread);
   Parser parser(script, library, TokenPosition::kMinSource);
   parser.ParseTopLevel();
 }
@@ -11860,7 +11875,6 @@
   }
   // Resolve type arguments, if any.
   const TypeArguments& arguments = TypeArguments::Handle(Z, type->arguments());
-      TypeArguments::Handle(Z, type->arguments());
   if (!arguments.IsNull()) {
     const intptr_t num_arguments = arguments.Length();
     for (intptr_t i = 0; i < num_arguments; i++) {
@@ -13050,12 +13064,20 @@
     factory_type_args = factory_type_args.Canonicalize();
     ArgumentListNode* factory_param = new(Z) ArgumentListNode(literal_pos);
     // The kv_pair array is temporary and of element type dynamic. It is passed
-    // to the factory to initialize a properly typed map.
-    ArrayNode* kv_pairs = new(Z) ArrayNode(
-        TokenPos(),
-        Type::ZoneHandle(Z, Type::ArrayType()),
-        kv_pairs_list);
-    factory_param->Add(kv_pairs);
+    // to the factory to initialize a properly typed map. Pass a pre-allocated
+    // array for the common empty map literal case.
+    if (kv_pairs_list.length() == 0) {
+      LiteralNode* empty_array_literal =
+          new(Z) LiteralNode(TokenPos(), Object::empty_array());
+      factory_param->Add(empty_array_literal);
+    } else {
+      ArrayNode* kv_pairs = new(Z) ArrayNode(
+          TokenPos(),
+          Type::ZoneHandle(Z, Type::ArrayType()),
+          kv_pairs_list);
+      factory_param->Add(kv_pairs);
+    }
+
     return CreateConstructorCallNode(literal_pos,
                                      factory_type_args,
                                      factory_method,
diff --git a/runtime/vm/port.cc b/runtime/vm/port.cc
index a57b93f..3df0a63 100644
--- a/runtime/vm/port.cc
+++ b/runtime/vm/port.cc
@@ -14,8 +14,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, trace_isolates);
-
 Mutex* PortMap::mutex_ = NULL;
 PortMap::Entry* PortMap::map_ = NULL;
 MessageHandler* PortMap::deleted_entry_ = reinterpret_cast<MessageHandler*>(1);
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index d357839..dcabc02 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -282,6 +282,14 @@
   }
 
   Dart_QualifiedFunctionName vm_entry_points[] = {
+    // TODO(rmacnak): These types are not allocated from C++ but they are
+    // cached in the object store. Consider clearing them from the object store
+    // before snapshotting and adjusting InitKnownObjects to allow their
+    // absence.
+    { "dart:async", "Future", "Future." },
+    { "dart:async", "Completer", "Completer." },
+    { "dart:async", "StreamIterator", "StreamIterator." },
+
     // Functions
     { "dart:async", "::", "_setScheduleImmediateClosure" },
     { "dart:core", "::", "_completeDeferredLoads" },
@@ -314,9 +322,11 @@
     { "dart:typed_data", "ByteData", "ByteData." },
     { "dart:typed_data", "ByteData", "ByteData._view" },
     { "dart:typed_data", "ByteBuffer", "ByteBuffer._New" },
+#if !defined(PRODUCT)
     { "dart:_vmservice", "::", "_registerIsolate" },
     { "dart:_vmservice", "::", "boot" },
     { "dart:developer", "Metrics", "_printMetrics" },
+#endif  // !PRODUCT
     // Fields
     { "dart:core", "Error", "_stackTrace" },
     { "dart:math", "_Random", "_state" },
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index f0014f4..e597260 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -27,8 +27,8 @@
 namespace dart {
 
 static const intptr_t kSampleSize = 8;
+static const intptr_t kMaxSamplesPerTick = 4;
 
-DECLARE_FLAG(bool, trace_profiler);
 DEFINE_FLAG(bool, trace_profiled_isolates, false, "Trace profiled isolates.");
 
 #if defined(TARGET_OS_ANDROID) || defined(TARGET_ARCH_ARM64) ||                \
@@ -39,7 +39,7 @@
   DEFINE_FLAG(int, profile_period, 1000,
               "Time between profiler samples in microseconds. Minimum 50.");
 #endif
-DEFINE_FLAG(int, max_profile_depth, kSampleSize,
+DEFINE_FLAG(int, max_profile_depth, kSampleSize * kMaxSamplesPerTick,
             "Maximum number stack frames walked. Minimum 1. Maximum 255.");
 #if defined(USING_SIMULATOR)
 DEFINE_FLAG(bool, profile_vm, true,
@@ -945,6 +945,32 @@
 }
 
 
+void Profiler::SampleThreadSingleFrame(Thread* thread, uintptr_t pc) {
+  ASSERT(thread != NULL);
+  OSThread* os_thread = thread->os_thread();
+  ASSERT(os_thread != NULL);
+  Isolate* isolate = thread->isolate();
+
+  SampleBuffer* sample_buffer = Profiler::sample_buffer();
+  if (sample_buffer == NULL) {
+    // Profiler not initialized.
+    return;
+  }
+
+  // Setup sample.
+  Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id());
+  // Increment counter for vm tag.
+  VMTagCounters* counters = isolate->vm_tag_counters();
+  ASSERT(counters != NULL);
+  if (thread->IsMutatorThread()) {
+    counters->Increment(sample->vm_tag());
+  }
+
+  // Write the single pc value.
+  sample->SetAt(0, pc);
+}
+
+
 void Profiler::SampleThread(Thread* thread,
                             const InterruptedThreadState& state) {
   ASSERT(thread != NULL);
@@ -989,15 +1015,17 @@
     sp = state.csp;
   }
 
-  if (!InitialRegisterCheck(pc, fp, sp)) {
-    return;
-  }
-
   if (!CheckIsolate(isolate)) {
     return;
   }
 
   if (thread->IsMutatorThread() && isolate->IsDeoptimizing()) {
+    SampleThreadSingleFrame(thread, pc);
+    return;
+  }
+
+  if (!InitialRegisterCheck(pc, fp, sp)) {
+    SampleThreadSingleFrame(thread, pc);
     return;
   }
 
@@ -1009,6 +1037,7 @@
                                         &stack_lower,
                                         &stack_upper)) {
     // Could not get stack boundary.
+    SampleThreadSingleFrame(thread, pc);
     return;
   }
 
@@ -1096,9 +1125,7 @@
 
 class CodeLookupTableBuilder : public ObjectVisitor {
  public:
-  CodeLookupTableBuilder(Isolate* isolate, CodeLookupTable* table)
-      : ObjectVisitor(isolate),
-        table_(table) {
+  explicit CodeLookupTableBuilder(CodeLookupTable* table) : table_(table) {
     ASSERT(table_ != NULL);
   }
 
@@ -1134,7 +1161,7 @@
   code_objects_.Clear();
 
   // Add all found Code objects.
-  CodeLookupTableBuilder cltb(isolate, this);
+  CodeLookupTableBuilder cltb(this);
   vm_isolate->heap()->IterateOldObjects(&cltb);
   isolate->heap()->IterateOldObjects(&cltb);
 
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 1f65c91..096d429 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -53,6 +53,8 @@
                            const InterruptedThreadState& state);
 
  private:
+  // Does not walk the thread's stack.
+  static void SampleThreadSingleFrame(Thread* thread, uintptr_t pc);
   static bool initialized_;
 
   static SampleBuffer* sample_buffer_;
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 09d4d43..c0ac69d 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -5,6 +5,7 @@
 #include "vm/profiler_service.h"
 
 #include "vm/growable_array.h"
+#include "vm/hash_map.h"
 #include "vm/log.h"
 #include "vm/native_symbol.h"
 #include "vm/object.h"
@@ -17,8 +18,7 @@
 
 DECLARE_FLAG(int, max_profile_depth);
 DECLARE_FLAG(int, profile_period);
-
-DEFINE_FLAG(bool, trace_profiler, false, "Trace profiler.");
+DECLARE_FLAG(bool, show_invisible_frames);
 
 #ifndef PRODUCT
 
@@ -137,6 +137,15 @@
 }
 
 
+bool ProfileFunction::is_visible() const {
+  if (function_.IsNull()) {
+    // Some synthetic function.
+    return true;
+  }
+  return FLAG_show_invisible_frames || function_.is_visible();
+}
+
+
 void ProfileFunction::Tick(bool exclusive,
                            intptr_t inclusive_serial,
                            TokenPosition token_position) {
@@ -161,7 +170,7 @@
   for (; i < source_position_ticks_.length(); i++) {
     ProfileFunctionSourcePosition& position = source_position_ticks_[i];
     if (position.token_pos().value() == token_position.value()) {
-      if (FLAG_trace_profiler) {
+      if (FLAG_trace_profiler_verbose) {
         OS::Print("Ticking source position %s %s\n",
                   exclusive ? "exclusive" : "inclusive",
                   token_position.ToCString());
@@ -177,7 +186,7 @@
 
   // Add new one, sorted by token position value.
   ProfileFunctionSourcePosition pfsp(token_position);
-  if (FLAG_trace_profiler) {
+  if (FLAG_trace_profiler_verbose) {
     OS::Print("Ticking source position %s %s\n",
               exclusive ? "exclusive" : "inclusive",
               token_position.ToCString());
@@ -515,8 +524,8 @@
  public:
   ProfileFunctionTable()
       : null_function_(Function::ZoneHandle()),
-        table_(8),
-        unknown_function_(NULL) {
+        unknown_function_(NULL),
+        table_(8) {
     unknown_function_ = Add(ProfileFunction::kUnknownFunction,
                             "<unknown Dart function>");
   }
@@ -530,15 +539,9 @@
     return Add(function);
   }
 
-  intptr_t LookupIndex(const Function& function) {
+  ProfileFunction* Lookup(const Function& function) {
     ASSERT(!function.IsNull());
-    for (intptr_t i = 0; i < table_.length(); i++) {
-      ProfileFunction* profile_function = table_[i];
-      if (profile_function->function() == function.raw()) {
-        return i;
-      }
-    }
-    return -1;
+    return function_hash_.Lookup(&function);
   }
 
   ProfileFunction* GetUnknown() {
@@ -595,21 +598,37 @@
                             function,
                             table_.length());
     table_.Add(profile_function);
+    function_hash_.Insert(profile_function);
     return profile_function;
   }
 
-  ProfileFunction* Lookup(const Function& function) {
-    ASSERT(!function.IsNull());
-    intptr_t index = LookupIndex(function);
-    if (index == -1) {
-      return NULL;
+  // Needed for DirectChainedHashMap.
+  struct ProfileFunctionTableTrait {
+    typedef ProfileFunction* Value;
+    typedef const Function* Key;
+    typedef ProfileFunction* Pair;
+
+    static Key KeyOf(Pair kv) {
+      return kv->function();
     }
-    return table_[index];
-  }
+
+    static Value ValueOf(Pair kv) {
+      return kv;
+    }
+
+    static inline intptr_t Hashcode(Key key) {
+      return key->Hash();
+    }
+
+    static inline bool IsKeyEqual(Pair kv, Key key) {
+      return kv->function()->raw() == key->raw();
+    }
+  };
 
   const Function& null_function_;
-  ZoneGrowableArray<ProfileFunction*> table_;
   ProfileFunction* unknown_function_;
+  ZoneGrowableArray<ProfileFunction*> table_;
+  DirectChainedHashMap<ProfileFunctionTableTrait> function_hash_;
 };
 
 
@@ -1046,6 +1065,160 @@
 };
 
 
+class ProfileCodeInlinedFunctionsCache : public ValueObject {
+ public:
+  ProfileCodeInlinedFunctionsCache()
+      : cache_cursor_(0),
+        last_hit_(0) {
+    for (intptr_t i = 0; i < kCacheSize; i++) {
+      cache_[i].Reset();
+    }
+    cache_hit_ = 0;
+    cache_miss_ = 0;
+  }
+
+  ~ProfileCodeInlinedFunctionsCache() {
+    if (FLAG_trace_profiler) {
+      intptr_t total = cache_hit_ + cache_miss_;
+      OS::Print("LOOKUPS: %" Pd " HITS: %" Pd " MISSES: %" Pd "\n",
+                total,
+                cache_hit_,
+                cache_miss_);
+    }
+  }
+
+  void Get(uword pc,
+           const Code& code,
+           ProcessedSample* sample,
+           intptr_t frame_index,
+           // Outputs:
+           GrowableArray<Function*>** inlined_functions,
+           GrowableArray<TokenPosition>** inlined_token_positions,
+           TokenPosition* token_position) {
+    const intptr_t offset = OffsetForPC(pc, code, sample, frame_index);
+    if (FindInCache(pc,
+                    offset,
+                    inlined_functions,
+                    inlined_token_positions,
+                    token_position)) {
+      // Found in cache.
+      return;
+    }
+    Add(pc, code, sample, frame_index,
+        inlined_functions, inlined_token_positions, token_position);
+  }
+
+ private:
+  bool FindInCache(uword pc,
+                   intptr_t offset,
+                   GrowableArray<Function*>** inlined_functions,
+                   GrowableArray<TokenPosition>** inlined_token_positions,
+                   TokenPosition* token_position) {
+    // Simple linear scan.
+    for (intptr_t i = 0; i < kCacheSize; i++) {
+      intptr_t index = (last_hit_ + i) % kCacheSize;
+      if ((cache_[index].pc == pc) && (cache_[index].offset == offset)) {
+        // Hit.
+        if (cache_[index].inlined_functions.length() == 0) {
+          *inlined_functions = NULL;
+          *inlined_token_positions = NULL;
+        } else {
+          *inlined_functions = &cache_[index].inlined_functions;
+          *inlined_token_positions = &cache_[index].inlined_token_positions;
+        }
+        *token_position = cache_[index].token_position;
+        cache_hit_++;
+        last_hit_ = index;
+        return true;
+      }
+    }
+    cache_miss_++;
+    return false;
+  }
+
+  // Add to cache and fill in outputs.
+  void Add(uword pc,
+           const Code& code,
+           ProcessedSample* sample,
+           intptr_t frame_index,
+           // Outputs:
+           GrowableArray<Function*>** inlined_functions,
+           GrowableArray<TokenPosition>** inlined_token_positions,
+           TokenPosition* token_position) {
+    const intptr_t offset = OffsetForPC(pc, code, sample, frame_index);
+    CacheEntry* cache_entry = &cache_[NextFreeIndex()];
+    cache_entry->pc = pc;
+    cache_entry->offset = offset;
+    code.GetInlinedFunctionsAt(offset,
+                               &(cache_entry->inlined_functions),
+                               &(cache_entry->inlined_token_positions));
+    cache_entry->token_position = code.GetTokenPositionAt(offset);
+    *token_position = (cache_entry->token_position);
+    if (cache_entry->inlined_functions.length() == 0) {
+      *inlined_functions = NULL;
+      *inlined_token_positions = NULL;
+      return;
+    }
+    // The inlined token position table does not include the token position
+    // of the final call. Insert it at the beginning because the table.
+    // is reversed.
+    cache_entry->inlined_token_positions.InsertAt(
+        0,
+        cache_entry->token_position);
+
+    // Write outputs.
+    *inlined_functions = &(cache_entry->inlined_functions);
+    *inlined_token_positions = &(cache_entry->inlined_token_positions);
+  }
+
+  intptr_t NextFreeIndex() {
+    cache_cursor_ = (cache_cursor_ + 1) % kCacheSize;
+    return cache_cursor_;
+  }
+
+  intptr_t OffsetForPC(uword pc,
+                       const Code& code,
+                       ProcessedSample* sample,
+                       intptr_t frame_index) {
+    intptr_t offset = pc - code.EntryPoint();
+    if (frame_index != 0) {
+      // The PC of frames below the top frame is a call's return address,
+      // which can belong to a different inlining interval than the call.
+      offset--;
+    } else if (sample->IsAllocationSample()) {
+      // Allocation samples skip the top frame, so the top frame's pc is
+      // also a call's return address.
+      offset--;
+    } else if (!sample->first_frame_executing()) {
+      // If the first frame wasn't executing code (i.e. we started to collect
+      // the stack trace at an exit frame), the top frame's pc is also a
+      // call's return address.
+      offset--;
+    }
+    return offset;
+  }
+
+  struct CacheEntry {
+    void Reset() {
+      pc = 0;
+      offset = 0;
+    }
+    uword pc;
+    intptr_t offset;
+    GrowableArray<Function*> inlined_functions;
+    GrowableArray<TokenPosition> inlined_token_positions;
+    TokenPosition token_position;
+  };
+
+  static const intptr_t kCacheSize = 128;
+  intptr_t cache_cursor_;
+  intptr_t last_hit_;
+  CacheEntry cache_[kCacheSize];
+  intptr_t cache_miss_;
+  intptr_t cache_hit_;
+};
+
+
 class ProfileBuilder : public ValueObject {
  public:
   enum ProfileInfoKind {
@@ -1447,28 +1620,6 @@
     }
   }
 
-  intptr_t OffsetForPC(uword pc,
-                       const Code& code,
-                       ProcessedSample* sample,
-                       intptr_t frame_index) {
-    intptr_t offset = pc - code.EntryPoint();
-    if (frame_index != 0) {
-      // The PC of frames below the top frame is a call's return address,
-      // which can belong to a different inlining interval than the call.
-      offset--;
-    } else if (sample->IsAllocationSample()) {
-      // Allocation samples skip the top frame, so the top frame's pc is
-      // also a call's return address.
-      offset--;
-    } else if (!sample->first_frame_executing()) {
-      // If the first frame wasn't executing code (i.e. we started to collect
-      // the stack trace at an exit frame), the top frame's pc is also a
-      // call's return address.
-      offset--;
-    }
-    return offset;
-  }
-
   ProfileFunctionTrieNode* ProcessFrame(
       ProfileFunctionTrieNode* current,
       intptr_t sample_index,
@@ -1482,34 +1633,28 @@
     const intptr_t code_index = profile_code->code_table_index();
     ASSERT(profile_code != NULL);
     const Code& code = Code::ZoneHandle(profile_code->code());
-    GrowableArray<Function*> inlined_functions;
-    GrowableArray<TokenPosition> inlined_token_positions;
+    GrowableArray<Function*>* inlined_functions = NULL;
+    GrowableArray<TokenPosition>* inlined_token_positions = NULL;
     TokenPosition token_position = TokenPosition::kNoSource;
     if (!code.IsNull()) {
-      const intptr_t offset = OffsetForPC(pc, code, sample, frame_index);
-      code.GetInlinedFunctionsAt(offset,
-                                 &inlined_functions,
-                                 &inlined_token_positions);
-      token_position = code.GetTokenPositionAt(offset);
-      if (inlined_functions.length() > 0) {
-        // The inlined token position table does not include the token position
-        // of the final call. Insert it at the beginning because the table.
-        // is reversed.
-        inlined_token_positions.InsertAt(0, token_position);
-      }
-      ASSERT(inlined_functions.length() <= inlined_token_positions.length());
-      if (FLAG_trace_profiler) {
-        for (intptr_t i = 0; i < inlined_functions.length(); i++) {
+      inlined_functions_cache_.Get(pc, code, sample, frame_index,
+                                   &inlined_functions,
+                                   &inlined_token_positions,
+                                   &token_position);
+      if (FLAG_trace_profiler_verbose) {
+        for (intptr_t i = 0; i < inlined_functions->length(); i++) {
           const String& name =
-              String::Handle(inlined_functions[i]->QualifiedScrubbedName());
+              String::Handle((*inlined_functions)[i]->QualifiedScrubbedName());
           THR_Print("InlinedFunction[%" Pd "] = {%s, %s}\n",
                     i,
                     name.ToCString(),
-                    inlined_token_positions[i].ToCString());
+                    (*inlined_token_positions)[i].ToCString());
         }
       }
     }
-    if (code.IsNull() || (inlined_functions.length() == 0)) {
+    if (code.IsNull() ||
+        (inlined_functions == NULL) ||
+        (inlined_functions->length() == 0)) {
       // No inlined functions.
       if (inclusive_tree_) {
         current = AppendKind(code, current);
@@ -1530,12 +1675,12 @@
     ASSERT(code.is_optimized());
 
     if (inclusive_tree_) {
-      for (intptr_t i = inlined_functions.length() - 1; i >= 0; i--) {
-        Function* inlined_function = inlined_functions[i];
+      for (intptr_t i = inlined_functions->length() - 1; i >= 0; i--) {
+        Function* inlined_function = (*inlined_functions)[i];
         ASSERT(inlined_function != NULL);
         ASSERT(!inlined_function->IsNull());
-        TokenPosition inlined_token_position = inlined_token_positions[i];
-        const bool inliner = i == (inlined_functions.length() - 1);
+        TokenPosition inlined_token_position = (*inlined_token_positions)[i];
+        const bool inliner = i == (inlined_functions->length() - 1);
         if (inliner) {
           current = AppendKind(code, current);
         }
@@ -1554,12 +1699,12 @@
     } else {
       // Append the inlined children.
       current = AppendKind(kInlineFinish, current);
-      for (intptr_t i = 0; i < inlined_functions.length(); i++) {
-        Function* inlined_function = inlined_functions[i];
+      for (intptr_t i = 0; i < inlined_functions->length(); i++) {
+        Function* inlined_function = (*inlined_functions)[i];
         ASSERT(inlined_function != NULL);
         ASSERT(!inlined_function->IsNull());
-        TokenPosition inlined_token_position = inlined_token_positions[i];
-        const bool inliner = i == (inlined_functions.length() - 1);
+        TokenPosition inlined_token_position = (*inlined_token_positions)[i];
+        const bool inliner = i == (inlined_functions->length() - 1);
         if (inliner) {
           current = AppendKind(kInlineStart, current);
         }
@@ -1615,8 +1760,11 @@
                                            ProfileFunction* function,
                                            TokenPosition token_position,
                                            intptr_t code_index) {
+    if (!function->is_visible()) {
+      return current;
+    }
     if (tick_functions_) {
-      if (FLAG_trace_profiler) {
+      if (FLAG_trace_profiler_verbose) {
         THR_Print("S[%" Pd "]F[%" Pd "] %s %s 0x%" Px "\n",
                   sample_index,
                   frame_index,
@@ -2104,7 +2252,7 @@
   const Function& null_function_;
   bool tick_functions_;
   bool inclusive_tree_;
-
+  ProfileCodeInlinedFunctionsCache inlined_functions_cache_;
   ProcessedSampleBuffer* samples_;
   ProfileInfoKind info_kind_;
 };  // ProfileBuilder.
@@ -2259,11 +2407,7 @@
 
 
 ProfileFunction* Profile::FindFunction(const Function& function) {
-  const intptr_t index = functions_->LookupIndex(function);
-  if (index < 0) {
-    return NULL;
-  }
-  return functions_->At(index);
+  return functions_->Lookup(function);
 }
 
 
@@ -2395,7 +2539,7 @@
     return NULL;
   }
   ProfileFunction* func = profile_->GetFunction(current_->table_index());
-  const Function& function = Function::Handle(func->function());
+  const Function& function = *(func->function());
   if (function.IsNull()) {
     // No function.
     return NULL;
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index 4bd64da..0e0e6d3 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -73,10 +73,12 @@
 
   const char* Name() const;
 
-  RawFunction* function() const {
-    return function_.raw();
+  const Function* function() const {
+    return &function_;
   }
 
+  bool is_visible() const;
+
   intptr_t table_index() const {
     return table_index_;
   }
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 437ab7e..98553cd 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -535,8 +535,11 @@
 
   RawCode* obj = raw_obj->ptr();
   intptr_t length = Code::PtrOffBits::decode(obj->state_bits_);
+#if defined(TARGET_ARCH_IA32)
+  // On IA32 only we embed pointers to objects directly in the generated
+  // instructions. The variable portion of a Code object describes where to
+  // find those pointers for tracing.
   if (Code::AliveBit::decode(obj->state_bits_)) {
-    // Also visit all the embedded pointers in the corresponding instructions.
     uword entry_point = reinterpret_cast<uword>(obj->instructions_->ptr()) +
         Instructions::HeaderSize();
     for (intptr_t i = 0; i < length; i++) {
@@ -546,6 +549,12 @@
     }
   }
   return Code::InstanceSize(length);
+#else
+  // On all other architectures, objects are referenced indirectly through
+  // either an ObjectPool or Thread.
+  ASSERT(length == 0);
+  return Code::InstanceSize(0);
+#endif
 }
 
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 561011c..7c90991 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1023,6 +1023,9 @@
   RawGrowableObjectArray* patch_classes_;
   RawArray* imports_;            // List of Namespaces imported without prefix.
   RawArray* exports_;            // List of re-exported Namespaces.
+  RawArray* exports2_;           // Copy of exports_, used by background
+                                 // compiler to detect cycles without colliding
+                                 // with mutator thread lookups.
   RawInstance* load_error_;      // Error iff load_state_ == kLoadError.
   RawObject** to_snapshot() {
     return reinterpret_cast<RawObject**>(&ptr()->load_error_);
@@ -1079,10 +1082,12 @@
   uword entry_point_;
 
   RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->active_instructions_);
+    return reinterpret_cast<RawObject**>(&ptr()->instructions_);
   }
-  RawInstructions* active_instructions_;
-  RawInstructions* instructions_;
+  union {
+    RawInstructions* instructions_;
+    RawSmi* precompiled_instructions_size_;
+  };
   RawObjectPool* object_pool_;
   // If owner_ is Function::null() the owner is a regular stub.
   // If owner_ is a Class the owner is the allocation stub for that class.
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 194317f..7c861e2 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -855,8 +855,6 @@
   if (reader->snapshot_code()) {
     field.set_token_pos(TokenPosition::kNoSource);
     ASSERT(!FLAG_use_field_guards);
-    field.set_guarded_cid(kDynamicCid);
-    field.set_is_nullable(true);
   } else {
     field.set_token_pos(
         TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
@@ -873,8 +871,9 @@
                      field.raw()->from(), toobj,
                      kAsReference);
 
-  if (reader->snapshot_code()) {
-    ASSERT(!FLAG_use_field_guards);
+  if (!FLAG_use_field_guards) {
+    field.set_guarded_cid(kDynamicCid);
+    field.set_is_nullable(true);
     field.set_guarded_list_length(Field::kNoFixedLength);
     field.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
   } else {
@@ -1339,6 +1338,19 @@
 }
 
 
+#if defined(DEBUG)
+static uword Checksum(uword entry, intptr_t size) {
+  uword sum = 0;
+  uword* start = reinterpret_cast<uword*>(entry);
+  uword* end = reinterpret_cast<uword*>(entry + size);
+  for (uword* cursor = start; cursor < end; cursor++) {
+    sum ^= *cursor;
+  }
+  return sum;
+}
+#endif
+
+
 RawCode* Code::ReadFrom(SnapshotReader* reader,
                         intptr_t object_id,
                         intptr_t tags,
@@ -1354,20 +1366,66 @@
   result.set_state_bits(reader->Read<int32_t>());
   result.set_lazy_deopt_pc_offset(-1);
 
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(result,
-                     result.raw()->from(), result.raw()->to_snapshot(),
-                     kAsReference);
-  for (RawObject** ptr = result.raw()->to();
-       ptr > result.raw()->to_snapshot();
-       ptr--) {
-    result.StorePointer(ptr, Object::null());
-  }
+  int32_t text_offset = reader->Read<int32_t>();
+  int32_t instructions_size = reader->Read<int32_t>();
+  uword entry_point = reader->GetInstructionsAt(text_offset);
 
-  // Fix entry point.
-  uword new_entry = result.EntryPoint();
-  ASSERT(Dart::vm_isolate()->heap()->CodeContains(new_entry));
-  result.StoreNonPointer(&result.raw_ptr()->entry_point_, new_entry);
+#if defined(DEBUG)
+  uword expected_check = reader->Read<uword>();
+  uword actual_check = Checksum(entry_point, instructions_size);
+  ASSERT(expected_check == actual_check);
+#endif
+
+  result.StoreNonPointer(&result.raw_ptr()->entry_point_, entry_point);
+
+  result.StorePointer(reinterpret_cast<RawSmi*const*>(
+                          &result.raw_ptr()->instructions_),
+                      Smi::New(instructions_size));
+
+  (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
+  result.StorePointer(reinterpret_cast<RawObject*const*>(
+                          &result.raw_ptr()->object_pool_),
+                      reader->PassiveObjectHandle()->raw());
+
+  (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
+  result.StorePointer(&result.raw_ptr()->owner_,
+                      reader->PassiveObjectHandle()->raw());
+
+  (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
+  result.StorePointer(reinterpret_cast<RawObject*const*>(
+                          &result.raw_ptr()->exception_handlers_),
+                      reader->PassiveObjectHandle()->raw());
+
+  (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
+  result.StorePointer(reinterpret_cast<RawObject*const*>(
+                          &result.raw_ptr()->pc_descriptors_),
+                      reader->PassiveObjectHandle()->raw());
+
+  (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
+  result.StorePointer(reinterpret_cast<RawObject*const*>(
+                          &result.raw_ptr()->code_source_map_),
+                      reader->PassiveObjectHandle()->raw());
+
+  (*reader->PassiveObjectHandle()) ^= reader->ReadObjectImpl(kAsReference);
+  result.StorePointer(reinterpret_cast<RawObject*const*>(
+                          &result.raw_ptr()->stackmaps_),
+                      reader->PassiveObjectHandle()->raw());
+
+  result.StorePointer(&result.raw_ptr()->deopt_info_array_,
+                      Array::null());
+  result.StorePointer(&result.raw_ptr()->static_calls_target_table_,
+                      Array::null());
+  result.StorePointer(&result.raw_ptr()->var_descriptors_,
+                      LocalVarDescriptors::null());
+  result.StorePointer(&result.raw_ptr()->inlined_metadata_,
+                      Array::null());
+  result.StorePointer(&result.raw_ptr()->comments_,
+                      Array::null());
+  result.StorePointer(&result.raw_ptr()->return_address_metadata_,
+                      Object::null());
+
+  ASSERT(result.Size() == instructions_size);
+  ASSERT(result.EntryPoint() == entry_point);
 
   return result.raw();
 }
@@ -1397,11 +1455,23 @@
   // Write out all the non object fields.
   writer->Write<int32_t>(ptr()->state_bits_);
 
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to_snapshot());
+  RawInstructions* instr = ptr()->instructions_;
+  intptr_t size = instr->ptr()->size_;
+  int32_t text_offset = writer->GetInstructionsId(instr, this);
+  writer->Write<int32_t>(text_offset);
+  writer->Write<int32_t>(size);
+#if defined(DEBUG)
+  uword entry = ptr()->entry_point_;
+  uword check = Checksum(entry, size);
+  writer->Write<uword>(check);
+#endif
 
-  writer->SetInstructionsCode(ptr()->instructions_, this);
+  writer->WriteObjectImpl(ptr()->object_pool_, kAsReference);
+  writer->WriteObjectImpl(ptr()->owner_, kAsReference);
+  writer->WriteObjectImpl(ptr()->exception_handlers_, kAsReference);
+  writer->WriteObjectImpl(ptr()->pc_descriptors_, kAsReference);
+  writer->WriteObjectImpl(ptr()->code_source_map_, kAsReference);
+  writer->WriteObjectImpl(ptr()->stackmaps_, kAsReference);
 }
 
 
@@ -1410,21 +1480,8 @@
                                         intptr_t tags,
                                         Snapshot::Kind kind,
                                         bool as_reference) {
-  ASSERT(reader->snapshot_code());
-  ASSERT(kind == Snapshot::kFull);
-
-#ifdef DEBUG
-  intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>());
-#else
-  intptr_t full_tags = 0;  // unused in release mode
-#endif
-  intptr_t offset = reader->Read<int32_t>();
-  Instructions& result =
-      Instructions::ZoneHandle(reader->zone(),
-                               reader->GetInstructionsAt(offset, full_tags));
-  reader->AddBackRef(object_id, &result, kIsDeserialized);
-
-  return result.raw();
+  UNREACHABLE();
+  return Instructions::null();
 }
 
 
@@ -1432,24 +1489,7 @@
                               intptr_t object_id,
                               Snapshot::Kind kind,
                               bool as_reference) {
-  ASSERT(writer->snapshot_code());
-  ASSERT(kind == Snapshot::kFull);
-
-  writer->WriteInlinedObjectHeader(object_id);
-  writer->WriteVMIsolateObject(kInstructionsCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-#ifdef DEBUG
-  // Instructions will be written pre-marked and in the VM heap. Write out
-  // the tags we expect to find when reading the snapshot for a sanity check
-  // that our offsets/alignment didn't get out of sync.
-  uword written_tags = writer->GetObjectTags(this);
-  written_tags = RawObject::VMHeapObjectTag::update(true, written_tags);
-  written_tags = RawObject::MarkBit::update(true, written_tags);
-  writer->Write<intptr_t>(written_tags);
-#endif
-
-  writer->Write<int32_t>(writer->GetInstructionsId(this));
+  UNREACHABLE();
 }
 
 
diff --git a/runtime/vm/scavenger_test.cc b/runtime/vm/scavenger_test.cc
index 1ab6bdf..9776cca 100644
--- a/runtime/vm/scavenger_test.cc
+++ b/runtime/vm/scavenger_test.cc
@@ -12,7 +12,7 @@
 // Expects to visit no objects (since the space should be empty).
 class FailingObjectVisitor : public ObjectVisitor {
  public:
-  FailingObjectVisitor() : ObjectVisitor(NULL) {}
+  FailingObjectVisitor() { }
   virtual void VisitObject(RawObject* obj) {
     EXPECT(false);
   }
@@ -30,7 +30,7 @@
 // Expects to visit no objects (since the space should be empty).
 class FailingFindObjectVisitor : public FindObjectVisitor {
  public:
-  FailingFindObjectVisitor() : FindObjectVisitor(NULL) {}
+  FailingFindObjectVisitor() { }
   virtual bool FindObject(RawObject* obj) const {
     EXPECT(false);
     return false;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index d346361..0caeb9c 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -2159,8 +2159,7 @@
   }
   js->PrintError(kInvalidParams,
                  "%s: invalid 'targetId' parameter: "
-                 "id '%s' does not correspond to a "
-                 "library, class, or instance", js->method(), target_id);
+                 "Cannot evaluate against a VM-internal object", js->method());
   return true;
 }
 
@@ -3404,8 +3403,7 @@
 
 class ContainsAddressVisitor : public FindObjectVisitor {
  public:
-  ContainsAddressVisitor(Isolate* isolate, uword addr)
-      : FindObjectVisitor(isolate), addr_(addr) { }
+  explicit ContainsAddressVisitor(uword addr) : addr_(addr) { }
   virtual ~ContainsAddressVisitor() { }
 
   virtual uword filter_addr() const { return addr_; }
@@ -3436,7 +3434,7 @@
   {
     NoSafepointScope no_safepoint;
     Isolate* isolate = thread->isolate();
-    ContainsAddressVisitor visitor(isolate, addr);
+    ContainsAddressVisitor visitor(addr);
     object = isolate->heap()->FindObject(&visitor);
   }
 
@@ -3446,7 +3444,7 @@
 
   {
     NoSafepointScope no_safepoint;
-    ContainsAddressVisitor visitor(Dart::vm_isolate(), addr);
+    ContainsAddressVisitor visitor(addr);
     object = Dart::vm_isolate()->heap()->FindObject(&visitor);
   }
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index ea0dce3..8d1fdcf 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1142,11 +1142,27 @@
 }
 
 
-int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions) {
-  intptr_t heap_size = instructions->Size();
+int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions,
+                                         RawCode* code) {
+#if defined(PRODUCT)
+  // Instructions are only dedup in product mode because it obfuscates profiler
+  // results.
+  for (intptr_t i = 0; i < instructions_.length(); i++) {
+    if (instructions_[i].raw_insns_ == instructions) {
+      return instructions_[i].offset_;
+    }
+  }
+#endif
+
+  intptr_t payload_size = instructions->ptr()->size_;
+  payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment());
+
   intptr_t offset = next_offset_;
-  next_offset_ += heap_size;
-  instructions_.Add(InstructionsData(instructions));
+  ASSERT(Utils::IsAligned(next_offset_, OS::PreferredCodeAlignment()));
+  next_offset_ += payload_size;
+  ASSERT(Utils::IsAligned(next_offset_, OS::PreferredCodeAlignment()));
+  instructions_.Add(InstructionsData(instructions, code, offset));
+
   return offset;
 }
 
@@ -1213,32 +1229,7 @@
 
     ASSERT(insns.raw()->Size() % sizeof(uint64_t) == 0);
 
-    {
-      // 1. Write from the header to the entry point.
-      NoSafepointScope no_safepoint;
-
-      uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
-      uword entry = beginning + Instructions::HeaderSize();
-
-      ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t)));
-      ASSERT(Utils::IsAligned(entry, sizeof(uint64_t)));
-
-      // Write Instructions with the mark and VM heap bits set.
-      uword marked_tags = insns.raw_ptr()->tags_;
-      marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
-      marked_tags = RawObject::MarkBit::update(true, marked_tags);
-
-      WriteWordLiteral(marked_tags);
-      beginning += sizeof(uword);
-
-      for (uword* cursor = reinterpret_cast<uword*>(beginning);
-           cursor < reinterpret_cast<uword*>(entry);
-           cursor++) {
-        WriteWordLiteral(*cursor);
-      }
-    }
-
-    // 2. Write a label at the entry point.
+    // 1. Write a label at the entry point.
     owner = code.owner();
     if (owner.IsNull()) {
       const char* name = StubCode::NameOfStub(insns.EntryPoint());
@@ -1257,11 +1248,13 @@
     }
 
     {
-      // 3. Write from the entry point to the end.
+      // 2. Write from the entry point to the end.
       NoSafepointScope no_safepoint;
       uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag;
       uword entry = beginning + Instructions::HeaderSize();
-      uword end = beginning + insns.raw()->Size();
+      uword payload_size = insns.size();
+      payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment());
+      uword end = entry + payload_size;
 
       ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t)));
       ASSERT(Utils::IsAligned(entry, sizeof(uint64_t)));
@@ -1313,27 +1306,9 @@
 }
 
 
-RawInstructions* InstructionsReader::GetInstructionsAt(int32_t offset,
-                                                       uword expected_tags) {
+uword InstructionsReader::GetInstructionsAt(int32_t offset) {
   ASSERT(Utils::IsAligned(offset, OS::PreferredCodeAlignment()));
-
-  RawInstructions* result =
-      reinterpret_cast<RawInstructions*>(
-          reinterpret_cast<uword>(instructions_buffer_) +
-          offset + kHeapObjectTag);
-
-#ifdef DEBUG
-  uword actual_tags = result->ptr()->tags_;
-  if (actual_tags != expected_tags) {
-    FATAL2("Instructions tag mismatch: expected %" Pd ", saw %" Pd,
-           expected_tags,
-           actual_tags);
-  }
-#endif
-
-  ASSERT(result->IsMarked());
-
-  return result;
+  return reinterpret_cast<uword>(instructions_buffer_) + offset;
 }
 
 
@@ -1870,13 +1845,11 @@
 class ScriptVisitor : public ObjectVisitor {
  public:
   explicit ScriptVisitor(Thread* thread) :
-      ObjectVisitor(thread->isolate()),
       objHandle_(Object::Handle(thread->zone())),
       count_(0),
       scripts_(NULL) {}
 
   ScriptVisitor(Thread* thread, const Array* scripts) :
-      ObjectVisitor(thread->isolate()),
       objHandle_(Object::Handle(thread->zone())),
       count_(0),
       scripts_(scripts) {}
@@ -2296,7 +2269,7 @@
 class WriteInlinedObjectVisitor : public ObjectVisitor {
  public:
   explicit WriteInlinedObjectVisitor(SnapshotWriter* writer)
-      : ObjectVisitor(Isolate::Current()), writer_(writer) {}
+      : writer_(writer) {}
 
   virtual void VisitObject(RawObject* obj) {
     intptr_t object_id = writer_->forward_list_->FindObject(obj);
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 7f6436b..25dab12 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -370,7 +370,7 @@
                             OS::PreferredCodeAlignment()));
   }
 
-  RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags);
+  uword GetInstructionsAt(int32_t offset);
   RawObject* GetObjectAt(int32_t offset);
 
  private:
@@ -483,8 +483,8 @@
   RawWeakProperty* NewWeakProperty();
   RawRegExp* NewRegExp();
 
-  RawInstructions* GetInstructionsAt(int32_t offset, uword expected_tags) {
-    return instructions_reader_->GetInstructionsAt(offset, expected_tags);
+  uword GetInstructionsAt(int32_t offset) {
+    return instructions_reader_->GetInstructionsAt(offset);
   }
 
   RawObject* GetObjectAt(int32_t offset) {
@@ -862,26 +862,18 @@
 
   intptr_t binary_size() { return binary_size_; }
 
-  int32_t GetOffsetFor(RawInstructions* instructions);
+  int32_t GetOffsetFor(RawInstructions* instructions, RawCode* code);
 
   int32_t GetObjectOffsetFor(RawObject* raw_object);
 
-  void SetInstructionsCode(RawInstructions* insns, RawCode* code) {
-    for (intptr_t i = 0; i < instructions_.length(); i++) {
-      if (instructions_[i].raw_insns_ == insns) {
-        instructions_[i].raw_code_ = code;
-        return;
-      }
-    }
-    UNREACHABLE();
-  }
-
   void WriteAssembly();
 
  private:
   struct InstructionsData {
-    explicit InstructionsData(RawInstructions* insns)
-        : raw_insns_(insns), raw_code_(NULL) { }
+    explicit InstructionsData(RawInstructions* insns,
+                              RawCode* code,
+                              intptr_t offset)
+        : raw_insns_(insns), raw_code_(code), offset_(offset) { }
 
     union {
       RawInstructions* raw_insns_;
@@ -891,6 +883,7 @@
       RawCode* raw_code_;
       const Code* code_;
     };
+    intptr_t offset_;
   };
 
   struct ObjectData {
@@ -970,18 +963,14 @@
 
   static intptr_t FirstObjectId();
 
-  int32_t GetInstructionsId(RawInstructions* instructions) {
-    return instructions_writer_->GetOffsetFor(instructions);
+  int32_t GetInstructionsId(RawInstructions* instructions, RawCode* code) {
+    return instructions_writer_->GetOffsetFor(instructions, code);
   }
 
   int32_t GetObjectId(RawObject* raw) {
     return instructions_writer_->GetObjectOffsetFor(raw);
   }
 
-  void SetInstructionsCode(RawInstructions* instructions, RawCode* code) {
-    return instructions_writer_->SetInstructionsCode(instructions, code);
-  }
-
   void WriteFunctionId(RawFunction* func, bool owner_is_class);
 
   RawFunction* IsSerializableClosure(RawClosure* closure);
@@ -1048,6 +1037,7 @@
   friend class RawArray;
   friend class RawClass;
   friend class RawClosureData;
+  friend class RawCode;
   friend class RawContextScope;
   friend class RawExceptionHandlers;
   friend class RawField;
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 4eb3da7..ebfe69e 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -28,7 +28,8 @@
   NoSafepointScope no_safepoint;
 #endif
   RawCode* code = GetCodeObject();
-  intptr_t cid = code->ptr()->owner_->GetClassId();
+  ASSERT(code != Object::null());
+  const intptr_t cid = code->ptr()->owner_->GetClassId();
   ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
   return cid == kNullCid || cid == kClassCid;
 }
@@ -100,8 +101,7 @@
     Array maps;
     maps = Array::null();
     Stackmap map;
-    const uword entry = reinterpret_cast<uword>(code.instructions()->ptr()) +
-                        Instructions::HeaderSize();
+    const uword entry = code.EntryPoint();
     map = code.GetStackmap(pc() - entry, &maps, &map);
     if (!map.IsNull()) {
       RawObject** first = reinterpret_cast<RawObject**>(sp());
@@ -150,6 +150,8 @@
       visitor->VisitPointers(first, last);
       return;
     }
+
+    // No stack map, fall through.
   }
   // For normal unoptimized Dart frames and Stub frames each slot
   // between the first and last included are tagged objects.
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index d90a3ab..fed306b 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -63,6 +63,7 @@
   V(Subtype2TestCache)                                                         \
   V(Subtype3TestCache)                                                         \
   V(CallClosureNoSuchMethod)                                                   \
+  V(FrameAwaitingMaterialization)                                              \
 
 // Is it permitted for the stubs above to refer to Object::null(), which is
 // allocated in the VM isolate and shared across all isolates.
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 9a31d42..e5a03c7 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -2179,6 +2179,11 @@
   __ Ret();
 }
 
+
+void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
+  __ bkpt(0);
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 22ee31f..bddf296 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -2232,6 +2232,11 @@
   __ ret();
 }
 
+
+void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
+  __ brk(0);
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 57820c8..2a4ed9b 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -2093,6 +2093,12 @@
   __ int3();
 }
 
+
+
+void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
+  __ int3();
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_IA32
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 1a13f74..7ae26bb 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -2345,6 +2345,11 @@
   __ Ret();
 }
 
+
+void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
+  __ break_(0);
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a8ed6ef..db210a1 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -2092,6 +2092,7 @@
           FieldAddress(RBX, MegamorphicCache::arguments_descriptor_offset()));
   __ movq(RDI, FieldAddress(RBX, MegamorphicCache::buckets_offset()));
   __ movq(R9, FieldAddress(RBX, MegamorphicCache::mask_offset()));
+  // R10: arguments descriptor (result).
   // RDI: cache buckets array.
   // RBX: mask.
   __ movq(RCX, RAX);
@@ -2219,6 +2220,11 @@
   __ ret();
 }
 
+
+void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
+  __ int3();
+}
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_X64
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index d35dc6d..bad8f74 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -375,8 +375,7 @@
    public:
     SymbolCollector(Thread* thread,
                     GrowableArray<String*>* symbols)
-        : ObjectVisitor(thread->isolate()),
-          symbols_(symbols),
+        : symbols_(symbols),
           zone_(thread->zone()) {}
 
     void VisitObject(RawObject* obj) {
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index fd176c2..9b36cd4 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -23,7 +23,6 @@
 namespace dart {
 
 
-DECLARE_FLAG(bool, trace_isolates);
 DECLARE_FLAG(bool, trace_service);
 DECLARE_FLAG(bool, trace_service_verbose);
 
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index 5f3d719..959b9ad 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -19,6 +19,7 @@
 #ifndef PRODUCT
 
 DEFINE_FLAG(bool, complete_timeline, false, "Record the complete timeline");
+DEFINE_FLAG(bool, startup_timeline, false, "Record the startup timeline");
 DEFINE_FLAG(bool, trace_timeline, false,
             "Trace timeline backend");
 DEFINE_FLAG(bool, trace_timeline_analysis, false,
@@ -111,7 +112,8 @@
 
 // Returns true if |streams| contains |stream| or "all". Not case sensitive.
 static bool HasStream(MallocGrowableArray<char*>* streams, const char* stream) {
-  if ((FLAG_timeline_dir != NULL) || FLAG_timing || FLAG_complete_timeline) {
+  if ((FLAG_timeline_dir != NULL) ||
+      FLAG_timing || FLAG_complete_timeline || FLAG_startup_timeline) {
     return true;
   }
   for (intptr_t i = 0; i < streams->length(); i++) {
@@ -134,6 +136,8 @@
       (FLAG_timeline_dir != NULL) || FLAG_timing || FLAG_complete_timeline;
   if (use_endless_recorder) {
     recorder_ = new TimelineEventEndlessRecorder();
+  } else if (FLAG_startup_timeline) {
+    recorder_ = new TimelineEventStartupRecorder();
   } else if (use_ring_recorder) {
     recorder_ = new TimelineEventRingRecorder();
   }
@@ -146,6 +150,11 @@
                         &stream_##name##_enabled_);
   TIMELINE_STREAM_LIST(TIMELINE_STREAM_FLAG_DEFAULT)
 #undef TIMELINE_STREAM_FLAG_DEFAULT
+
+  if (stream_Embedder_enabled_ &&
+      (Timeline::get_start_recording_cb() != NULL)) {
+    Timeline::get_start_recording_cb()();
+  }
 }
 
 
@@ -167,9 +176,16 @@
 
 void Timeline::Shutdown() {
   ASSERT(recorder_ != NULL);
+
+  if (stream_Embedder_enabled_ &&
+      (Timeline::get_stop_recording_cb() != NULL)) {
+    Timeline::get_stop_recording_cb()();
+  }
+
   if (FLAG_timeline_dir != NULL) {
     recorder_->WriteTo(FLAG_timeline_dir);
   }
+
   // Disable global streams.
 #define TIMELINE_STREAM_DISABLE(name, not_used)                                \
   stream_##name##_enabled_ = false;
@@ -1054,7 +1070,8 @@
 }
 
 
-TimelineEventRingRecorder::TimelineEventRingRecorder(intptr_t capacity)
+TimelineEventFixedBufferRecorder::TimelineEventFixedBufferRecorder(
+    intptr_t capacity)
     : blocks_(NULL),
       capacity_(capacity),
       num_blocks_(0),
@@ -1077,7 +1094,7 @@
 }
 
 
-TimelineEventRingRecorder::~TimelineEventRingRecorder() {
+TimelineEventFixedBufferRecorder::~TimelineEventFixedBufferRecorder() {
   // Delete all blocks.
   for (intptr_t i = 0; i < num_blocks_; i++) {
     TimelineEventBlock* block = blocks_[i];
@@ -1087,7 +1104,7 @@
 }
 
 
-void TimelineEventRingRecorder::PrintJSONEvents(
+void TimelineEventFixedBufferRecorder::PrintJSONEvents(
     JSONArray* events,
     TimelineEventFilter* filter) {
   if (!FLAG_support_service) {
@@ -1117,8 +1134,8 @@
 }
 
 
-void TimelineEventRingRecorder::PrintJSON(JSONStream* js,
-                                          TimelineEventFilter* filter) {
+void TimelineEventFixedBufferRecorder::PrintJSON(JSONStream* js,
+                                                 TimelineEventFilter* filter) {
   if (!FLAG_support_service) {
     return;
   }
@@ -1132,8 +1149,9 @@
 }
 
 
-void TimelineEventRingRecorder::PrintTraceEvent(JSONStream* js,
-                                                TimelineEventFilter* filter) {
+void TimelineEventFixedBufferRecorder::PrintTraceEvent(
+    JSONStream* js,
+    TimelineEventFilter* filter) {
   if (!FLAG_support_service) {
     return;
   }
@@ -1142,25 +1160,12 @@
 }
 
 
-TimelineEventBlock* TimelineEventRingRecorder::GetHeadBlockLocked() {
+TimelineEventBlock* TimelineEventFixedBufferRecorder::GetHeadBlockLocked() {
   return blocks_[0];
 }
 
 
-TimelineEventBlock* TimelineEventRingRecorder::GetNewBlockLocked() {
-  // TODO(johnmccutchan): This function should only hand out blocks
-  // which have been marked as finished.
-  if (block_cursor_ == num_blocks_) {
-    block_cursor_ = 0;
-  }
-  TimelineEventBlock* block = blocks_[block_cursor_++];
-  block->Reset();
-  block->Open();
-  return block;
-}
-
-
-void TimelineEventRingRecorder::Clear() {
+void TimelineEventFixedBufferRecorder::Clear() {
   MutexLocker ml(&lock_);
   for (intptr_t i = 0; i < num_blocks_; i++) {
     TimelineEventBlock* block = blocks_[i];
@@ -1169,7 +1174,7 @@
 }
 
 
-intptr_t TimelineEventRingRecorder::FindOldestBlockIndex() const {
+intptr_t TimelineEventFixedBufferRecorder::FindOldestBlockIndex() const {
   int64_t earliest_time = kMaxInt64;
   intptr_t earliest_index = -1;
   for (intptr_t block_idx = 0; block_idx < num_blocks_; block_idx++) {
@@ -1187,12 +1192,12 @@
 }
 
 
-TimelineEvent* TimelineEventRingRecorder::StartEvent() {
+TimelineEvent* TimelineEventFixedBufferRecorder::StartEvent() {
   return ThreadBlockStartEvent();
 }
 
 
-void TimelineEventRingRecorder::CompleteEvent(TimelineEvent* event) {
+void TimelineEventFixedBufferRecorder::CompleteEvent(TimelineEvent* event) {
   if (event == NULL) {
     return;
   }
@@ -1200,6 +1205,30 @@
 }
 
 
+TimelineEventBlock* TimelineEventRingRecorder::GetNewBlockLocked() {
+  // TODO(johnmccutchan): This function should only hand out blocks
+  // which have been marked as finished.
+  if (block_cursor_ == num_blocks_) {
+    block_cursor_ = 0;
+  }
+  TimelineEventBlock* block = blocks_[block_cursor_++];
+  block->Reset();
+  block->Open();
+  return block;
+}
+
+
+TimelineEventBlock* TimelineEventStartupRecorder::GetNewBlockLocked() {
+  if (block_cursor_ == num_blocks_) {
+    return NULL;
+  }
+  TimelineEventBlock* block = blocks_[block_cursor_++];
+  block->Reset();
+  block->Open();
+  return block;
+}
+
+
 TimelineEventCallbackRecorder::TimelineEventCallbackRecorder() {
 }
 
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index f16056e..0e0cf73 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -330,6 +330,7 @@
   friend class TimelineEventRecorder;
   friend class TimelineEventEndlessRecorder;
   friend class TimelineEventRingRecorder;
+  friend class TimelineEventStartupRecorder;
   friend class TimelineStream;
   friend class TimelineTestHelper;
   DISALLOW_COPY_AND_ASSIGN(TimelineEvent);
@@ -574,8 +575,9 @@
 
   friend class Thread;
   friend class TimelineEventRecorder;
-  friend class TimelineEventRingRecorder;
   friend class TimelineEventEndlessRecorder;
+  friend class TimelineEventRingRecorder;
+  friend class TimelineEventStartupRecorder;
   friend class TimelineTestHelper;
   friend class JSONStream;
 
@@ -689,26 +691,22 @@
 };
 
 
-// A recorder that stores events in a ring buffer of fixed capacity.
-class TimelineEventRingRecorder : public TimelineEventRecorder {
+// An abstract recorder that stores events in a buffer of fixed capacity.
+class TimelineEventFixedBufferRecorder : public TimelineEventRecorder {
  public:
   static const intptr_t kDefaultCapacity = 8192;
 
-  explicit TimelineEventRingRecorder(intptr_t capacity = kDefaultCapacity);
-  ~TimelineEventRingRecorder();
+  explicit TimelineEventFixedBufferRecorder(intptr_t capacity);
+  ~TimelineEventFixedBufferRecorder();
 
   void PrintJSON(JSONStream* js, TimelineEventFilter* filter);
   void PrintTraceEvent(JSONStream* js, TimelineEventFilter* filter);
-  const char* name() const {
-    return "ring";
-  }
 
  protected:
   TimelineEvent* StartEvent();
   void CompleteEvent(TimelineEvent* event);
   TimelineEventBlock* GetHeadBlockLocked();
   intptr_t FindOldestBlockIndex() const;
-  TimelineEventBlock* GetNewBlockLocked();
   void Clear();
 
   void PrintJSONEvents(JSONArray* array, TimelineEventFilter* filter);
@@ -720,6 +718,40 @@
 };
 
 
+// A recorder that stores events in a buffer of fixed capacity. When the buffer
+// is full, new events overwrite old events.
+class TimelineEventRingRecorder : public TimelineEventFixedBufferRecorder {
+ public:
+  explicit TimelineEventRingRecorder(intptr_t capacity = kDefaultCapacity)
+      : TimelineEventFixedBufferRecorder(capacity) {}
+  ~TimelineEventRingRecorder() {}
+
+  const char* name() const {
+    return "ring";
+  }
+
+ protected:
+  TimelineEventBlock* GetNewBlockLocked();
+};
+
+
+// A recorder that stores events in a buffer of fixed capacity. When the buffer
+// is full, new events are dropped.
+class TimelineEventStartupRecorder : public TimelineEventFixedBufferRecorder {
+ public:
+  explicit TimelineEventStartupRecorder(intptr_t capacity = kDefaultCapacity)
+      : TimelineEventFixedBufferRecorder(capacity) {}
+  ~TimelineEventStartupRecorder() {}
+
+  const char* name() const {
+    return "startup";
+  }
+
+ protected:
+  TimelineEventBlock* GetNewBlockLocked();
+};
+
+
 // An abstract recorder that calls |OnEvent| whenever an event is complete.
 // This should only be used for testing.
 class TimelineEventCallbackRecorder : public TimelineEventRecorder {
diff --git a/runtime/vm/verifier.cc b/runtime/vm/verifier.cc
index a9bbf01..78b4697 100644
--- a/runtime/vm/verifier.cc
+++ b/runtime/vm/verifier.cc
@@ -42,7 +42,7 @@
     }
   }
   allocated_set_->Add(raw_obj);
-  raw_obj->Validate(isolate());
+  raw_obj->Validate(isolate_);
 }
 
 
diff --git a/runtime/vm/verifier.h b/runtime/vm/verifier.h
index 99b6056..a34d7f6 100644
--- a/runtime/vm/verifier.h
+++ b/runtime/vm/verifier.h
@@ -30,7 +30,7 @@
   VerifyObjectVisitor(Isolate* isolate,
                      ObjectSet* allocated_set,
                      MarkExpectation mark_expectation)
-      : ObjectVisitor(isolate),
+      : isolate_(isolate),
         allocated_set_(allocated_set),
         mark_expectation_(mark_expectation) {
   }
@@ -38,6 +38,7 @@
   virtual void VisitObject(RawObject* obj);
 
  private:
+  Isolate* isolate_;
   ObjectSet* allocated_set_;
   MarkExpectation mark_expectation_;
 
diff --git a/runtime/vm/visitor.h b/runtime/vm/visitor.h
index 9e8780b..3b071e2 100644
--- a/runtime/vm/visitor.h
+++ b/runtime/vm/visitor.h
@@ -18,8 +18,8 @@
 // An object pointer visitor interface.
 class ObjectPointerVisitor {
  public:
-  explicit ObjectPointerVisitor(Isolate* isolate) : isolate_(isolate) {}
-  virtual ~ObjectPointerVisitor() {}
+  explicit ObjectPointerVisitor(Isolate* isolate) : isolate_(isolate) { }
+  virtual ~ObjectPointerVisitor() { }
 
   Isolate* isolate() const { return isolate_; }
 
@@ -48,18 +48,14 @@
 // An object visitor interface.
 class ObjectVisitor {
  public:
-  explicit ObjectVisitor(Isolate* isolate) : isolate_(isolate) {}
+  ObjectVisitor() { }
 
-  virtual ~ObjectVisitor() {}
-
-  Isolate* isolate() const { return isolate_; }
+  virtual ~ObjectVisitor() { }
 
   // Invoked for each object.
   virtual void VisitObject(RawObject* obj) = 0;
 
  private:
-  Isolate* isolate_;
-
   DISALLOW_COPY_AND_ASSIGN(ObjectVisitor);
 };
 
@@ -67,8 +63,8 @@
 // An object finder visitor interface.
 class FindObjectVisitor {
  public:
-  explicit FindObjectVisitor(Isolate* isolate) : isolate_(isolate) {}
-  virtual ~FindObjectVisitor() {}
+  FindObjectVisitor() { }
+  virtual ~FindObjectVisitor() { }
 
   // Allow to specify a address filter.
   virtual uword filter_addr() const { return 0; }
@@ -81,9 +77,7 @@
   virtual bool FindObject(RawObject* obj) const = 0;
 
  private:
-  Isolate* isolate_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(FindObjectVisitor);
+  DISALLOW_COPY_AND_ASSIGN(FindObjectVisitor);
 };
 
 }  // namespace dart
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 37471b9..4e302c9 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -733,652 +733,652 @@
 class BlinkANGLEInstancedArrays {
   static final instance = new BlinkANGLEInstancedArrays();
 
-  drawArraysInstancedANGLE_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstancedANGLE", [__arg_0, __arg_1]);
+  drawArraysInstancedANGLE_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "drawArraysInstancedANGLE", [__arg_0, __arg_1]);
 
-  drawArraysInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstancedANGLE", [__arg_0, __arg_1, __arg_2]);
+  drawArraysInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "drawArraysInstancedANGLE", [__arg_0, __arg_1, __arg_2]);
 
-  drawArraysInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawArraysInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "drawArraysInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawElementsInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2]);
+  drawElementsInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2]);
 
-  drawElementsInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawElementsInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawElementsInstancedANGLE_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  drawElementsInstancedANGLE_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribDivisorANGLE_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisorANGLE", []);
+  vertexAttribDivisorANGLE_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "vertexAttribDivisorANGLE", []);
 
-  vertexAttribDivisorANGLE_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisorANGLE", [__arg_0]);
+  vertexAttribDivisorANGLE_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "vertexAttribDivisorANGLE", [__arg_0]);
 
-  vertexAttribDivisorANGLE_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisorANGLE", [__arg_0, __arg_1]);
+  vertexAttribDivisorANGLE_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ANGLEInstancedArrays */, "vertexAttribDivisorANGLE", [__arg_0, __arg_1]);
 
 }
 
 class BlinkAbstractWorker {
   static final instance = new BlinkAbstractWorker();
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AbstractWorker */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AbstractWorker */, "onerror", __arg_0);
 
 }
 
 class BlinkAnalyserNode extends BlinkAudioNode {
   static final instance = new BlinkAnalyserNode();
 
-  fftSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fftSize");
+  fftSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnalyserNode */, "fftSize");
 
-  fftSize_Setter_(mthis, __arg_0) => mthis["fftSize"] = __arg_0;
+  fftSize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnalyserNode */, "fftSize", __arg_0);
 
-  frequencyBinCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frequencyBinCount");
+  frequencyBinCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnalyserNode */, "frequencyBinCount");
 
-  maxDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxDecibels");
+  maxDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnalyserNode */, "maxDecibels");
 
-  maxDecibels_Setter_(mthis, __arg_0) => mthis["maxDecibels"] = __arg_0;
+  maxDecibels_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnalyserNode */, "maxDecibels", __arg_0);
 
-  minDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minDecibels");
+  minDecibels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnalyserNode */, "minDecibels");
 
-  minDecibels_Setter_(mthis, __arg_0) => mthis["minDecibels"] = __arg_0;
+  minDecibels_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnalyserNode */, "minDecibels", __arg_0);
 
-  smoothingTimeConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "smoothingTimeConstant");
+  smoothingTimeConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnalyserNode */, "smoothingTimeConstant");
 
-  smoothingTimeConstant_Setter_(mthis, __arg_0) => mthis["smoothingTimeConstant"] = __arg_0;
+  smoothingTimeConstant_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnalyserNode */, "smoothingTimeConstant", __arg_0);
 
-  getByteFrequencyData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getByteFrequencyData", []);
+  getByteFrequencyData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getByteFrequencyData", []);
 
-  getByteFrequencyData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getByteFrequencyData", [__arg_0]);
+  getByteFrequencyData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getByteFrequencyData", [__arg_0]);
 
-  getByteTimeDomainData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getByteTimeDomainData", []);
+  getByteTimeDomainData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getByteTimeDomainData", []);
 
-  getByteTimeDomainData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getByteTimeDomainData", [__arg_0]);
+  getByteTimeDomainData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getByteTimeDomainData", [__arg_0]);
 
-  getFloatFrequencyData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFloatFrequencyData", []);
+  getFloatFrequencyData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getFloatFrequencyData", []);
 
-  getFloatFrequencyData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFloatFrequencyData", [__arg_0]);
+  getFloatFrequencyData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getFloatFrequencyData", [__arg_0]);
 
-  getFloatTimeDomainData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFloatTimeDomainData", []);
+  getFloatTimeDomainData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getFloatTimeDomainData", []);
 
-  getFloatTimeDomainData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFloatTimeDomainData", [__arg_0]);
+  getFloatTimeDomainData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AnalyserNode */, "getFloatTimeDomainData", [__arg_0]);
 
 }
 
 class BlinkAnimation extends BlinkEventTarget {
   static final instance = new BlinkAnimation();
 
-  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "currentTime");
 
-  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
+  currentTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Animation */, "currentTime", __arg_0);
 
-  effect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "effect");
+  effect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "effect");
 
-  effect_Setter_(mthis, __arg_0) => mthis["effect"] = __arg_0;
+  effect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Animation */, "effect", __arg_0);
 
-  endClip_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endClip");
+  endClip_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "endClip");
 
-  endClip_Setter_(mthis, __arg_0) => mthis["endClip"] = __arg_0;
+  endClip_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Animation */, "endClip", __arg_0);
 
-  finished_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "finished");
+  finished_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "finished");
 
-  onfinish_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfinish");
+  onfinish_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "onfinish");
 
-  onfinish_Setter_(mthis, __arg_0) => mthis["onfinish"] = __arg_0;
+  onfinish_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Animation */, "onfinish", __arg_0);
 
-  playState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playState");
+  playState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "playState");
 
-  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "playbackRate");
 
-  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+  playbackRate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Animation */, "playbackRate", __arg_0);
 
-  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ready");
+  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "ready");
 
-  startClip_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startClip");
+  startClip_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "startClip");
 
-  startClip_Setter_(mthis, __arg_0) => mthis["startClip"] = __arg_0;
+  startClip_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Animation */, "startClip", __arg_0);
 
-  startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startTime");
+  startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Animation */, "startTime");
 
-  startTime_Setter_(mthis, __arg_0) => mthis["startTime"] = __arg_0;
+  startTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Animation */, "startTime", __arg_0);
 
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Animation */, "cancel", []);
 
-  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Animation */, "finish", []);
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Animation */, "pause", []);
 
-  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
+  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Animation */, "play", []);
 
-  reverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reverse", []);
+  reverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Animation */, "reverse", []);
 
 }
 
 class BlinkAnimationEffectReadOnly {
   static final instance = new BlinkAnimationEffectReadOnly();
 
-  computedTiming_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "computedTiming");
+  computedTiming_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectReadOnly */, "computedTiming");
 
-  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timing");
+  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectReadOnly */, "timing");
 
 }
 
 class BlinkAnimationEffectTiming {
   static final instance = new BlinkAnimationEffectTiming();
 
-  delay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "delay");
+  delay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "delay");
 
-  delay_Setter_(mthis, __arg_0) => mthis["delay"] = __arg_0;
+  delay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "delay", __arg_0);
 
-  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
+  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "direction");
 
-  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
+  direction_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "direction", __arg_0);
 
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "duration");
 
-  duration_Setter_(mthis, __arg_0) => mthis["duration"] = __arg_0;
+  duration_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "duration", __arg_0);
 
-  easing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "easing");
+  easing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "easing");
 
-  easing_Setter_(mthis, __arg_0) => mthis["easing"] = __arg_0;
+  easing_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "easing", __arg_0);
 
-  endDelay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endDelay");
+  endDelay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "endDelay");
 
-  endDelay_Setter_(mthis, __arg_0) => mthis["endDelay"] = __arg_0;
+  endDelay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "endDelay", __arg_0);
 
-  fill_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fill");
+  fill_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "fill");
 
-  fill_Setter_(mthis, __arg_0) => mthis["fill"] = __arg_0;
+  fill_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "fill", __arg_0);
 
-  iterationStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iterationStart");
+  iterationStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "iterationStart");
 
-  iterationStart_Setter_(mthis, __arg_0) => mthis["iterationStart"] = __arg_0;
+  iterationStart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "iterationStart", __arg_0);
 
-  iterations_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iterations");
+  iterations_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "iterations");
 
-  iterations_Setter_(mthis, __arg_0) => mthis["iterations"] = __arg_0;
+  iterations_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "iterations", __arg_0);
 
-  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEffectTiming */, "playbackRate");
 
-  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+  playbackRate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationEffectTiming */, "playbackRate", __arg_0);
 
 }
 
 class BlinkAnimationEvent extends BlinkEvent {
   static final instance = new BlinkAnimationEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("AnimationEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("AnimationEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("AnimationEvent", [__arg_0, __arg_1]);
 
-  animationName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animationName");
+  animationName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEvent */, "animationName");
 
-  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elapsedTime");
+  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationEvent */, "elapsedTime");
 
 }
 
 class BlinkAnimationPlayerEvent extends BlinkEvent {
   static final instance = new BlinkAnimationPlayerEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationPlayerEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("AnimationPlayerEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationPlayerEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("AnimationPlayerEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AnimationPlayerEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("AnimationPlayerEvent", [__arg_0, __arg_1]);
 
-  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationPlayerEvent */, "currentTime");
 
-  timelineTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timelineTime");
+  timelineTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationPlayerEvent */, "timelineTime");
 
 }
 
 class BlinkAnimationTimeline {
   static final instance = new BlinkAnimationTimeline();
 
-  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationTimeline */, "currentTime");
 
-  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
+  currentTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationTimeline */, "currentTime", __arg_0);
 
-  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AnimationTimeline */, "playbackRate");
 
-  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+  playbackRate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AnimationTimeline */, "playbackRate", __arg_0);
 
-  getAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAnimations", []);
+  getAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AnimationTimeline */, "getAnimations", []);
 
-  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
+  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AnimationTimeline */, "play", []);
 
-  play_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "play", [__arg_0]);
+  play_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AnimationTimeline */, "play", [__arg_0]);
 
 }
 
 class BlinkAppBannerPromptResult {
   static final instance = new BlinkAppBannerPromptResult();
 
-  outcome_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outcome");
+  outcome_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AppBannerPromptResult */, "outcome");
 
-  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
+  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AppBannerPromptResult */, "platform");
 
 }
 
 class BlinkApplicationCache extends BlinkEventTarget {
   static final instance = new BlinkApplicationCache();
 
-  oncached_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncached");
+  oncached_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "oncached");
 
-  oncached_Setter_(mthis, __arg_0) => mthis["oncached"] = __arg_0;
+  oncached_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "oncached", __arg_0);
 
-  onchecking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchecking");
+  onchecking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "onchecking");
 
-  onchecking_Setter_(mthis, __arg_0) => mthis["onchecking"] = __arg_0;
+  onchecking_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "onchecking", __arg_0);
 
-  ondownloading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondownloading");
+  ondownloading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "ondownloading");
 
-  ondownloading_Setter_(mthis, __arg_0) => mthis["ondownloading"] = __arg_0;
+  ondownloading_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "ondownloading", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "onerror", __arg_0);
 
-  onnoupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnoupdate");
+  onnoupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "onnoupdate");
 
-  onnoupdate_Setter_(mthis, __arg_0) => mthis["onnoupdate"] = __arg_0;
+  onnoupdate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "onnoupdate", __arg_0);
 
-  onobsolete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onobsolete");
+  onobsolete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "onobsolete");
 
-  onobsolete_Setter_(mthis, __arg_0) => mthis["onobsolete"] = __arg_0;
+  onobsolete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "onobsolete", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "onprogress", __arg_0);
 
-  onupdateready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onupdateready");
+  onupdateready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "onupdateready");
 
-  onupdateready_Setter_(mthis, __arg_0) => mthis["onupdateready"] = __arg_0;
+  onupdateready_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ApplicationCache */, "onupdateready", __arg_0);
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCache */, "status");
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ApplicationCache */, "abort", []);
 
-  swapCache_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "swapCache", []);
+  swapCache_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ApplicationCache */, "swapCache", []);
 
-  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
+  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ApplicationCache */, "update", []);
 
 }
 
 class BlinkApplicationCacheErrorEvent extends BlinkEvent {
   static final instance = new BlinkApplicationCacheErrorEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ApplicationCacheErrorEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ApplicationCacheErrorEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ApplicationCacheErrorEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ApplicationCacheErrorEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ApplicationCacheErrorEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ApplicationCacheErrorEvent", [__arg_0, __arg_1]);
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCacheErrorEvent */, "message");
 
-  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reason");
+  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCacheErrorEvent */, "reason");
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCacheErrorEvent */, "status");
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ApplicationCacheErrorEvent */, "url");
 
 }
 
 class BlinkArrayBuffer {
   static final instance = new BlinkArrayBuffer();
 
-  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteLength");
+  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ArrayBuffer */, "byteLength");
 
 }
 
 class BlinkArrayBufferView {
   static final instance = new BlinkArrayBufferView();
 
-  buffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffer");
+  buffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ArrayBufferView */, "buffer");
 
-  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteLength");
+  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ArrayBufferView */, "byteLength");
 
-  byteOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteOffset");
+  byteOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ArrayBufferView */, "byteOffset");
 
 }
 
 class BlinkAttr extends BlinkNode {
   static final instance = new BlinkAttr();
 
-  localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localName");
+  localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "localName");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "name");
 
-  namespaceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "namespaceURI");
+  namespaceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "namespaceURI");
 
-  nodeValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nodeValue");
+  nodeValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "nodeValue");
 
-  nodeValue_Setter_(mthis, __arg_0) => mthis["nodeValue"] = __arg_0;
+  nodeValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Attr */, "nodeValue", __arg_0);
 
-  ownerElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerElement");
+  ownerElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "ownerElement");
 
-  prefix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "prefix");
+  prefix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "prefix");
 
-  specified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "specified");
+  specified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "specified");
 
-  textContent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textContent");
+  textContent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "textContent");
 
-  textContent_Setter_(mthis, __arg_0) => mthis["textContent"] = __arg_0;
+  textContent_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Attr */, "textContent", __arg_0);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Attr */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Attr */, "value", __arg_0);
 
 }
 
 class BlinkAudioBuffer {
   static final instance = new BlinkAudioBuffer();
 
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBuffer */, "duration");
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBuffer */, "length");
 
-  numberOfChannels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfChannels");
+  numberOfChannels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBuffer */, "numberOfChannels");
 
-  sampleRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sampleRate");
+  sampleRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBuffer */, "sampleRate");
 
-  copyFromChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", []);
+  copyFromChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyFromChannel", []);
 
-  copyFromChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", [__arg_0]);
+  copyFromChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyFromChannel", [__arg_0]);
 
-  copyFromChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", [__arg_0, __arg_1]);
+  copyFromChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyFromChannel", [__arg_0, __arg_1]);
 
-  copyFromChannel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyFromChannel", [__arg_0, __arg_1, __arg_2]);
+  copyFromChannel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyFromChannel", [__arg_0, __arg_1, __arg_2]);
 
-  copyToChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", []);
+  copyToChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyToChannel", []);
 
-  copyToChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", [__arg_0]);
+  copyToChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyToChannel", [__arg_0]);
 
-  copyToChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", [__arg_0, __arg_1]);
+  copyToChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyToChannel", [__arg_0, __arg_1]);
 
-  copyToChannel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyToChannel", [__arg_0, __arg_1, __arg_2]);
+  copyToChannel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "copyToChannel", [__arg_0, __arg_1, __arg_2]);
 
-  getChannelData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getChannelData", []);
+  getChannelData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "getChannelData", []);
 
-  getChannelData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getChannelData", [__arg_0]);
+  getChannelData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioBuffer */, "getChannelData", [__arg_0]);
 
 }
 
 class BlinkAudioBufferCallback {
   static final instance = new BlinkAudioBufferCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkAudioBufferSourceNode extends BlinkAudioSourceNode {
   static final instance = new BlinkAudioBufferSourceNode();
 
-  buffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffer");
+  buffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBufferSourceNode */, "buffer");
 
-  buffer_Setter_(mthis, __arg_0) => mthis["buffer"] = __arg_0;
+  buffer_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioBufferSourceNode */, "buffer", __arg_0);
 
-  detune_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detune");
+  detune_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBufferSourceNode */, "detune");
 
-  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loop");
+  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBufferSourceNode */, "loop");
 
-  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
+  loop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioBufferSourceNode */, "loop", __arg_0);
 
-  loopEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loopEnd");
+  loopEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBufferSourceNode */, "loopEnd");
 
-  loopEnd_Setter_(mthis, __arg_0) => mthis["loopEnd"] = __arg_0;
+  loopEnd_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioBufferSourceNode */, "loopEnd", __arg_0);
 
-  loopStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loopStart");
+  loopStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBufferSourceNode */, "loopStart");
 
-  loopStart_Setter_(mthis, __arg_0) => mthis["loopStart"] = __arg_0;
+  loopStart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioBufferSourceNode */, "loopStart", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBufferSourceNode */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioBufferSourceNode */, "onended", __arg_0);
 
-  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioBufferSourceNode */, "playbackRate");
 
-  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
+  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferSourceNode */, "start", []);
 
-  start_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "start", [__arg_0]);
+  start_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferSourceNode */, "start", [__arg_0]);
 
-  start_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "start", [__arg_0, __arg_1]);
+  start_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferSourceNode */, "start", [__arg_0, __arg_1]);
 
-  start_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "start", [__arg_0, __arg_1, __arg_2]);
+  start_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferSourceNode */, "start", [__arg_0, __arg_1, __arg_2]);
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferSourceNode */, "stop", []);
 
-  stop_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stop", [__arg_0]);
+  stop_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioBufferSourceNode */, "stop", [__arg_0]);
 
 }
 
 class BlinkAudioContext extends BlinkEventTarget {
   static final instance = new BlinkAudioContext();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AudioContext"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("AudioContext");
 
-  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioContext */, "currentTime");
 
-  destination_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "destination");
+  destination_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioContext */, "destination");
 
-  listener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "listener");
+  listener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioContext */, "listener");
 
-  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioContext */, "onstatechange");
 
-  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+  onstatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioContext */, "onstatechange", __arg_0);
 
-  sampleRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sampleRate");
+  sampleRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioContext */, "sampleRate");
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioContext */, "state");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "close", []);
 
-  createAnalyser_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAnalyser", []);
+  createAnalyser_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createAnalyser", []);
 
-  createBiquadFilter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBiquadFilter", []);
+  createBiquadFilter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createBiquadFilter", []);
 
-  createBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", [__arg_0]);
+  createBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createBuffer", [__arg_0]);
 
-  createBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", [__arg_0, __arg_1]);
+  createBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createBuffer", [__arg_0, __arg_1]);
 
-  createBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", [__arg_0, __arg_1, __arg_2]);
+  createBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createBuffer", [__arg_0, __arg_1, __arg_2]);
 
-  createBufferSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBufferSource", []);
+  createBufferSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createBufferSource", []);
 
-  createChannelMerger_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createChannelMerger", []);
+  createChannelMerger_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createChannelMerger", []);
 
-  createChannelMerger_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createChannelMerger", [__arg_0]);
+  createChannelMerger_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createChannelMerger", [__arg_0]);
 
-  createChannelSplitter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createChannelSplitter", []);
+  createChannelSplitter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createChannelSplitter", []);
 
-  createChannelSplitter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createChannelSplitter", [__arg_0]);
+  createChannelSplitter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createChannelSplitter", [__arg_0]);
 
-  createConvolver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createConvolver", []);
+  createConvolver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createConvolver", []);
 
-  createDelay_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDelay", []);
+  createDelay_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createDelay", []);
 
-  createDelay_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDelay", [__arg_0]);
+  createDelay_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createDelay", [__arg_0]);
 
-  createDynamicsCompressor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDynamicsCompressor", []);
+  createDynamicsCompressor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createDynamicsCompressor", []);
 
-  createGain_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createGain", []);
+  createGain_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createGain", []);
 
-  createMediaElementSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createMediaElementSource", []);
+  createMediaElementSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createMediaElementSource", []);
 
-  createMediaElementSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createMediaElementSource", [__arg_0]);
+  createMediaElementSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createMediaElementSource", [__arg_0]);
 
-  createMediaStreamDestination_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createMediaStreamDestination", []);
+  createMediaStreamDestination_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createMediaStreamDestination", []);
 
-  createMediaStreamSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createMediaStreamSource", []);
+  createMediaStreamSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createMediaStreamSource", []);
 
-  createMediaStreamSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createMediaStreamSource", [__arg_0]);
+  createMediaStreamSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createMediaStreamSource", [__arg_0]);
 
-  createOscillator_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createOscillator", []);
+  createOscillator_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createOscillator", []);
 
-  createPanner_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createPanner", []);
+  createPanner_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createPanner", []);
 
-  createPeriodicWave_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createPeriodicWave", []);
+  createPeriodicWave_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createPeriodicWave", []);
 
-  createPeriodicWave_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createPeriodicWave", [__arg_0]);
+  createPeriodicWave_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createPeriodicWave", [__arg_0]);
 
-  createPeriodicWave_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createPeriodicWave", [__arg_0, __arg_1]);
+  createPeriodicWave_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createPeriodicWave", [__arg_0, __arg_1]);
 
-  createScriptProcessor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createScriptProcessor", []);
+  createScriptProcessor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createScriptProcessor", []);
 
-  createScriptProcessor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createScriptProcessor", [__arg_0]);
+  createScriptProcessor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createScriptProcessor", [__arg_0]);
 
-  createScriptProcessor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createScriptProcessor", [__arg_0, __arg_1]);
+  createScriptProcessor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createScriptProcessor", [__arg_0, __arg_1]);
 
-  createScriptProcessor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createScriptProcessor", [__arg_0, __arg_1, __arg_2]);
+  createScriptProcessor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createScriptProcessor", [__arg_0, __arg_1, __arg_2]);
 
-  createStereoPanner_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createStereoPanner", []);
+  createStereoPanner_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createStereoPanner", []);
 
-  createWaveShaper_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWaveShaper", []);
+  createWaveShaper_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "createWaveShaper", []);
 
-  decodeAudioData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "decodeAudioData", []);
+  decodeAudioData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "decodeAudioData", []);
 
-  decodeAudioData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "decodeAudioData", [__arg_0]);
+  decodeAudioData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "decodeAudioData", [__arg_0]);
 
-  decodeAudioData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "decodeAudioData", [__arg_0, __arg_1]);
+  decodeAudioData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "decodeAudioData", [__arg_0, __arg_1]);
 
-  decodeAudioData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "decodeAudioData", [__arg_0, __arg_1, __arg_2]);
+  decodeAudioData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "decodeAudioData", [__arg_0, __arg_1, __arg_2]);
 
-  resume_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resume", []);
+  resume_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "resume", []);
 
-  suspend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "suspend", []);
+  suspend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioContext */, "suspend", []);
 
 }
 
 class BlinkAudioDestinationNode extends BlinkAudioNode {
   static final instance = new BlinkAudioDestinationNode();
 
-  maxChannelCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxChannelCount");
+  maxChannelCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioDestinationNode */, "maxChannelCount");
 
 }
 
 class BlinkAudioListener {
   static final instance = new BlinkAudioListener();
 
-  dopplerFactor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dopplerFactor");
+  dopplerFactor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioListener */, "dopplerFactor");
 
-  dopplerFactor_Setter_(mthis, __arg_0) => mthis["dopplerFactor"] = __arg_0;
+  dopplerFactor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioListener */, "dopplerFactor", __arg_0);
 
-  speedOfSound_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speedOfSound");
+  speedOfSound_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioListener */, "speedOfSound");
 
-  speedOfSound_Setter_(mthis, __arg_0) => mthis["speedOfSound"] = __arg_0;
+  speedOfSound_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioListener */, "speedOfSound", __arg_0);
 
-  setOrientation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  setOrientation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  setOrientation_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  setOrientation_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  setOrientation_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  setOrientation_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setOrientation", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  setPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0]);
+  setPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setPosition", [__arg_0]);
 
-  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0, __arg_1]);
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setPosition", [__arg_0, __arg_1]);
 
-  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0, __arg_1, __arg_2]);
+  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setPosition", [__arg_0, __arg_1, __arg_2]);
 
-  setVelocity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setVelocity", [__arg_0]);
+  setVelocity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setVelocity", [__arg_0]);
 
-  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setVelocity", [__arg_0, __arg_1]);
+  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setVelocity", [__arg_0, __arg_1]);
 
-  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setVelocity", [__arg_0, __arg_1, __arg_2]);
+  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioListener */, "setVelocity", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkAudioNode extends BlinkEventTarget {
   static final instance = new BlinkAudioNode();
 
-  channelCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channelCount");
+  channelCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioNode */, "channelCount");
 
-  channelCount_Setter_(mthis, __arg_0) => mthis["channelCount"] = __arg_0;
+  channelCount_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioNode */, "channelCount", __arg_0);
 
-  channelCountMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channelCountMode");
+  channelCountMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioNode */, "channelCountMode");
 
-  channelCountMode_Setter_(mthis, __arg_0) => mthis["channelCountMode"] = __arg_0;
+  channelCountMode_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioNode */, "channelCountMode", __arg_0);
 
-  channelInterpretation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channelInterpretation");
+  channelInterpretation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioNode */, "channelInterpretation");
 
-  channelInterpretation_Setter_(mthis, __arg_0) => mthis["channelInterpretation"] = __arg_0;
+  channelInterpretation_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioNode */, "channelInterpretation", __arg_0);
 
-  context_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "context");
+  context_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioNode */, "context");
 
-  numberOfInputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfInputs");
+  numberOfInputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioNode */, "numberOfInputs");
 
-  numberOfOutputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfOutputs");
+  numberOfOutputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioNode */, "numberOfOutputs");
 
-  connect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "connect", []);
+  connect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "connect", []);
 
-  connect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0]);
+  connect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "connect", [__arg_0]);
 
-  connect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0, __arg_1]);
+  connect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "connect", [__arg_0, __arg_1]);
 
-  connect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0, __arg_1, __arg_2]);
+  connect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "connect", [__arg_0, __arg_1, __arg_2]);
 
-  disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", []);
+  disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "disconnect", []);
 
-  disconnect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", [__arg_0]);
+  disconnect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "disconnect", [__arg_0]);
 
-  disconnect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", [__arg_0, __arg_1]);
+  disconnect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "disconnect", [__arg_0, __arg_1]);
 
-  disconnect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", [__arg_0, __arg_1, __arg_2]);
+  disconnect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioNode */, "disconnect", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkAudioParam {
   static final instance = new BlinkAudioParam();
 
-  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultValue");
+  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioParam */, "defaultValue");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioParam */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioParam */, "value", __arg_0);
 
-  cancelScheduledValues_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancelScheduledValues", []);
+  cancelScheduledValues_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "cancelScheduledValues", []);
 
-  cancelScheduledValues_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancelScheduledValues", [__arg_0]);
+  cancelScheduledValues_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "cancelScheduledValues", [__arg_0]);
 
-  exponentialRampToValueAtTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "exponentialRampToValueAtTime", []);
+  exponentialRampToValueAtTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "exponentialRampToValueAtTime", []);
 
-  exponentialRampToValueAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "exponentialRampToValueAtTime", [__arg_0]);
+  exponentialRampToValueAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "exponentialRampToValueAtTime", [__arg_0]);
 
-  exponentialRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "exponentialRampToValueAtTime", [__arg_0, __arg_1]);
+  exponentialRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "exponentialRampToValueAtTime", [__arg_0, __arg_1]);
 
-  linearRampToValueAtTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linearRampToValueAtTime", []);
+  linearRampToValueAtTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "linearRampToValueAtTime", []);
 
-  linearRampToValueAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linearRampToValueAtTime", [__arg_0]);
+  linearRampToValueAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "linearRampToValueAtTime", [__arg_0]);
 
-  linearRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "linearRampToValueAtTime", [__arg_0, __arg_1]);
+  linearRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "linearRampToValueAtTime", [__arg_0, __arg_1]);
 
-  setTargetAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTargetAtTime", [__arg_0]);
+  setTargetAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setTargetAtTime", [__arg_0]);
 
-  setTargetAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTargetAtTime", [__arg_0, __arg_1]);
+  setTargetAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setTargetAtTime", [__arg_0, __arg_1]);
 
-  setTargetAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setTargetAtTime", [__arg_0, __arg_1, __arg_2]);
+  setTargetAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setTargetAtTime", [__arg_0, __arg_1, __arg_2]);
 
-  setValueAtTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setValueAtTime", []);
+  setValueAtTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setValueAtTime", []);
 
-  setValueAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setValueAtTime", [__arg_0]);
+  setValueAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setValueAtTime", [__arg_0]);
 
-  setValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setValueAtTime", [__arg_0, __arg_1]);
+  setValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setValueAtTime", [__arg_0, __arg_1]);
 
-  setValueCurveAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setValueCurveAtTime", [__arg_0]);
+  setValueCurveAtTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setValueCurveAtTime", [__arg_0]);
 
-  setValueCurveAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setValueCurveAtTime", [__arg_0, __arg_1]);
+  setValueCurveAtTime_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setValueCurveAtTime", [__arg_0, __arg_1]);
 
-  setValueCurveAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setValueCurveAtTime", [__arg_0, __arg_1, __arg_2]);
+  setValueCurveAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* AudioParam */, "setValueCurveAtTime", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkAudioProcessingEvent extends BlinkEvent {
   static final instance = new BlinkAudioProcessingEvent();
 
-  inputBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputBuffer");
+  inputBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioProcessingEvent */, "inputBuffer");
 
-  outputBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outputBuffer");
+  outputBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioProcessingEvent */, "outputBuffer");
 
-  playbackTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackTime");
+  playbackTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioProcessingEvent */, "playbackTime");
 
 }
 
@@ -1390,272 +1390,272 @@
 class BlinkAudioTrack {
   static final instance = new BlinkAudioTrack();
 
-  enabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "enabled");
+  enabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrack */, "enabled");
 
-  enabled_Setter_(mthis, __arg_0) => mthis["enabled"] = __arg_0;
+  enabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioTrack */, "enabled", __arg_0);
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrack */, "id");
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrack */, "kind");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrack */, "label");
 
-  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrack */, "language");
 
 }
 
 class BlinkAudioTrackList extends BlinkEventTarget {
   static final instance = new BlinkAudioTrackList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrackList */, "length");
 
-  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
+  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrackList */, "onaddtrack");
 
-  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
+  onaddtrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioTrackList */, "onaddtrack", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrackList */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioTrackList */, "onchange", __arg_0);
 
-  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovetrack");
+  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AudioTrackList */, "onremovetrack");
 
-  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
+  onremovetrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AudioTrackList */, "onremovetrack", __arg_0);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioTrackList */, "__getter__", [__arg_0]);
 
-  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
+  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* AudioTrackList */, "getTrackById", []);
 
-  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
+  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* AudioTrackList */, "getTrackById", [__arg_0]);
 
 }
 
 class BlinkAutocompleteErrorEvent extends BlinkEvent {
   static final instance = new BlinkAutocompleteErrorEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AutocompleteErrorEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("AutocompleteErrorEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AutocompleteErrorEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("AutocompleteErrorEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "AutocompleteErrorEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("AutocompleteErrorEvent", [__arg_0, __arg_1]);
 
-  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reason");
+  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AutocompleteErrorEvent */, "reason");
 
 }
 
 class BlinkBarProp {
   static final instance = new BlinkBarProp();
 
-  visible_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "visible");
+  visible_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BarProp */, "visible");
 
 }
 
 class BlinkBatteryManager extends BlinkEventTarget {
   static final instance = new BlinkBatteryManager();
 
-  charging_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charging");
+  charging_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "charging");
 
-  chargingTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chargingTime");
+  chargingTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "chargingTime");
 
-  dischargingTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dischargingTime");
+  dischargingTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "dischargingTime");
 
-  level_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "level");
+  level_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "level");
 
-  onchargingchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchargingchange");
+  onchargingchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "onchargingchange");
 
-  onchargingchange_Setter_(mthis, __arg_0) => mthis["onchargingchange"] = __arg_0;
+  onchargingchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* BatteryManager */, "onchargingchange", __arg_0);
 
-  onchargingtimechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchargingtimechange");
+  onchargingtimechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "onchargingtimechange");
 
-  onchargingtimechange_Setter_(mthis, __arg_0) => mthis["onchargingtimechange"] = __arg_0;
+  onchargingtimechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* BatteryManager */, "onchargingtimechange", __arg_0);
 
-  ondischargingtimechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondischargingtimechange");
+  ondischargingtimechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "ondischargingtimechange");
 
-  ondischargingtimechange_Setter_(mthis, __arg_0) => mthis["ondischargingtimechange"] = __arg_0;
+  ondischargingtimechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* BatteryManager */, "ondischargingtimechange", __arg_0);
 
-  onlevelchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlevelchange");
+  onlevelchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BatteryManager */, "onlevelchange");
 
-  onlevelchange_Setter_(mthis, __arg_0) => mthis["onlevelchange"] = __arg_0;
+  onlevelchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* BatteryManager */, "onlevelchange", __arg_0);
 
 }
 
 class BlinkBeforeInstallPromptEvent extends BlinkEvent {
   static final instance = new BlinkBeforeInstallPromptEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "BeforeInstallPromptEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("BeforeInstallPromptEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "BeforeInstallPromptEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("BeforeInstallPromptEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "BeforeInstallPromptEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("BeforeInstallPromptEvent", [__arg_0, __arg_1]);
 
-  platforms_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platforms");
+  platforms_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BeforeInstallPromptEvent */, "platforms");
 
-  userChoice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userChoice");
+  userChoice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BeforeInstallPromptEvent */, "userChoice");
 
-  prompt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prompt", []);
+  prompt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* BeforeInstallPromptEvent */, "prompt", []);
 
 }
 
 class BlinkBeforeUnloadEvent extends BlinkEvent {
   static final instance = new BlinkBeforeUnloadEvent();
 
-  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
+  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BeforeUnloadEvent */, "returnValue");
 
-  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
+  returnValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* BeforeUnloadEvent */, "returnValue", __arg_0);
 
 }
 
 class BlinkBiquadFilterNode extends BlinkAudioNode {
   static final instance = new BlinkBiquadFilterNode();
 
-  Q_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "Q");
+  Q_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BiquadFilterNode */, "Q");
 
-  detune_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detune");
+  detune_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BiquadFilterNode */, "detune");
 
-  frequency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frequency");
+  frequency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BiquadFilterNode */, "frequency");
 
-  gain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gain");
+  gain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BiquadFilterNode */, "gain");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BiquadFilterNode */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* BiquadFilterNode */, "type", __arg_0);
 
-  getFrequencyResponse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFrequencyResponse", [__arg_0]);
+  getFrequencyResponse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* BiquadFilterNode */, "getFrequencyResponse", [__arg_0]);
 
-  getFrequencyResponse_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFrequencyResponse", [__arg_0, __arg_1]);
+  getFrequencyResponse_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* BiquadFilterNode */, "getFrequencyResponse", [__arg_0, __arg_1]);
 
-  getFrequencyResponse_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFrequencyResponse", [__arg_0, __arg_1, __arg_2]);
+  getFrequencyResponse_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* BiquadFilterNode */, "getFrequencyResponse", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkBlob {
   static final instance = new BlinkBlob();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Blob");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Blob", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("Blob", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Blob"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("Blob", [__arg_0, __arg_1, __arg_2]);
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Blob */, "size");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Blob */, "type");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Blob */, "close", []);
 
-  slice_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "slice", []);
+  slice_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Blob */, "slice", []);
 
-  slice_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "slice", [__arg_0]);
+  slice_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Blob */, "slice", [__arg_0]);
 
-  slice_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "slice", [__arg_0, __arg_1]);
+  slice_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Blob */, "slice", [__arg_0, __arg_1]);
 
-  slice_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "slice", [__arg_0, __arg_1, __arg_2]);
+  slice_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Blob */, "slice", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkBluetooth {
   static final instance = new BlinkBluetooth();
 
-  requestDevice_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestDevice", []);
+  requestDevice_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Bluetooth */, "requestDevice", []);
 
-  requestDevice_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestDevice", [__arg_0]);
+  requestDevice_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Bluetooth */, "requestDevice", [__arg_0]);
 
 }
 
 class BlinkBluetoothDevice {
   static final instance = new BlinkBluetoothDevice();
 
-  deviceClass_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deviceClass");
+  deviceClass_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "deviceClass");
 
-  instanceID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "instanceID");
+  instanceID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "instanceID");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "name");
 
-  paired_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paired");
+  paired_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "paired");
 
-  productID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "productID");
+  productID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "productID");
 
-  productVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "productVersion");
+  productVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "productVersion");
 
-  vendorID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendorID");
+  vendorID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "vendorID");
 
-  vendorIDSource_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendorIDSource");
+  vendorIDSource_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothDevice */, "vendorIDSource");
 
-  connectGATT_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "connectGATT", []);
+  connectGATT_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothDevice */, "connectGATT", []);
 
 }
 
 class BlinkBluetoothGATTCharacteristic {
   static final instance = new BlinkBluetoothGATTCharacteristic();
 
-  uuid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "uuid");
+  uuid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothGATTCharacteristic */, "uuid");
 
-  readValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readValue", []);
+  readValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothGATTCharacteristic */, "readValue", []);
 
-  writeValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "writeValue", []);
+  writeValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothGATTCharacteristic */, "writeValue", []);
 
-  writeValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "writeValue", [__arg_0]);
+  writeValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothGATTCharacteristic */, "writeValue", [__arg_0]);
 
 }
 
 class BlinkBluetoothGATTRemoteServer {
   static final instance = new BlinkBluetoothGATTRemoteServer();
 
-  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connected");
+  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothGATTRemoteServer */, "connected");
 
-  getPrimaryService_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getPrimaryService", []);
+  getPrimaryService_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothGATTRemoteServer */, "getPrimaryService", []);
 
-  getPrimaryService_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getPrimaryService", [__arg_0]);
+  getPrimaryService_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothGATTRemoteServer */, "getPrimaryService", [__arg_0]);
 
 }
 
 class BlinkBluetoothGATTService {
   static final instance = new BlinkBluetoothGATTService();
 
-  isPrimary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isPrimary");
+  isPrimary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothGATTService */, "isPrimary");
 
-  uuid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "uuid");
+  uuid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* BluetoothGATTService */, "uuid");
 
-  getCharacteristic_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCharacteristic", []);
+  getCharacteristic_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothGATTService */, "getCharacteristic", []);
 
-  getCharacteristic_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCharacteristic", [__arg_0]);
+  getCharacteristic_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* BluetoothGATTService */, "getCharacteristic", [__arg_0]);
 
 }
 
 class BlinkBluetoothUUID {
   static final instance = new BlinkBluetoothUUID();
 
-  canonicalUUID_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "canonicalUUID", []);
+  canonicalUUID_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "canonicalUUID", []);
 
-  canonicalUUID_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "canonicalUUID", [__arg_0]);
+  canonicalUUID_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "canonicalUUID", [__arg_0]);
 
-  getCharacteristic_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getCharacteristic", []);
+  getCharacteristic_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "getCharacteristic", []);
 
-  getCharacteristic_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getCharacteristic", [__arg_0]);
+  getCharacteristic_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "getCharacteristic", [__arg_0]);
 
-  getDescriptor_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getDescriptor", []);
+  getDescriptor_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "getDescriptor", []);
 
-  getDescriptor_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getDescriptor", [__arg_0]);
+  getDescriptor_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "getDescriptor", [__arg_0]);
 
-  getService_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getService", []);
+  getService_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "getService", []);
 
-  getService_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID"), "getService", [__arg_0]);
+  getService_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "BluetoothUUID") /* BluetoothUUID */, "getService", [__arg_0]);
 
 }
 
 class BlinkBody {
   static final instance = new BlinkBody();
 
-  bodyUsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bodyUsed");
+  bodyUsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Body */, "bodyUsed");
 
-  arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "arrayBuffer", []);
+  arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Body */, "arrayBuffer", []);
 
-  blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blob", []);
+  blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Body */, "blob", []);
 
-  json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "json", []);
+  json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Body */, "json", []);
 
-  text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "text", []);
+  text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Body */, "text", []);
 
 }
 
@@ -1667,37 +1667,37 @@
 class BlinkCHROMIUMSubscribeUniform {
   static final instance = new BlinkCHROMIUMSubscribeUniform();
 
-  bindValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindValuebufferCHROMIUM", []);
+  bindValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "bindValuebufferCHROMIUM", []);
 
-  bindValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindValuebufferCHROMIUM", [__arg_0]);
+  bindValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "bindValuebufferCHROMIUM", [__arg_0]);
 
-  bindValuebufferCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindValuebufferCHROMIUM", [__arg_0, __arg_1]);
+  bindValuebufferCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "bindValuebufferCHROMIUM", [__arg_0, __arg_1]);
 
-  createValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createValuebufferCHROMIUM", []);
+  createValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "createValuebufferCHROMIUM", []);
 
-  deleteValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteValuebufferCHROMIUM", []);
+  deleteValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "deleteValuebufferCHROMIUM", []);
 
-  deleteValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteValuebufferCHROMIUM", [__arg_0]);
+  deleteValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "deleteValuebufferCHROMIUM", [__arg_0]);
 
-  isValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isValuebufferCHROMIUM", []);
+  isValuebufferCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "isValuebufferCHROMIUM", []);
 
-  isValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isValuebufferCHROMIUM", [__arg_0]);
+  isValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "isValuebufferCHROMIUM", [__arg_0]);
 
-  populateSubscribedValuesCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "populateSubscribedValuesCHROMIUM", []);
+  populateSubscribedValuesCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "populateSubscribedValuesCHROMIUM", []);
 
-  populateSubscribedValuesCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "populateSubscribedValuesCHROMIUM", [__arg_0]);
+  populateSubscribedValuesCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "populateSubscribedValuesCHROMIUM", [__arg_0]);
 
-  subscribeValueCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "subscribeValueCHROMIUM", []);
+  subscribeValueCHROMIUM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "subscribeValueCHROMIUM", []);
 
-  subscribeValueCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "subscribeValueCHROMIUM", [__arg_0]);
+  subscribeValueCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "subscribeValueCHROMIUM", [__arg_0]);
 
-  subscribeValueCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "subscribeValueCHROMIUM", [__arg_0, __arg_1]);
+  subscribeValueCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "subscribeValueCHROMIUM", [__arg_0, __arg_1]);
 
-  uniformValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformValuebufferCHROMIUM", [__arg_0]);
+  uniformValuebufferCHROMIUM_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "uniformValuebufferCHROMIUM", [__arg_0]);
 
-  uniformValuebufferCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformValuebufferCHROMIUM", [__arg_0, __arg_1]);
+  uniformValuebufferCHROMIUM_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "uniformValuebufferCHROMIUM", [__arg_0, __arg_1]);
 
-  uniformValuebufferCHROMIUM_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformValuebufferCHROMIUM", [__arg_0, __arg_1, __arg_2]);
+  uniformValuebufferCHROMIUM_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CHROMIUMSubscribeUniform */, "uniformValuebufferCHROMIUM", [__arg_0, __arg_1, __arg_2]);
 
 }
 
@@ -1709,724 +1709,724 @@
 class BlinkCSS {
   static final instance = new BlinkCSS();
 
-  supports_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS"), "supports", []);
+  supports_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS") /* CSS */, "supports", []);
 
-  supports_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS"), "supports", [__arg_0]);
+  supports_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS") /* CSS */, "supports", [__arg_0]);
 
-  supports_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS"), "supports", [__arg_0, __arg_1]);
+  supports_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "CSS") /* CSS */, "supports", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCSSCharsetRule extends BlinkCSSRule {
   static final instance = new BlinkCSSCharsetRule();
 
-  encoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "encoding");
+  encoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSCharsetRule */, "encoding");
 
-  encoding_Setter_(mthis, __arg_0) => mthis["encoding"] = __arg_0;
+  encoding_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CSSCharsetRule */, "encoding", __arg_0);
 
 }
 
 class BlinkCSSFontFaceRule extends BlinkCSSRule {
   static final instance = new BlinkCSSFontFaceRule();
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSFontFaceRule */, "style");
 
 }
 
 class BlinkCSSGroupingRule extends BlinkCSSRule {
   static final instance = new BlinkCSSGroupingRule();
 
-  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSGroupingRule */, "cssRules");
 
-  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
+  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSGroupingRule */, "deleteRule", []);
 
-  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", [__arg_0]);
+  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSGroupingRule */, "deleteRule", [__arg_0]);
 
-  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", []);
+  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSGroupingRule */, "insertRule", []);
 
-  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0]);
+  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSGroupingRule */, "insertRule", [__arg_0]);
 
-  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0, __arg_1]);
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CSSGroupingRule */, "insertRule", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCSSImportRule extends BlinkCSSRule {
   static final instance = new BlinkCSSImportRule();
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSImportRule */, "href");
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSImportRule */, "media");
 
-  styleSheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleSheet");
+  styleSheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSImportRule */, "styleSheet");
 
 }
 
 class BlinkCSSKeyframeRule extends BlinkCSSRule {
   static final instance = new BlinkCSSKeyframeRule();
 
-  keyText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyText");
+  keyText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSKeyframeRule */, "keyText");
 
-  keyText_Setter_(mthis, __arg_0) => mthis["keyText"] = __arg_0;
+  keyText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CSSKeyframeRule */, "keyText", __arg_0);
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSKeyframeRule */, "style");
 
 }
 
 class BlinkCSSKeyframesRule extends BlinkCSSRule {
   static final instance = new BlinkCSSKeyframesRule();
 
-  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSKeyframesRule */, "cssRules");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSKeyframesRule */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CSSKeyframesRule */, "name", __arg_0);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSKeyframesRule */, "__getter__", [__arg_0]);
 
-  appendRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendRule", []);
+  appendRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSKeyframesRule */, "appendRule", []);
 
-  appendRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendRule", [__arg_0]);
+  appendRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSKeyframesRule */, "appendRule", [__arg_0]);
 
-  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
+  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSKeyframesRule */, "deleteRule", []);
 
-  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", [__arg_0]);
+  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSKeyframesRule */, "deleteRule", [__arg_0]);
 
-  findRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "findRule", []);
+  findRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSKeyframesRule */, "findRule", []);
 
-  findRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "findRule", [__arg_0]);
+  findRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSKeyframesRule */, "findRule", [__arg_0]);
 
 }
 
 class BlinkCSSMediaRule extends BlinkCSSGroupingRule {
   static final instance = new BlinkCSSMediaRule();
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSMediaRule */, "media");
 
 }
 
 class BlinkCSSPageRule extends BlinkCSSRule {
   static final instance = new BlinkCSSPageRule();
 
-  selectorText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectorText");
+  selectorText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSPageRule */, "selectorText");
 
-  selectorText_Setter_(mthis, __arg_0) => mthis["selectorText"] = __arg_0;
+  selectorText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CSSPageRule */, "selectorText", __arg_0);
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSPageRule */, "style");
 
 }
 
 class BlinkCSSRule {
   static final instance = new BlinkCSSRule();
 
-  cssText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssText");
+  cssText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSRule */, "cssText");
 
-  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
+  cssText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CSSRule */, "cssText", __arg_0);
 
-  parentRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentRule");
+  parentRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSRule */, "parentRule");
 
-  parentStyleSheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentStyleSheet");
+  parentStyleSheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSRule */, "parentStyleSheet");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSRule */, "type");
 
 }
 
 class BlinkCSSRuleList {
   static final instance = new BlinkCSSRuleList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSRuleList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSRuleList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSRuleList */, "item", [__arg_0]);
 
 }
 
 class BlinkCSSStyleDeclaration {
   static final instance = new BlinkCSSStyleDeclaration();
 
-  cssText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssText");
+  cssText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleDeclaration */, "cssText");
 
-  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
+  cssText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CSSStyleDeclaration */, "cssText", __arg_0);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleDeclaration */, "length");
 
-  parentRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentRule");
+  parentRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleDeclaration */, "parentRule");
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "__getter__", [__arg_0]);
 
-  $__propertyQuery___Callback_1_(mthis, __arg_0) => mthis[__arg_0];
+  $__propertyQuery___Callback_1_(mthis, __arg_0) native "Blink_Operation_PQ_CSSStyleDeclaration";
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "__setter__", [__arg_0, __arg_1]);
 
-  getPropertyPriority_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getPropertyPriority", []);
+  getPropertyPriority_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "getPropertyPriority", []);
 
-  getPropertyPriority_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getPropertyPriority", [__arg_0]);
+  getPropertyPriority_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "getPropertyPriority", [__arg_0]);
 
-  getPropertyValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getPropertyValue", []);
+  getPropertyValue_Callback_0_(mthis) native "Blink_Operation_0_CSSStyleDeclaration_getPropertyValue";
 
-  getPropertyValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getPropertyValue", [__arg_0]);
+  getPropertyValue_Callback_1_(mthis, __arg_0) native "Blink_Operation_CSSStyleDeclaration_getPropertyValue"; /* __arg_0 */
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "item", [__arg_0]);
 
-  removeProperty_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeProperty", []);
+  removeProperty_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "removeProperty", []);
 
-  removeProperty_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeProperty", [__arg_0]);
+  removeProperty_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleDeclaration */, "removeProperty", [__arg_0]);
 
-  setProperty_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setProperty", [__arg_0]);
+  setProperty_Callback_1_(mthis, __arg_0) native "Blink_Operation_CSSStyleDeclaration_setProperty"; /* __arg_0 */
 
-  setProperty_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setProperty", [__arg_0, __arg_1]);
+  setProperty_Callback_2_(mthis, __arg_0, __arg_1) native "Blink_Operation_CSSStyleDeclaration_setProperty"; /* __arg_0, __arg_1 */
 
-  setProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setProperty", [__arg_0, __arg_1, __arg_2]);
+  setProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) native "Blink_Operation_CSSStyleDeclaration_setProperty"; /* __arg_0, __arg_1, __arg_2 */
 
 }
 
 class BlinkCSSStyleRule extends BlinkCSSRule {
   static final instance = new BlinkCSSStyleRule();
 
-  selectorText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectorText");
+  selectorText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleRule */, "selectorText");
 
-  selectorText_Setter_(mthis, __arg_0) => mthis["selectorText"] = __arg_0;
+  selectorText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CSSStyleRule */, "selectorText", __arg_0);
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleRule */, "style");
 
 }
 
 class BlinkCSSStyleSheet extends BlinkStyleSheet {
   static final instance = new BlinkCSSStyleSheet();
 
-  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleSheet */, "cssRules");
 
-  ownerRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerRule");
+  ownerRule_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleSheet */, "ownerRule");
 
-  rules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rules");
+  rules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSStyleSheet */, "rules");
 
-  addRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRule", []);
+  addRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "addRule", []);
 
-  addRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRule", [__arg_0]);
+  addRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "addRule", [__arg_0]);
 
-  addRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addRule", [__arg_0, __arg_1]);
+  addRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "addRule", [__arg_0, __arg_1]);
 
-  addRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addRule", [__arg_0, __arg_1, __arg_2]);
+  addRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "addRule", [__arg_0, __arg_1, __arg_2]);
 
-  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
+  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "deleteRule", []);
 
-  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", [__arg_0]);
+  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "deleteRule", [__arg_0]);
 
-  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", []);
+  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "insertRule", []);
 
-  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0]);
+  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "insertRule", [__arg_0]);
 
-  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0, __arg_1]);
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "insertRule", [__arg_0, __arg_1]);
 
-  removeRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeRule", []);
+  removeRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "removeRule", []);
 
-  removeRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeRule", [__arg_0]);
+  removeRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSStyleSheet */, "removeRule", [__arg_0]);
 
 }
 
 class BlinkCSSSupportsRule extends BlinkCSSRule {
   static final instance = new BlinkCSSSupportsRule();
 
-  conditionText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "conditionText");
+  conditionText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSSupportsRule */, "conditionText");
 
-  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cssRules");
+  cssRules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSSupportsRule */, "cssRules");
 
-  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", []);
+  deleteRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSSupportsRule */, "deleteRule", []);
 
-  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRule", [__arg_0]);
+  deleteRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSSupportsRule */, "deleteRule", [__arg_0]);
 
-  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", []);
+  insertRule_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CSSSupportsRule */, "insertRule", []);
 
-  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0]);
+  insertRule_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CSSSupportsRule */, "insertRule", [__arg_0]);
 
-  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertRule", [__arg_0, __arg_1]);
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CSSSupportsRule */, "insertRule", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCSSViewportRule extends BlinkCSSRule {
   static final instance = new BlinkCSSViewportRule();
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CSSViewportRule */, "style");
 
 }
 
 class BlinkCache {
   static final instance = new BlinkCache();
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "add", [__arg_0]);
 
-  addAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addAll", []);
+  addAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "addAll", []);
 
-  addAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addAll", [__arg_0]);
+  addAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "addAll", [__arg_0]);
 
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "delete", []);
 
-  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
+  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "delete", [__arg_0]);
 
-  delete_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0, __arg_1]);
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "delete", [__arg_0, __arg_1]);
 
-  keys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "keys", []);
+  keys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "keys", []);
 
-  keys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "keys", [__arg_0]);
+  keys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "keys", [__arg_0]);
 
-  keys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "keys", [__arg_0, __arg_1]);
+  keys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "keys", [__arg_0, __arg_1]);
 
-  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "match", []);
+  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "match", []);
 
-  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0]);
+  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "match", [__arg_0]);
 
-  match_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0, __arg_1]);
+  match_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "match", [__arg_0, __arg_1]);
 
-  put_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "put", []);
+  put_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "put", []);
 
-  put_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "put", [__arg_0]);
+  put_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "put", [__arg_0]);
 
-  put_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "put", [__arg_0, __arg_1]);
+  put_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Cache */, "put", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCacheStorage {
   static final instance = new BlinkCacheStorage();
 
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "delete", []);
 
-  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
+  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "delete", [__arg_0]);
 
-  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
+  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "has", []);
 
-  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
+  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "has", [__arg_0]);
 
-  keys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "keys", []);
+  keys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "keys", []);
 
-  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "match", []);
+  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "match", []);
 
-  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0]);
+  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "match", [__arg_0]);
 
-  match_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0, __arg_1]);
+  match_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "match", [__arg_0, __arg_1]);
 
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "open", []);
 
-  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
+  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CacheStorage */, "open", [__arg_0]);
 
 }
 
 class BlinkCanvasGradient {
   static final instance = new BlinkCanvasGradient();
 
-  addColorStop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addColorStop", []);
+  addColorStop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasGradient */, "addColorStop", []);
 
-  addColorStop_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addColorStop", [__arg_0]);
+  addColorStop_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasGradient */, "addColorStop", [__arg_0]);
 
-  addColorStop_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addColorStop", [__arg_0, __arg_1]);
+  addColorStop_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasGradient */, "addColorStop", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCanvasPathMethods {
   static final instance = new BlinkCanvasPathMethods();
 
-  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2]);
 
-  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePath", []);
+  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "closePath", []);
 
-  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", []);
+  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", []);
 
-  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0]);
+  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", [__arg_0]);
 
-  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0, __arg_1]);
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", [__arg_0, __arg_1]);
 
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", []);
 
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", [__arg_0]);
 
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", [__arg_0, __arg_1]);
 
-  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1]);
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1]);
 
-  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
 
-  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1]);
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1]);
 
-  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2]);
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1, __arg_2]);
 
-  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkCanvasPattern {
   static final instance = new BlinkCanvasPattern();
 
-  setTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTransform", []);
+  setTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPattern */, "setTransform", []);
 
-  setTransform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTransform", [__arg_0]);
+  setTransform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPattern */, "setTransform", [__arg_0]);
 
 }
 
 class BlinkCanvasRenderingContext2D {
   static final instance = new BlinkCanvasRenderingContext2D();
 
-  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "canvas");
 
-  currentTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTransform");
+  currentTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "currentTransform");
 
-  currentTransform_Setter_(mthis, __arg_0) => mthis["currentTransform"] = __arg_0;
+  currentTransform_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "currentTransform", __arg_0);
 
-  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
+  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "direction");
 
-  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
+  direction_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "direction", __arg_0);
 
-  fillStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fillStyle");
+  fillStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "fillStyle");
 
-  fillStyle_Setter_(mthis, __arg_0) => mthis["fillStyle"] = __arg_0;
+  fillStyle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "fillStyle", __arg_0);
 
-  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filter");
+  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "filter");
 
-  filter_Setter_(mthis, __arg_0) => mthis["filter"] = __arg_0;
+  filter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "filter", __arg_0);
 
-  font_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "font");
+  font_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "font");
 
-  font_Setter_(mthis, __arg_0) => mthis["font"] = __arg_0;
+  font_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "font", __arg_0);
 
-  globalAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "globalAlpha");
+  globalAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "globalAlpha");
 
-  globalAlpha_Setter_(mthis, __arg_0) => mthis["globalAlpha"] = __arg_0;
+  globalAlpha_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "globalAlpha", __arg_0);
 
-  globalCompositeOperation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "globalCompositeOperation");
+  globalCompositeOperation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "globalCompositeOperation");
 
-  globalCompositeOperation_Setter_(mthis, __arg_0) => mthis["globalCompositeOperation"] = __arg_0;
+  globalCompositeOperation_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "globalCompositeOperation", __arg_0);
 
-  imageSmoothingEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "imageSmoothingEnabled");
+  imageSmoothingEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "imageSmoothingEnabled");
 
-  imageSmoothingEnabled_Setter_(mthis, __arg_0) => mthis["imageSmoothingEnabled"] = __arg_0;
+  imageSmoothingEnabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "imageSmoothingEnabled", __arg_0);
 
-  lineCap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineCap");
+  lineCap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "lineCap");
 
-  lineCap_Setter_(mthis, __arg_0) => mthis["lineCap"] = __arg_0;
+  lineCap_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "lineCap", __arg_0);
 
-  lineDashOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineDashOffset");
+  lineDashOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "lineDashOffset");
 
-  lineDashOffset_Setter_(mthis, __arg_0) => mthis["lineDashOffset"] = __arg_0;
+  lineDashOffset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "lineDashOffset", __arg_0);
 
-  lineJoin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineJoin");
+  lineJoin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "lineJoin");
 
-  lineJoin_Setter_(mthis, __arg_0) => mthis["lineJoin"] = __arg_0;
+  lineJoin_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "lineJoin", __arg_0);
 
-  lineWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineWidth");
+  lineWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "lineWidth");
 
-  lineWidth_Setter_(mthis, __arg_0) => mthis["lineWidth"] = __arg_0;
+  lineWidth_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "lineWidth", __arg_0);
 
-  miterLimit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "miterLimit");
+  miterLimit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "miterLimit");
 
-  miterLimit_Setter_(mthis, __arg_0) => mthis["miterLimit"] = __arg_0;
+  miterLimit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "miterLimit", __arg_0);
 
-  shadowBlur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowBlur");
+  shadowBlur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "shadowBlur");
 
-  shadowBlur_Setter_(mthis, __arg_0) => mthis["shadowBlur"] = __arg_0;
+  shadowBlur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "shadowBlur", __arg_0);
 
-  shadowColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowColor");
+  shadowColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "shadowColor");
 
-  shadowColor_Setter_(mthis, __arg_0) => mthis["shadowColor"] = __arg_0;
+  shadowColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "shadowColor", __arg_0);
 
-  shadowOffsetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowOffsetX");
+  shadowOffsetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "shadowOffsetX");
 
-  shadowOffsetX_Setter_(mthis, __arg_0) => mthis["shadowOffsetX"] = __arg_0;
+  shadowOffsetX_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "shadowOffsetX", __arg_0);
 
-  shadowOffsetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowOffsetY");
+  shadowOffsetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "shadowOffsetY");
 
-  shadowOffsetY_Setter_(mthis, __arg_0) => mthis["shadowOffsetY"] = __arg_0;
+  shadowOffsetY_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "shadowOffsetY", __arg_0);
 
-  strokeStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "strokeStyle");
+  strokeStyle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "strokeStyle");
 
-  strokeStyle_Setter_(mthis, __arg_0) => mthis["strokeStyle"] = __arg_0;
+  strokeStyle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "strokeStyle", __arg_0);
 
-  textAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textAlign");
+  textAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "textAlign");
 
-  textAlign_Setter_(mthis, __arg_0) => mthis["textAlign"] = __arg_0;
+  textAlign_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "textAlign", __arg_0);
 
-  textBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textBaseline");
+  textBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "textBaseline");
 
-  textBaseline_Setter_(mthis, __arg_0) => mthis["textBaseline"] = __arg_0;
+  textBaseline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "textBaseline", __arg_0);
 
-  webkitImageSmoothingEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitImageSmoothingEnabled");
+  webkitImageSmoothingEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CanvasRenderingContext2D */, "webkitImageSmoothingEnabled");
 
-  webkitImageSmoothingEnabled_Setter_(mthis, __arg_0) => mthis["webkitImageSmoothingEnabled"] = __arg_0;
+  webkitImageSmoothingEnabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CanvasRenderingContext2D */, "webkitImageSmoothingEnabled", __arg_0);
 
-  addHitRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addHitRegion", []);
+  addHitRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "addHitRegion", []);
 
-  addHitRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addHitRegion", [__arg_0]);
+  addHitRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "addHitRegion", [__arg_0]);
 
-  beginPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginPath", []);
+  beginPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "beginPath", []);
 
-  clearHitRegions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearHitRegions", []);
+  clearHitRegions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "clearHitRegions", []);
 
-  clearRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearRect", [__arg_0, __arg_1]);
+  clearRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "clearRect", [__arg_0, __arg_1]);
 
-  clearRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearRect", [__arg_0, __arg_1, __arg_2]);
+  clearRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "clearRect", [__arg_0, __arg_1, __arg_2]);
 
-  clearRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  clearRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "clearRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  clip_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clip", []);
+  clip_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "clip", []);
 
-  clip_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clip", [__arg_0]);
+  clip_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "clip", [__arg_0]);
 
-  clip_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clip", [__arg_0, __arg_1]);
+  clip_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "clip", [__arg_0, __arg_1]);
 
-  createImageData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createImageData", []);
+  createImageData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createImageData", []);
 
-  createImageData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createImageData", [__arg_0]);
+  createImageData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createImageData", [__arg_0]);
 
-  createImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createImageData", [__arg_0, __arg_1]);
+  createImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createImageData", [__arg_0, __arg_1]);
 
-  createLinearGradient_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createLinearGradient", [__arg_0, __arg_1]);
+  createLinearGradient_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createLinearGradient", [__arg_0, __arg_1]);
 
-  createLinearGradient_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createLinearGradient", [__arg_0, __arg_1, __arg_2]);
+  createLinearGradient_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createLinearGradient", [__arg_0, __arg_1, __arg_2]);
 
-  createLinearGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createLinearGradient", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createLinearGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createLinearGradient", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createPattern_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createPattern", []);
+  createPattern_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createPattern", []);
 
-  createPattern_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createPattern", [__arg_0]);
+  createPattern_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createPattern", [__arg_0]);
 
-  createPattern_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createPattern", [__arg_0, __arg_1]);
+  createPattern_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createPattern", [__arg_0, __arg_1]);
 
-  createRadialGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createRadialGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createRadialGradient_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  createRadialGradient_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  createRadialGradient_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  createRadialGradient_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  drawFocusIfNeeded_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawFocusIfNeeded", []);
+  drawFocusIfNeeded_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawFocusIfNeeded", []);
 
-  drawFocusIfNeeded_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawFocusIfNeeded", [__arg_0]);
+  drawFocusIfNeeded_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawFocusIfNeeded", [__arg_0]);
 
-  drawFocusIfNeeded_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawFocusIfNeeded", [__arg_0, __arg_1]);
+  drawFocusIfNeeded_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawFocusIfNeeded", [__arg_0, __arg_1]);
 
-  drawImage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0]);
+  drawImage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0]);
 
-  drawImage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1]);
+  drawImage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1]);
 
-  drawImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2]);
+  drawImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1, __arg_2]);
 
-  drawImage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawImage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawImage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  drawImage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  drawImage_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  drawImage_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  drawImage_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  drawImage_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  drawImage_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  drawImage_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  drawImage_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  drawImage_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  fill_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fill", []);
+  fill_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fill", []);
 
-  fill_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fill", [__arg_0]);
+  fill_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fill", [__arg_0]);
 
-  fill_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fill", [__arg_0, __arg_1]);
+  fill_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fill", [__arg_0, __arg_1]);
 
-  fillRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fillRect", [__arg_0, __arg_1]);
+  fillRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fillRect", [__arg_0, __arg_1]);
 
-  fillRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "fillRect", [__arg_0, __arg_1, __arg_2]);
+  fillRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fillRect", [__arg_0, __arg_1, __arg_2]);
 
-  fillRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "fillRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  fillRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fillRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  fillText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fillText", [__arg_0]);
+  fillText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fillText", [__arg_0]);
 
-  fillText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fillText", [__arg_0, __arg_1]);
+  fillText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fillText", [__arg_0, __arg_1]);
 
-  fillText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "fillText", [__arg_0, __arg_1, __arg_2]);
+  fillText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fillText", [__arg_0, __arg_1, __arg_2]);
 
-  fillText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "fillText", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  fillText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "fillText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "getContextAttributes", []);
 
-  getImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getImageData", [__arg_0, __arg_1]);
+  getImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "getImageData", [__arg_0, __arg_1]);
 
-  getImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getImageData", [__arg_0, __arg_1, __arg_2]);
+  getImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "getImageData", [__arg_0, __arg_1, __arg_2]);
 
-  getImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "getImageData", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  getImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "getImageData", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  getLineDash_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getLineDash", []);
+  getLineDash_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "getLineDash", []);
 
-  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isContextLost", []);
 
-  isPointInPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isPointInPath", []);
+  isPointInPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInPath", []);
 
-  isPointInPath_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isPointInPath", [__arg_0]);
+  isPointInPath_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInPath", [__arg_0]);
 
-  isPointInPath_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "isPointInPath", [__arg_0, __arg_1]);
+  isPointInPath_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInPath", [__arg_0, __arg_1]);
 
-  isPointInPath_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "isPointInPath", [__arg_0, __arg_1, __arg_2]);
+  isPointInPath_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInPath", [__arg_0, __arg_1, __arg_2]);
 
-  isPointInPath_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "isPointInPath", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  isPointInPath_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInPath", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  isPointInStroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isPointInStroke", []);
+  isPointInStroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInStroke", []);
 
-  isPointInStroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isPointInStroke", [__arg_0]);
+  isPointInStroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInStroke", [__arg_0]);
 
-  isPointInStroke_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "isPointInStroke", [__arg_0, __arg_1]);
+  isPointInStroke_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInStroke", [__arg_0, __arg_1]);
 
-  isPointInStroke_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "isPointInStroke", [__arg_0, __arg_1, __arg_2]);
+  isPointInStroke_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "isPointInStroke", [__arg_0, __arg_1, __arg_2]);
 
-  measureText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "measureText", []);
+  measureText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "measureText", []);
 
-  measureText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "measureText", [__arg_0]);
+  measureText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "measureText", [__arg_0]);
 
-  putImageData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0]);
+  putImageData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "putImageData", [__arg_0]);
 
-  putImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1]);
+  putImageData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "putImageData", [__arg_0, __arg_1]);
 
-  putImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2]);
+  putImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "putImageData", [__arg_0, __arg_1, __arg_2]);
 
-  putImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  putImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  putImageData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  putImageData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  putImageData_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  putImageData_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  putImageData_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  putImageData_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  removeHitRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeHitRegion", []);
+  removeHitRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "removeHitRegion", []);
 
-  removeHitRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeHitRegion", [__arg_0]);
+  removeHitRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "removeHitRegion", [__arg_0]);
 
-  resetTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resetTransform", []);
+  resetTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "resetTransform", []);
 
-  restore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "restore", []);
+  restore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "restore", []);
 
-  rotate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotate", []);
+  rotate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "rotate", []);
 
-  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0]);
+  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "rotate", [__arg_0]);
 
-  save_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "save", []);
+  save_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "save", []);
 
-  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
+  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "scale", []);
 
-  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
+  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "scale", [__arg_0]);
 
-  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1]);
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "scale", [__arg_0, __arg_1]);
 
-  scrollPathIntoView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollPathIntoView", []);
+  scrollPathIntoView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "scrollPathIntoView", []);
 
-  scrollPathIntoView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollPathIntoView", [__arg_0]);
+  scrollPathIntoView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "scrollPathIntoView", [__arg_0]);
 
-  setLineDash_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setLineDash", []);
+  setLineDash_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "setLineDash", []);
 
-  setLineDash_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setLineDash", [__arg_0]);
+  setLineDash_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "setLineDash", [__arg_0]);
 
-  setTransform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setTransform", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  setTransform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "setTransform", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  setTransform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "setTransform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  setTransform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "setTransform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  setTransform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "setTransform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  setTransform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "setTransform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  stroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stroke", []);
+  stroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "stroke", []);
 
-  stroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stroke", [__arg_0]);
+  stroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "stroke", [__arg_0]);
 
-  strokeRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "strokeRect", [__arg_0, __arg_1]);
+  strokeRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "strokeRect", [__arg_0, __arg_1]);
 
-  strokeRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "strokeRect", [__arg_0, __arg_1, __arg_2]);
+  strokeRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "strokeRect", [__arg_0, __arg_1, __arg_2]);
 
-  strokeRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "strokeRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  strokeRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "strokeRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  strokeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "strokeText", [__arg_0]);
+  strokeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "strokeText", [__arg_0]);
 
-  strokeText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "strokeText", [__arg_0, __arg_1]);
+  strokeText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "strokeText", [__arg_0, __arg_1]);
 
-  strokeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "strokeText", [__arg_0, __arg_1, __arg_2]);
+  strokeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "strokeText", [__arg_0, __arg_1, __arg_2]);
 
-  strokeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "strokeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  strokeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "strokeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  transform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "transform", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  transform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "transform", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  transform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "transform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  transform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "transform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  transform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "transform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  transform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "transform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  translate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "translate", []);
+  translate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "translate", []);
 
-  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0]);
+  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "translate", [__arg_0]);
 
-  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1]);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasRenderingContext2D */, "translate", [__arg_0, __arg_1]);
 
-  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2]);
 
-  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePath", []);
+  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "closePath", []);
 
-  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", []);
+  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", []);
 
-  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0]);
+  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", [__arg_0]);
 
-  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0, __arg_1]);
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", [__arg_0, __arg_1]);
 
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", []);
 
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", [__arg_0]);
 
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", [__arg_0, __arg_1]);
 
-  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1]);
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1]);
 
-  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
 
-  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1]);
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1]);
 
-  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2]);
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1, __arg_2]);
 
-  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
@@ -2443,1110 +2443,1110 @@
 class BlinkCharacterData extends BlinkNode {
   static final instance = new BlinkCharacterData();
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CharacterData */, "data");
 
-  data_Setter_(mthis, __arg_0) => mthis["data"] = __arg_0;
+  data_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CharacterData */, "data", __arg_0);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CharacterData */, "length");
 
-  appendData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendData", []);
+  appendData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "appendData", []);
 
-  appendData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendData", [__arg_0]);
+  appendData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "appendData", [__arg_0]);
 
-  deleteData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteData", []);
+  deleteData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "deleteData", []);
 
-  deleteData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteData", [__arg_0]);
+  deleteData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "deleteData", [__arg_0]);
 
-  deleteData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "deleteData", [__arg_0, __arg_1]);
+  deleteData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "deleteData", [__arg_0, __arg_1]);
 
-  insertData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertData", []);
+  insertData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "insertData", []);
 
-  insertData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertData", [__arg_0]);
+  insertData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "insertData", [__arg_0]);
 
-  insertData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertData", [__arg_0, __arg_1]);
+  insertData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "insertData", [__arg_0, __arg_1]);
 
-  replaceData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceData", [__arg_0]);
+  replaceData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "replaceData", [__arg_0]);
 
-  replaceData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceData", [__arg_0, __arg_1]);
+  replaceData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "replaceData", [__arg_0, __arg_1]);
 
-  replaceData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "replaceData", [__arg_0, __arg_1, __arg_2]);
+  replaceData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "replaceData", [__arg_0, __arg_1, __arg_2]);
 
-  substringData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "substringData", []);
+  substringData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "substringData", []);
 
-  substringData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "substringData", [__arg_0]);
+  substringData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "substringData", [__arg_0]);
 
-  substringData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "substringData", [__arg_0, __arg_1]);
+  substringData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CharacterData */, "substringData", [__arg_0, __arg_1]);
 
-  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", []);
 
-  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", [__arg_0]);
 
-  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", []);
 
-  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) native "Blink_Operation_0_ChildNode_remove";
 
-  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", []);
 
-  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", [__arg_0]);
 
-  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
+  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NonDocumentTypeChildNode */, "nextElementSibling");
 
-  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
+  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NonDocumentTypeChildNode */, "previousElementSibling");
 
 }
 
 class BlinkChildNode {
   static final instance = new BlinkChildNode();
 
-  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", []);
 
-  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", [__arg_0]);
 
-  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", []);
 
-  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) native "Blink_Operation_0_ChildNode_remove";
 
-  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", []);
 
-  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", [__arg_0]);
 
 }
 
 class BlinkCircularGeofencingRegion extends BlinkGeofencingRegion {
   static final instance = new BlinkCircularGeofencingRegion();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CircularGeofencingRegion"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("CircularGeofencingRegion");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CircularGeofencingRegion"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("CircularGeofencingRegion", [__arg_0]);
 
-  latitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "latitude");
+  latitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CircularGeofencingRegion */, "latitude");
 
-  longitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longitude");
+  longitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CircularGeofencingRegion */, "longitude");
 
-  radius_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radius");
+  radius_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CircularGeofencingRegion */, "radius");
 
 }
 
 class BlinkClient {
   static final instance = new BlinkClient();
 
-  frameType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameType");
+  frameType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Client */, "frameType");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Client */, "id");
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Client */, "url");
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Client */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Client */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Client */, "postMessage", [__arg_0, __arg_1]);
 
 }
 
 class BlinkClientRect {
   static final instance = new BlinkClientRect();
 
-  bottom_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bottom");
+  bottom_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClientRect */, "bottom");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClientRect */, "height");
 
-  left_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "left");
+  left_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClientRect */, "left");
 
-  right_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "right");
+  right_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClientRect */, "right");
 
-  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "top");
+  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClientRect */, "top");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClientRect */, "width");
 
 }
 
 class BlinkClientRectList {
   static final instance = new BlinkClientRectList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClientRectList */, "length");
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ClientRectList */, "__getter__", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ClientRectList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ClientRectList */, "item", [__arg_0]);
 
 }
 
 class BlinkClients {
   static final instance = new BlinkClients();
 
-  claim_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "claim", []);
+  claim_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Clients */, "claim", []);
 
-  matchAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", []);
+  matchAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Clients */, "matchAll", []);
 
-  matchAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", [__arg_0]);
+  matchAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Clients */, "matchAll", [__arg_0]);
 
-  openWindow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openWindow", []);
+  openWindow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Clients */, "openWindow", []);
 
-  openWindow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openWindow", [__arg_0]);
+  openWindow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Clients */, "openWindow", [__arg_0]);
 
 }
 
 class BlinkClipboardEvent extends BlinkEvent {
   static final instance = new BlinkClipboardEvent();
 
-  clipboardData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clipboardData");
+  clipboardData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ClipboardEvent */, "clipboardData");
 
 }
 
 class BlinkCloseEvent extends BlinkEvent {
   static final instance = new BlinkCloseEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CloseEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("CloseEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CloseEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("CloseEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CloseEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("CloseEvent", [__arg_0, __arg_1]);
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CloseEvent */, "code");
 
-  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reason");
+  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CloseEvent */, "reason");
 
-  wasClean_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wasClean");
+  wasClean_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CloseEvent */, "wasClean");
 
 }
 
 class BlinkComment extends BlinkCharacterData {
   static final instance = new BlinkComment();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Comment"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Comment");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Comment"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Comment", [__arg_0]);
 
 }
 
 class BlinkCompositionEvent extends BlinkUIEvent {
   static final instance = new BlinkCompositionEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositionEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("CompositionEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositionEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("CompositionEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositionEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("CompositionEvent", [__arg_0, __arg_1]);
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CompositionEvent */, "data");
 
-  initCompositionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", [__arg_0, __arg_1, __arg_2]);
+  initCompositionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CompositionEvent */, "initCompositionEvent", [__arg_0, __arg_1, __arg_2]);
 
-  initCompositionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  initCompositionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CompositionEvent */, "initCompositionEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  initCompositionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initCompositionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  initCompositionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CompositionEvent */, "initCompositionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkCompositorProxy {
   static final instance = new BlinkCompositorProxy();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorProxy"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("CompositorProxy");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorProxy"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("CompositorProxy", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorProxy"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("CompositorProxy", [__arg_0, __arg_1]);
 
-  opacity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "opacity");
+  opacity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CompositorProxy */, "opacity");
 
-  opacity_Setter_(mthis, __arg_0) => mthis["opacity"] = __arg_0;
+  opacity_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CompositorProxy */, "opacity", __arg_0);
 
-  scrollLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollLeft");
+  scrollLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CompositorProxy */, "scrollLeft");
 
-  scrollLeft_Setter_(mthis, __arg_0) => mthis["scrollLeft"] = __arg_0;
+  scrollLeft_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CompositorProxy */, "scrollLeft", __arg_0);
 
-  scrollTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollTop");
+  scrollTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CompositorProxy */, "scrollTop");
 
-  scrollTop_Setter_(mthis, __arg_0) => mthis["scrollTop"] = __arg_0;
+  scrollTop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CompositorProxy */, "scrollTop", __arg_0);
 
-  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
+  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CompositorProxy */, "transform");
 
-  transform_Setter_(mthis, __arg_0) => mthis["transform"] = __arg_0;
+  transform_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CompositorProxy */, "transform", __arg_0);
 
-  disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", []);
+  disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CompositorProxy */, "disconnect", []);
 
-  supports_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "supports", []);
+  supports_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CompositorProxy */, "supports", []);
 
-  supports_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "supports", [__arg_0]);
+  supports_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CompositorProxy */, "supports", [__arg_0]);
 
 }
 
 class BlinkCompositorWorker extends BlinkEventTarget {
   static final instance = new BlinkCompositorWorker();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorWorker"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("CompositorWorker");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CompositorWorker"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("CompositorWorker", [__arg_0]);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CompositorWorker */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CompositorWorker */, "onmessage", __arg_0);
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorker */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorker */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorker */, "postMessage", [__arg_0, __arg_1]);
 
-  terminate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "terminate", []);
+  terminate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorker */, "terminate", []);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AbstractWorker */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AbstractWorker */, "onerror", __arg_0);
 
 }
 
 class BlinkCompositorWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkCompositorWorkerGlobalScope();
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CompositorWorkerGlobalScope */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* CompositorWorkerGlobalScope */, "onmessage", __arg_0);
 
-  cancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", []);
+  cancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorkerGlobalScope */, "cancelAnimationFrame", []);
 
-  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", [__arg_0]);
+  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorkerGlobalScope */, "cancelAnimationFrame", [__arg_0]);
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorkerGlobalScope */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorkerGlobalScope */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorkerGlobalScope */, "postMessage", [__arg_0, __arg_1]);
 
-  requestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", []);
+  requestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorkerGlobalScope */, "requestAnimationFrame", []);
 
-  requestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", [__arg_0]);
+  requestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CompositorWorkerGlobalScope */, "requestAnimationFrame", [__arg_0]);
 
 }
 
 class BlinkConsole extends BlinkConsoleBase {
   static final instance = new BlinkConsole();
 
-  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "memory");
+  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Console */, "memory");
 
-  memory_Setter_(mthis, __arg_0) => mthis["memory"] = __arg_0;
+  memory_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Console */, "memory", __arg_0);
 
 }
 
 class BlinkConsoleBase {
   static final instance = new BlinkConsoleBase();
 
-  assert_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "assert", []);
+  assert_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "assert", []);
 
-  assert_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "assert", [__arg_0]);
+  assert_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "assert", [__arg_0]);
 
-  assert_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "assert", [__arg_0, __arg_1]);
+  assert_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "assert", [__arg_0, __arg_1]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "clear", []);
 
-  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "clear", [__arg_0]);
 
-  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "count", []);
+  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "count", []);
 
-  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "count", [__arg_0]);
+  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "count", [__arg_0]);
 
-  debug_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "debug", []);
+  debug_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "debug", []);
 
-  debug_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "debug", [__arg_0]);
+  debug_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "debug", [__arg_0]);
 
-  dir_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "dir", []);
+  dir_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "dir", []);
 
-  dir_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "dir", [__arg_0]);
+  dir_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "dir", [__arg_0]);
 
-  dirxml_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "dirxml", []);
+  dirxml_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "dirxml", []);
 
-  dirxml_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "dirxml", [__arg_0]);
+  dirxml_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "dirxml", [__arg_0]);
 
-  error_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "error", []);
+  error_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "error", []);
 
-  error_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "error", [__arg_0]);
+  error_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "error", [__arg_0]);
 
-  group_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "group", []);
+  group_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "group", []);
 
-  group_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "group", [__arg_0]);
+  group_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "group", [__arg_0]);
 
-  groupCollapsed_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "groupCollapsed", []);
+  groupCollapsed_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "groupCollapsed", []);
 
-  groupCollapsed_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "groupCollapsed", [__arg_0]);
+  groupCollapsed_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "groupCollapsed", [__arg_0]);
 
-  groupEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "groupEnd", []);
+  groupEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "groupEnd", []);
 
-  info_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "info", []);
+  info_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "info", []);
 
-  info_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "info", [__arg_0]);
+  info_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "info", [__arg_0]);
 
-  log_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "log", []);
+  log_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "log", []);
 
-  log_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "log", [__arg_0]);
+  log_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "log", [__arg_0]);
 
-  markTimeline_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "markTimeline", []);
+  markTimeline_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "markTimeline", []);
 
-  markTimeline_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "markTimeline", [__arg_0]);
+  markTimeline_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "markTimeline", [__arg_0]);
 
-  profile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "profile", []);
+  profile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "profile", []);
 
-  profile_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "profile", [__arg_0]);
+  profile_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "profile", [__arg_0]);
 
-  profileEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "profileEnd", []);
+  profileEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "profileEnd", []);
 
-  profileEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "profileEnd", [__arg_0]);
+  profileEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "profileEnd", [__arg_0]);
 
-  table_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "table", []);
+  table_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "table", []);
 
-  table_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "table", [__arg_0]);
+  table_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "table", [__arg_0]);
 
-  time_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "time", []);
+  time_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "time", []);
 
-  time_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "time", [__arg_0]);
+  time_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "time", [__arg_0]);
 
-  timeEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timeEnd", []);
+  timeEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timeEnd", []);
 
-  timeEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timeEnd", [__arg_0]);
+  timeEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timeEnd", [__arg_0]);
 
-  timeStamp_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timeStamp", []);
+  timeStamp_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timeStamp", []);
 
-  timeStamp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timeStamp", [__arg_0]);
+  timeStamp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timeStamp", [__arg_0]);
 
-  timeline_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timeline", []);
+  timeline_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timeline", []);
 
-  timeline_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timeline", [__arg_0]);
+  timeline_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timeline", [__arg_0]);
 
-  timelineEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "timelineEnd", []);
+  timelineEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timelineEnd", []);
 
-  timelineEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "timelineEnd", [__arg_0]);
+  timelineEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "timelineEnd", [__arg_0]);
 
-  trace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "trace", []);
+  trace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "trace", []);
 
-  trace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "trace", [__arg_0]);
+  trace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "trace", [__arg_0]);
 
-  warn_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "warn", []);
+  warn_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "warn", []);
 
-  warn_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "warn", [__arg_0]);
+  warn_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ConsoleBase */, "warn", [__arg_0]);
 
 }
 
 class BlinkConvolverNode extends BlinkAudioNode {
   static final instance = new BlinkConvolverNode();
 
-  buffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffer");
+  buffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ConvolverNode */, "buffer");
 
-  buffer_Setter_(mthis, __arg_0) => mthis["buffer"] = __arg_0;
+  buffer_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ConvolverNode */, "buffer", __arg_0);
 
-  normalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "normalize");
+  normalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ConvolverNode */, "normalize");
 
-  normalize_Setter_(mthis, __arg_0) => mthis["normalize"] = __arg_0;
+  normalize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ConvolverNode */, "normalize", __arg_0);
 
 }
 
 class BlinkCoordinates {
   static final instance = new BlinkCoordinates();
 
-  accuracy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accuracy");
+  accuracy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Coordinates */, "accuracy");
 
-  altitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altitude");
+  altitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Coordinates */, "altitude");
 
-  altitudeAccuracy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altitudeAccuracy");
+  altitudeAccuracy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Coordinates */, "altitudeAccuracy");
 
-  heading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "heading");
+  heading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Coordinates */, "heading");
 
-  latitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "latitude");
+  latitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Coordinates */, "latitude");
 
-  longitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longitude");
+  longitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Coordinates */, "longitude");
 
-  speed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speed");
+  speed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Coordinates */, "speed");
 
 }
 
 class BlinkCredential {
   static final instance = new BlinkCredential();
 
-  iconURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iconURL");
+  iconURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Credential */, "iconURL");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Credential */, "id");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Credential */, "name");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Credential */, "type");
 
 }
 
 class BlinkCredentialsContainer {
   static final instance = new BlinkCredentialsContainer();
 
-  notifySignedIn_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "notifySignedIn", []);
+  notifySignedIn_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CredentialsContainer */, "notifySignedIn", []);
 
-  notifySignedIn_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "notifySignedIn", [__arg_0]);
+  notifySignedIn_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CredentialsContainer */, "notifySignedIn", [__arg_0]);
 
-  request_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "request", []);
+  request_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CredentialsContainer */, "request", []);
 
-  request_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "request", [__arg_0]);
+  request_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CredentialsContainer */, "request", [__arg_0]);
 
-  requireUserMediation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requireUserMediation", []);
+  requireUserMediation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CredentialsContainer */, "requireUserMediation", []);
 
 }
 
 class BlinkCrossOriginConnectEvent extends BlinkEvent {
   static final instance = new BlinkCrossOriginConnectEvent();
 
-  client_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "client");
+  client_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CrossOriginConnectEvent */, "client");
 
-  acceptConnection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "acceptConnection", []);
+  acceptConnection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CrossOriginConnectEvent */, "acceptConnection", []);
 
-  acceptConnection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "acceptConnection", [__arg_0]);
+  acceptConnection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CrossOriginConnectEvent */, "acceptConnection", [__arg_0]);
 
 }
 
 class BlinkCrossOriginServiceWorkerClient extends BlinkEventTarget {
   static final instance = new BlinkCrossOriginServiceWorkerClient();
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CrossOriginServiceWorkerClient */, "origin");
 
-  targetUrl_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetUrl");
+  targetUrl_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CrossOriginServiceWorkerClient */, "targetUrl");
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CrossOriginServiceWorkerClient */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CrossOriginServiceWorkerClient */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CrossOriginServiceWorkerClient */, "postMessage", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCrypto {
   static final instance = new BlinkCrypto();
 
-  subtle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "subtle");
+  subtle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Crypto */, "subtle");
 
-  getRandomValues_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRandomValues", []);
+  getRandomValues_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Crypto */, "getRandomValues", []);
 
-  getRandomValues_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRandomValues", [__arg_0]);
+  getRandomValues_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Crypto */, "getRandomValues", [__arg_0]);
 
 }
 
 class BlinkCryptoKey {
   static final instance = new BlinkCryptoKey();
 
-  algorithm_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "algorithm");
+  algorithm_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CryptoKey */, "algorithm");
 
-  extractable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extractable");
+  extractable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CryptoKey */, "extractable");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CryptoKey */, "type");
 
-  usages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "usages");
+  usages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CryptoKey */, "usages");
 
 }
 
 class BlinkCustomEvent extends BlinkEvent {
   static final instance = new BlinkCustomEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CustomEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("CustomEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CustomEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("CustomEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "CustomEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("CustomEvent", [__arg_0, __arg_1]);
 
-  detail_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detail");
+  detail_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* CustomEvent */, "detail");
 
-  initCustomEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initCustomEvent", [__arg_0, __arg_1]);
+  initCustomEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CustomEvent */, "initCustomEvent", [__arg_0, __arg_1]);
 
-  initCustomEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initCustomEvent", [__arg_0, __arg_1, __arg_2]);
+  initCustomEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CustomEvent */, "initCustomEvent", [__arg_0, __arg_1, __arg_2]);
 
-  initCustomEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initCustomEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  initCustomEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CustomEvent */, "initCustomEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkDOMError {
   static final instance = new BlinkDOMError();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMError"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DOMError");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMError"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("DOMError", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMError"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("DOMError", [__arg_0, __arg_1]);
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMError */, "message");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMError */, "name");
 
 }
 
 class BlinkDOMException {
   static final instance = new BlinkDOMException();
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMException */, "code");
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMException */, "message");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMException */, "name");
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMException */, "toString", []);
 
 }
 
 class BlinkDOMFileSystem {
   static final instance = new BlinkDOMFileSystem();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMFileSystem */, "name");
 
-  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "root");
+  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMFileSystem */, "root");
 
 }
 
 class BlinkDOMFileSystemSync {
   static final instance = new BlinkDOMFileSystemSync();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMFileSystemSync */, "name");
 
-  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "root");
+  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMFileSystemSync */, "root");
 
 }
 
 class BlinkDOMImplementation {
   static final instance = new BlinkDOMImplementation();
 
-  createDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDocument", [__arg_0]);
+  createDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createDocument", [__arg_0]);
 
-  createDocument_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createDocument", [__arg_0, __arg_1]);
+  createDocument_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createDocument", [__arg_0, __arg_1]);
 
-  createDocument_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createDocument", [__arg_0, __arg_1, __arg_2]);
+  createDocument_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createDocument", [__arg_0, __arg_1, __arg_2]);
 
-  createDocumentType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0]);
+  createDocumentType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createDocumentType", [__arg_0]);
 
-  createDocumentType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0, __arg_1]);
+  createDocumentType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createDocumentType", [__arg_0, __arg_1]);
 
-  createDocumentType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentType", [__arg_0, __arg_1, __arg_2]);
+  createDocumentType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createDocumentType", [__arg_0, __arg_1, __arg_2]);
 
-  createHTMLDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createHTMLDocument", []);
+  createHTMLDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createHTMLDocument", []);
 
-  createHTMLDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createHTMLDocument", [__arg_0]);
+  createHTMLDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "createHTMLDocument", [__arg_0]);
 
-  hasFeature_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasFeature", []);
+  hasFeature_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMImplementation */, "hasFeature", []);
 
 }
 
 class BlinkDOMMatrix extends BlinkDOMMatrixReadOnly {
   static final instance = new BlinkDOMMatrix();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMMatrix"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DOMMatrix");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMMatrix"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("DOMMatrix", [__arg_0]);
 
-  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "a");
+  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "a");
 
-  a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
+  a_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "a", __arg_0);
 
-  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "b");
+  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "b");
 
-  b_Setter_(mthis, __arg_0) => mthis["b"] = __arg_0;
+  b_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "b", __arg_0);
 
-  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "c");
+  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "c");
 
-  c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
+  c_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "c", __arg_0);
 
-  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "d");
+  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "d");
 
-  d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
+  d_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "d", __arg_0);
 
-  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "e");
+  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "e");
 
-  e_Setter_(mthis, __arg_0) => mthis["e"] = __arg_0;
+  e_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "e", __arg_0);
 
-  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "f");
+  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "f");
 
-  f_Setter_(mthis, __arg_0) => mthis["f"] = __arg_0;
+  f_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "f", __arg_0);
 
-  m11_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m11");
+  m11_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m11");
 
-  m11_Setter_(mthis, __arg_0) => mthis["m11"] = __arg_0;
+  m11_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m11", __arg_0);
 
-  m12_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m12");
+  m12_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m12");
 
-  m12_Setter_(mthis, __arg_0) => mthis["m12"] = __arg_0;
+  m12_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m12", __arg_0);
 
-  m13_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m13");
+  m13_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m13");
 
-  m13_Setter_(mthis, __arg_0) => mthis["m13"] = __arg_0;
+  m13_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m13", __arg_0);
 
-  m14_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m14");
+  m14_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m14");
 
-  m14_Setter_(mthis, __arg_0) => mthis["m14"] = __arg_0;
+  m14_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m14", __arg_0);
 
-  m21_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m21");
+  m21_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m21");
 
-  m21_Setter_(mthis, __arg_0) => mthis["m21"] = __arg_0;
+  m21_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m21", __arg_0);
 
-  m22_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m22");
+  m22_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m22");
 
-  m22_Setter_(mthis, __arg_0) => mthis["m22"] = __arg_0;
+  m22_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m22", __arg_0);
 
-  m23_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m23");
+  m23_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m23");
 
-  m23_Setter_(mthis, __arg_0) => mthis["m23"] = __arg_0;
+  m23_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m23", __arg_0);
 
-  m24_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m24");
+  m24_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m24");
 
-  m24_Setter_(mthis, __arg_0) => mthis["m24"] = __arg_0;
+  m24_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m24", __arg_0);
 
-  m31_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m31");
+  m31_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m31");
 
-  m31_Setter_(mthis, __arg_0) => mthis["m31"] = __arg_0;
+  m31_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m31", __arg_0);
 
-  m32_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m32");
+  m32_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m32");
 
-  m32_Setter_(mthis, __arg_0) => mthis["m32"] = __arg_0;
+  m32_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m32", __arg_0);
 
-  m33_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m33");
+  m33_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m33");
 
-  m33_Setter_(mthis, __arg_0) => mthis["m33"] = __arg_0;
+  m33_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m33", __arg_0);
 
-  m34_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m34");
+  m34_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m34");
 
-  m34_Setter_(mthis, __arg_0) => mthis["m34"] = __arg_0;
+  m34_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m34", __arg_0);
 
-  m41_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m41");
+  m41_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m41");
 
-  m41_Setter_(mthis, __arg_0) => mthis["m41"] = __arg_0;
+  m41_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m41", __arg_0);
 
-  m42_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m42");
+  m42_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m42");
 
-  m42_Setter_(mthis, __arg_0) => mthis["m42"] = __arg_0;
+  m42_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m42", __arg_0);
 
-  m43_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m43");
+  m43_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m43");
 
-  m43_Setter_(mthis, __arg_0) => mthis["m43"] = __arg_0;
+  m43_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m43", __arg_0);
 
-  m44_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m44");
+  m44_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrix */, "m44");
 
-  m44_Setter_(mthis, __arg_0) => mthis["m44"] = __arg_0;
+  m44_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMMatrix */, "m44", __arg_0);
 
-  multiplySelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "multiplySelf", []);
+  multiplySelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "multiplySelf", []);
 
-  multiplySelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "multiplySelf", [__arg_0]);
+  multiplySelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "multiplySelf", [__arg_0]);
 
-  preMultiplySelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "preMultiplySelf", []);
+  preMultiplySelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "preMultiplySelf", []);
 
-  preMultiplySelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "preMultiplySelf", [__arg_0]);
+  preMultiplySelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "preMultiplySelf", [__arg_0]);
 
-  scale3dSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale3dSelf", []);
+  scale3dSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scale3dSelf", []);
 
-  scale3dSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale3dSelf", [__arg_0]);
+  scale3dSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scale3dSelf", [__arg_0]);
 
-  scale3dSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scale3dSelf", [__arg_0, __arg_1]);
+  scale3dSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scale3dSelf", [__arg_0, __arg_1]);
 
-  scale3dSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scale3dSelf", [__arg_0, __arg_1, __arg_2]);
+  scale3dSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scale3dSelf", [__arg_0, __arg_1, __arg_2]);
 
-  scale3dSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scale3dSelf", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scale3dSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scale3dSelf", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  scaleNonUniformSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniformSelf", []);
+  scaleNonUniformSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleNonUniformSelf", []);
 
-  scaleNonUniformSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniformSelf", [__arg_0]);
+  scaleNonUniformSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleNonUniformSelf", [__arg_0]);
 
-  scaleNonUniformSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniformSelf", [__arg_0, __arg_1]);
+  scaleNonUniformSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleNonUniformSelf", [__arg_0, __arg_1]);
 
-  scaleNonUniformSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2]);
+  scaleNonUniformSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2]);
 
-  scaleNonUniformSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scaleNonUniformSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  scaleNonUniformSelf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  scaleNonUniformSelf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  scaleNonUniformSelf_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  scaleNonUniformSelf_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  scaleSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scaleSelf", []);
+  scaleSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleSelf", []);
 
-  scaleSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scaleSelf", [__arg_0]);
+  scaleSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleSelf", [__arg_0]);
 
-  scaleSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scaleSelf", [__arg_0, __arg_1]);
+  scaleSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleSelf", [__arg_0, __arg_1]);
 
-  scaleSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scaleSelf", [__arg_0, __arg_1, __arg_2]);
+  scaleSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "scaleSelf", [__arg_0, __arg_1, __arg_2]);
 
-  translateSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "translateSelf", []);
+  translateSelf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "translateSelf", []);
 
-  translateSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "translateSelf", [__arg_0]);
+  translateSelf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "translateSelf", [__arg_0]);
 
-  translateSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "translateSelf", [__arg_0, __arg_1]);
+  translateSelf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "translateSelf", [__arg_0, __arg_1]);
 
-  translateSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "translateSelf", [__arg_0, __arg_1, __arg_2]);
+  translateSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrix */, "translateSelf", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDOMMatrixReadOnly {
   static final instance = new BlinkDOMMatrixReadOnly();
 
-  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "a");
+  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "a");
 
-  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "b");
+  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "b");
 
-  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "c");
+  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "c");
 
-  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "d");
+  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "d");
 
-  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "e");
+  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "e");
 
-  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "f");
+  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "f");
 
-  is2D_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "is2D");
+  is2D_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "is2D");
 
-  isIdentity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isIdentity");
+  isIdentity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "isIdentity");
 
-  m11_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m11");
+  m11_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m11");
 
-  m12_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m12");
+  m12_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m12");
 
-  m13_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m13");
+  m13_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m13");
 
-  m14_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m14");
+  m14_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m14");
 
-  m21_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m21");
+  m21_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m21");
 
-  m22_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m22");
+  m22_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m22");
 
-  m23_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m23");
+  m23_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m23");
 
-  m24_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m24");
+  m24_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m24");
 
-  m31_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m31");
+  m31_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m31");
 
-  m32_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m32");
+  m32_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m32");
 
-  m33_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m33");
+  m33_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m33");
 
-  m34_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m34");
+  m34_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m34");
 
-  m41_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m41");
+  m41_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m41");
 
-  m42_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m42");
+  m42_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m42");
 
-  m43_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m43");
+  m43_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m43");
 
-  m44_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m44");
+  m44_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMMatrixReadOnly */, "m44");
 
-  multiply_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "multiply", []);
+  multiply_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "multiply", []);
 
-  multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "multiply", [__arg_0]);
+  multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "multiply", [__arg_0]);
 
-  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
+  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale", []);
 
-  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
+  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale", [__arg_0]);
 
-  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1]);
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale", [__arg_0, __arg_1]);
 
-  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1, __arg_2]);
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale", [__arg_0, __arg_1, __arg_2]);
 
-  scale3d_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale3d", []);
+  scale3d_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale3d", []);
 
-  scale3d_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale3d", [__arg_0]);
+  scale3d_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale3d", [__arg_0]);
 
-  scale3d_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scale3d", [__arg_0, __arg_1]);
+  scale3d_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale3d", [__arg_0, __arg_1]);
 
-  scale3d_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scale3d", [__arg_0, __arg_1, __arg_2]);
+  scale3d_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale3d", [__arg_0, __arg_1, __arg_2]);
 
-  scale3d_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scale3d", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scale3d_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scale3d", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  scaleNonUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", []);
+  scaleNonUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scaleNonUniform", []);
 
-  scaleNonUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0]);
+  scaleNonUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scaleNonUniform", [__arg_0]);
 
-  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1]);
+  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scaleNonUniform", [__arg_0, __arg_1]);
 
-  scaleNonUniform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1, __arg_2]);
+  scaleNonUniform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scaleNonUniform", [__arg_0, __arg_1, __arg_2]);
 
-  scaleNonUniform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scaleNonUniform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  scaleNonUniform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  scaleNonUniform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  scaleNonUniform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  scaleNonUniform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  toFloat32Array_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toFloat32Array", []);
+  toFloat32Array_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "toFloat32Array", []);
 
-  toFloat64Array_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toFloat64Array", []);
+  toFloat64Array_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "toFloat64Array", []);
 
-  translate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "translate", []);
+  translate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "translate", []);
 
-  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0]);
+  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "translate", [__arg_0]);
 
-  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1]);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "translate", [__arg_0, __arg_1]);
 
-  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1, __arg_2]);
+  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DOMMatrixReadOnly */, "translate", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDOMParser {
   static final instance = new BlinkDOMParser();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMParser"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DOMParser");
 
-  parseFromString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "parseFromString", []);
+  parseFromString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMParser */, "parseFromString", []);
 
-  parseFromString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "parseFromString", [__arg_0]);
+  parseFromString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMParser */, "parseFromString", [__arg_0]);
 
-  parseFromString_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "parseFromString", [__arg_0, __arg_1]);
+  parseFromString_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMParser */, "parseFromString", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDOMPoint extends BlinkDOMPointReadOnly {
   static final instance = new BlinkDOMPoint();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPoint"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DOMPoint");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPoint"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("DOMPoint", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPoint"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("DOMPoint", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPoint"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("DOMPoint", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPoint"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("DOMPoint", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  w_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "w");
+  w_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPoint */, "w");
 
-  w_Setter_(mthis, __arg_0) => mthis["w"] = __arg_0;
+  w_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMPoint */, "w", __arg_0);
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPoint */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMPoint */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPoint */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMPoint */, "y", __arg_0);
 
-  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "z");
+  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPoint */, "z");
 
-  z_Setter_(mthis, __arg_0) => mthis["z"] = __arg_0;
+  z_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMPoint */, "z", __arg_0);
 
 }
 
 class BlinkDOMPointReadOnly {
   static final instance = new BlinkDOMPointReadOnly();
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPointReadOnly"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("DOMPointReadOnly", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPointReadOnly"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("DOMPointReadOnly", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMPointReadOnly"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("DOMPointReadOnly", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  w_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "w");
+  w_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPointReadOnly */, "w");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPointReadOnly */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPointReadOnly */, "y");
 
-  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "z");
+  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMPointReadOnly */, "z");
 
 }
 
 class BlinkDOMRect extends BlinkDOMRectReadOnly {
   static final instance = new BlinkDOMRect();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRect"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DOMRect");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRect"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("DOMRect", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRect"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("DOMRect", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRect"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("DOMRect", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRect"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("DOMRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRect */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMRect */, "height", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRect */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMRect */, "width", __arg_0);
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRect */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMRect */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRect */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMRect */, "y", __arg_0);
 
 }
 
 class BlinkDOMRectReadOnly {
   static final instance = new BlinkDOMRectReadOnly();
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRectReadOnly"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("DOMRectReadOnly", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRectReadOnly"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("DOMRectReadOnly", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DOMRectReadOnly"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("DOMRectReadOnly", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bottom_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bottom");
+  bottom_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "bottom");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "height");
 
-  left_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "left");
+  left_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "left");
 
-  right_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "right");
+  right_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "right");
 
-  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "top");
+  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "top");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMRectReadOnly */, "y");
 
 }
 
 class BlinkDOMSettableTokenList extends BlinkDOMTokenList {
   static final instance = new BlinkDOMSettableTokenList();
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMSettableTokenList */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DOMSettableTokenList */, "value", __arg_0);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMSettableTokenList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMSettableTokenList */, "item", [__arg_0]);
 
 }
 
 class BlinkDOMStringList {
   static final instance = new BlinkDOMStringList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMStringList */, "length");
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringList */, "__getter__", [__arg_0]);
 
-  contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "contains", []);
+  contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringList */, "contains", []);
 
-  contains_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "contains", [__arg_0]);
+  contains_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringList */, "contains", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringList */, "item", [__arg_0]);
 
 }
 
 class BlinkDOMStringMap {
   static final instance = new BlinkDOMStringMap();
 
-  $__delete___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__delete__", [__arg_0]);
+  $__delete___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringMap */, "__delete__", [__arg_0]);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringMap */, "__getter__", [__arg_0]);
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringMap */, "__setter__", [__arg_0, __arg_1]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringMap */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMStringMap */, "item", [__arg_0]);
 
 }
 
 class BlinkDOMTokenList {
   static final instance = new BlinkDOMTokenList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DOMTokenList */, "length");
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "add", [__arg_0]);
 
-  contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "contains", []);
+  contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "contains", []);
 
-  contains_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "contains", [__arg_0]);
+  contains_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "contains", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "item", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "remove", []);
 
-  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
+  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "remove", [__arg_0]);
 
-  toggle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toggle", []);
+  toggle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "toggle", []);
 
-  toggle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "toggle", [__arg_0]);
+  toggle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "toggle", [__arg_0]);
 
-  toggle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "toggle", [__arg_0, __arg_1]);
+  toggle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DOMTokenList */, "toggle", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDataTransfer {
   static final instance = new BlinkDataTransfer();
 
-  dropEffect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dropEffect");
+  dropEffect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransfer */, "dropEffect");
 
-  dropEffect_Setter_(mthis, __arg_0) => mthis["dropEffect"] = __arg_0;
+  dropEffect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DataTransfer */, "dropEffect", __arg_0);
 
-  effectAllowed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "effectAllowed");
+  effectAllowed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransfer */, "effectAllowed");
 
-  effectAllowed_Setter_(mthis, __arg_0) => mthis["effectAllowed"] = __arg_0;
+  effectAllowed_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DataTransfer */, "effectAllowed", __arg_0);
 
-  files_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "files");
+  files_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransfer */, "files");
 
-  items_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "items");
+  items_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransfer */, "items");
 
-  types_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "types");
+  types_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransfer */, "types");
 
-  clearData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearData", []);
+  clearData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "clearData", []);
 
-  clearData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearData", [__arg_0]);
+  clearData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "clearData", [__arg_0]);
 
-  getData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getData", []);
+  getData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "getData", []);
 
-  getData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getData", [__arg_0]);
+  getData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "getData", [__arg_0]);
 
-  setData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setData", []);
+  setData_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "setData", []);
 
-  setData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setData", [__arg_0]);
+  setData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "setData", [__arg_0]);
 
-  setData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setData", [__arg_0, __arg_1]);
+  setData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "setData", [__arg_0, __arg_1]);
 
-  setDragImage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setDragImage", [__arg_0]);
+  setDragImage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "setDragImage", [__arg_0]);
 
-  setDragImage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setDragImage", [__arg_0, __arg_1]);
+  setDragImage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "setDragImage", [__arg_0, __arg_1]);
 
-  setDragImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setDragImage", [__arg_0, __arg_1, __arg_2]);
+  setDragImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DataTransfer */, "setDragImage", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDataTransferItem {
   static final instance = new BlinkDataTransferItem();
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransferItem */, "kind");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransferItem */, "type");
 
-  getAsFile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAsFile", []);
+  getAsFile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItem */, "getAsFile", []);
 
-  getAsString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAsString", []);
+  getAsString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItem */, "getAsString", []);
 
-  getAsString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAsString", [__arg_0]);
+  getAsString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItem */, "getAsString", [__arg_0]);
 
-  webkitGetAsEntry_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetAsEntry", []);
+  webkitGetAsEntry_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItem */, "webkitGetAsEntry", []);
 
 }
 
 class BlinkDataTransferItemList {
   static final instance = new BlinkDataTransferItemList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DataTransferItemList */, "length");
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "add", [__arg_0]);
 
-  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "add", [__arg_0, __arg_1]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "clear", []);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "item", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "remove", []);
 
-  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
+  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DataTransferItemList */, "remove", [__arg_0]);
 
 }
 
@@ -3558,1072 +3558,1072 @@
 class BlinkDatabase {
   static final instance = new BlinkDatabase();
 
-  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Database */, "version");
 
-  changeVersion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", []);
+  changeVersion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "changeVersion", []);
 
-  changeVersion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", [__arg_0]);
+  changeVersion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "changeVersion", [__arg_0]);
 
-  changeVersion_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", [__arg_0, __arg_1]);
+  changeVersion_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "changeVersion", [__arg_0, __arg_1]);
 
-  changeVersion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", [__arg_0, __arg_1, __arg_2]);
+  changeVersion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "changeVersion", [__arg_0, __arg_1, __arg_2]);
 
-  changeVersion_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  changeVersion_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "changeVersion", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  changeVersion_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "changeVersion", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  changeVersion_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "changeVersion", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  readTransaction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readTransaction", []);
+  readTransaction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "readTransaction", []);
 
-  readTransaction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readTransaction", [__arg_0]);
+  readTransaction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "readTransaction", [__arg_0]);
 
-  readTransaction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readTransaction", [__arg_0, __arg_1]);
+  readTransaction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "readTransaction", [__arg_0, __arg_1]);
 
-  readTransaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "readTransaction", [__arg_0, __arg_1, __arg_2]);
+  readTransaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "readTransaction", [__arg_0, __arg_1, __arg_2]);
 
-  transaction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transaction", []);
+  transaction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "transaction", []);
 
-  transaction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0]);
+  transaction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "transaction", [__arg_0]);
 
-  transaction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0, __arg_1]);
+  transaction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "transaction", [__arg_0, __arg_1]);
 
-  transaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0, __arg_1, __arg_2]);
+  transaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Database */, "transaction", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDatabaseCallback {
   static final instance = new BlinkDatabaseCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DatabaseCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DatabaseCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkDedicatedWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkDedicatedWorkerGlobalScope();
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DedicatedWorkerGlobalScope */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* DedicatedWorkerGlobalScope */, "onmessage", __arg_0);
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DedicatedWorkerGlobalScope */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DedicatedWorkerGlobalScope */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DedicatedWorkerGlobalScope */, "postMessage", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDefaultSessionStartEvent extends BlinkEvent {
   static final instance = new BlinkDefaultSessionStartEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DefaultSessionStartEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DefaultSessionStartEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DefaultSessionStartEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("DefaultSessionStartEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DefaultSessionStartEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("DefaultSessionStartEvent", [__arg_0, __arg_1]);
 
-  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "session");
+  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DefaultSessionStartEvent */, "session");
 
 }
 
 class BlinkDelayNode extends BlinkAudioNode {
   static final instance = new BlinkDelayNode();
 
-  delayTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "delayTime");
+  delayTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DelayNode */, "delayTime");
 
 }
 
 class BlinkDeprecatedStorageInfo {
   static final instance = new BlinkDeprecatedStorageInfo();
 
-  queryUsageAndQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryUsageAndQuota", []);
+  queryUsageAndQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "queryUsageAndQuota", []);
 
-  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryUsageAndQuota", [__arg_0]);
+  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "queryUsageAndQuota", [__arg_0]);
 
-  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "queryUsageAndQuota", [__arg_0, __arg_1]);
+  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "queryUsageAndQuota", [__arg_0, __arg_1]);
 
-  queryUsageAndQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "queryUsageAndQuota", [__arg_0, __arg_1, __arg_2]);
+  queryUsageAndQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "queryUsageAndQuota", [__arg_0, __arg_1, __arg_2]);
 
-  requestQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", []);
+  requestQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "requestQuota", []);
 
-  requestQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", [__arg_0]);
+  requestQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "requestQuota", [__arg_0]);
 
-  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", [__arg_0, __arg_1]);
+  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "requestQuota", [__arg_0, __arg_1]);
 
-  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", [__arg_0, __arg_1, __arg_2]);
+  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "requestQuota", [__arg_0, __arg_1, __arg_2]);
 
-  requestQuota_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  requestQuota_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageInfo */, "requestQuota", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkDeprecatedStorageQuota {
   static final instance = new BlinkDeprecatedStorageQuota();
 
-  queryUsageAndQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryUsageAndQuota", []);
+  queryUsageAndQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageQuota */, "queryUsageAndQuota", []);
 
-  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryUsageAndQuota", [__arg_0]);
+  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageQuota */, "queryUsageAndQuota", [__arg_0]);
 
-  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "queryUsageAndQuota", [__arg_0, __arg_1]);
+  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageQuota */, "queryUsageAndQuota", [__arg_0, __arg_1]);
 
-  requestQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", []);
+  requestQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageQuota */, "requestQuota", []);
 
-  requestQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", [__arg_0]);
+  requestQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageQuota */, "requestQuota", [__arg_0]);
 
-  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", [__arg_0, __arg_1]);
+  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageQuota */, "requestQuota", [__arg_0, __arg_1]);
 
-  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "requestQuota", [__arg_0, __arg_1, __arg_2]);
+  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DeprecatedStorageQuota */, "requestQuota", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDeviceAcceleration {
   static final instance = new BlinkDeviceAcceleration();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceAcceleration */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceAcceleration */, "y");
 
-  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "z");
+  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceAcceleration */, "z");
 
 }
 
 class BlinkDeviceLightEvent extends BlinkEvent {
   static final instance = new BlinkDeviceLightEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DeviceLightEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DeviceLightEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DeviceLightEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("DeviceLightEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DeviceLightEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("DeviceLightEvent", [__arg_0, __arg_1]);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceLightEvent */, "value");
 
 }
 
 class BlinkDeviceMotionEvent extends BlinkEvent {
   static final instance = new BlinkDeviceMotionEvent();
 
-  acceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "acceleration");
+  acceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceMotionEvent */, "acceleration");
 
-  accelerationIncludingGravity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accelerationIncludingGravity");
+  accelerationIncludingGravity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceMotionEvent */, "accelerationIncludingGravity");
 
-  interval_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "interval");
+  interval_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceMotionEvent */, "interval");
 
-  rotationRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rotationRate");
+  rotationRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceMotionEvent */, "rotationRate");
 
-  initDeviceMotionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  initDeviceMotionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* DeviceMotionEvent */, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  initDeviceMotionEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  initDeviceMotionEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* DeviceMotionEvent */, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  initDeviceMotionEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  initDeviceMotionEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* DeviceMotionEvent */, "initDeviceMotionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
 }
 
 class BlinkDeviceOrientationEvent extends BlinkEvent {
   static final instance = new BlinkDeviceOrientationEvent();
 
-  absolute_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "absolute");
+  absolute_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceOrientationEvent */, "absolute");
 
-  alpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alpha");
+  alpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceOrientationEvent */, "alpha");
 
-  beta_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "beta");
+  beta_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceOrientationEvent */, "beta");
 
-  gamma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gamma");
+  gamma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceOrientationEvent */, "gamma");
 
-  initDeviceOrientationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  initDeviceOrientationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* DeviceOrientationEvent */, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  initDeviceOrientationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  initDeviceOrientationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* DeviceOrientationEvent */, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  initDeviceOrientationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  initDeviceOrientationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* DeviceOrientationEvent */, "initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
 }
 
 class BlinkDeviceRotationRate {
   static final instance = new BlinkDeviceRotationRate();
 
-  alpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alpha");
+  alpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceRotationRate */, "alpha");
 
-  beta_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "beta");
+  beta_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceRotationRate */, "beta");
 
-  gamma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gamma");
+  gamma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DeviceRotationRate */, "gamma");
 
 }
 
 class BlinkDirectoryEntry extends BlinkEntry {
   static final instance = new BlinkDirectoryEntry();
 
-  createReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createReader", []);
+  createReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "createReader", []);
 
-  getDirectory_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", []);
+  getDirectory_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getDirectory", []);
 
-  getDirectory_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", [__arg_0]);
+  getDirectory_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getDirectory", [__arg_0]);
 
-  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", [__arg_0, __arg_1]);
+  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getDirectory", [__arg_0, __arg_1]);
 
-  getDirectory_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", [__arg_0, __arg_1, __arg_2]);
+  getDirectory_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getDirectory", [__arg_0, __arg_1, __arg_2]);
 
-  getDirectory_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  getDirectory_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getDirectory", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  getFile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFile", []);
+  getFile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getFile", []);
 
-  getFile_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFile", [__arg_0]);
+  getFile_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getFile", [__arg_0]);
 
-  getFile_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFile", [__arg_0, __arg_1]);
+  getFile_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getFile", [__arg_0, __arg_1]);
 
-  getFile_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFile", [__arg_0, __arg_1, __arg_2]);
+  getFile_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getFile", [__arg_0, __arg_1, __arg_2]);
 
-  getFile_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "getFile", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  getFile_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "getFile", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  removeRecursively_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeRecursively", []);
+  removeRecursively_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "removeRecursively", []);
 
-  removeRecursively_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeRecursively", [__arg_0]);
+  removeRecursively_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "removeRecursively", [__arg_0]);
 
-  removeRecursively_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeRecursively", [__arg_0, __arg_1]);
+  removeRecursively_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntry */, "removeRecursively", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDirectoryEntrySync extends BlinkEntrySync {
   static final instance = new BlinkDirectoryEntrySync();
 
-  createReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createReader", []);
+  createReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "createReader", []);
 
-  getDirectory_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", []);
+  getDirectory_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "getDirectory", []);
 
-  getDirectory_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", [__arg_0]);
+  getDirectory_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "getDirectory", [__arg_0]);
 
-  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getDirectory", [__arg_0, __arg_1]);
+  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "getDirectory", [__arg_0, __arg_1]);
 
-  getFile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFile", []);
+  getFile_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "getFile", []);
 
-  getFile_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFile", [__arg_0]);
+  getFile_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "getFile", [__arg_0]);
 
-  getFile_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFile", [__arg_0, __arg_1]);
+  getFile_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "getFile", [__arg_0, __arg_1]);
 
-  removeRecursively_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeRecursively", []);
+  removeRecursively_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryEntrySync */, "removeRecursively", []);
 
 }
 
 class BlinkDirectoryReader {
   static final instance = new BlinkDirectoryReader();
 
-  readEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readEntries", []);
+  readEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryReader */, "readEntries", []);
 
-  readEntries_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readEntries", [__arg_0]);
+  readEntries_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryReader */, "readEntries", [__arg_0]);
 
-  readEntries_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readEntries", [__arg_0, __arg_1]);
+  readEntries_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryReader */, "readEntries", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDirectoryReaderSync {
   static final instance = new BlinkDirectoryReaderSync();
 
-  readEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readEntries", []);
+  readEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* DirectoryReaderSync */, "readEntries", []);
 
 }
 
 class BlinkDocument extends BlinkNode {
   static final instance = new BlinkDocument();
 
-  URL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "URL");
+  URL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "URL");
 
-  activeElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeElement");
+  activeElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "activeElement");
 
-  anchors_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "anchors");
+  anchors_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "anchors");
 
-  applets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "applets");
+  applets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "applets");
 
-  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "body");
+  body_Getter_(mthis) native "Blink_Getter_Document_body";
 
-  body_Setter_(mthis, __arg_0) => mthis["body"] = __arg_0;
+  body_Setter_(mthis, __arg_0) native "Blink_Setter_Document_body";
 
-  characterSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "characterSet");
+  characterSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "characterSet");
 
-  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charset");
+  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "charset");
 
-  compatMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compatMode");
+  compatMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "compatMode");
 
-  contentType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentType");
+  contentType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "contentType");
 
-  cookie_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cookie");
+  cookie_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "cookie");
 
-  cookie_Setter_(mthis, __arg_0) => mthis["cookie"] = __arg_0;
+  cookie_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "cookie", __arg_0);
 
-  currentScript_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentScript");
+  currentScript_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "currentScript");
 
-  defaultCharset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultCharset");
+  defaultCharset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "defaultCharset");
 
-  defaultView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultView");
+  defaultView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "defaultView");
 
-  designMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "designMode");
+  designMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "designMode");
 
-  designMode_Setter_(mthis, __arg_0) => mthis["designMode"] = __arg_0;
+  designMode_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "designMode", __arg_0);
 
-  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dir");
+  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "dir");
 
-  dir_Setter_(mthis, __arg_0) => mthis["dir"] = __arg_0;
+  dir_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "dir", __arg_0);
 
-  doctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "doctype");
+  doctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "doctype");
 
-  documentElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "documentElement");
+  documentElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "documentElement");
 
-  documentURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "documentURI");
+  documentURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "documentURI");
 
-  domain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domain");
+  domain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "domain");
 
-  domain_Setter_(mthis, __arg_0) => mthis["domain"] = __arg_0;
+  domain_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "domain", __arg_0);
 
-  embeds_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "embeds");
+  embeds_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "embeds");
 
-  fonts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fonts");
+  fonts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "fonts");
 
-  forms_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "forms");
+  forms_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "forms");
 
-  fullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullscreenElement");
+  fullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "fullscreenElement");
 
-  fullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullscreenEnabled");
+  fullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "fullscreenEnabled");
 
-  head_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "head");
+  head_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "head");
 
-  hidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hidden");
+  hidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "hidden");
 
-  images_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "images");
+  images_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "images");
 
-  implementation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "implementation");
+  implementation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "implementation");
 
-  inputEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputEncoding");
+  inputEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "inputEncoding");
 
-  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModified");
+  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "lastModified");
 
-  links_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "links");
+  links_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "links");
 
-  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
+  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "location");
 
-  onbeforecopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecopy");
+  onbeforecopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onbeforecopy");
 
-  onbeforecopy_Setter_(mthis, __arg_0) => mthis["onbeforecopy"] = __arg_0;
+  onbeforecopy_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onbeforecopy", __arg_0);
 
-  onbeforecut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecut");
+  onbeforecut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onbeforecut");
 
-  onbeforecut_Setter_(mthis, __arg_0) => mthis["onbeforecut"] = __arg_0;
+  onbeforecut_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onbeforecut", __arg_0);
 
-  onbeforepaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforepaste");
+  onbeforepaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onbeforepaste");
 
-  onbeforepaste_Setter_(mthis, __arg_0) => mthis["onbeforepaste"] = __arg_0;
+  onbeforepaste_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onbeforepaste", __arg_0);
 
-  oncopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncopy");
+  oncopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "oncopy");
 
-  oncopy_Setter_(mthis, __arg_0) => mthis["oncopy"] = __arg_0;
+  oncopy_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "oncopy", __arg_0);
 
-  oncut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncut");
+  oncut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "oncut");
 
-  oncut_Setter_(mthis, __arg_0) => mthis["oncut"] = __arg_0;
+  oncut_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "oncut", __arg_0);
 
-  onfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfullscreenchange");
+  onfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onfullscreenchange");
 
-  onfullscreenchange_Setter_(mthis, __arg_0) => mthis["onfullscreenchange"] = __arg_0;
+  onfullscreenchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onfullscreenchange", __arg_0);
 
-  onfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfullscreenerror");
+  onfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onfullscreenerror");
 
-  onfullscreenerror_Setter_(mthis, __arg_0) => mthis["onfullscreenerror"] = __arg_0;
+  onfullscreenerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onfullscreenerror", __arg_0);
 
-  onpaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpaste");
+  onpaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onpaste");
 
-  onpaste_Setter_(mthis, __arg_0) => mthis["onpaste"] = __arg_0;
+  onpaste_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onpaste", __arg_0);
 
-  onpointerlockchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerlockchange");
+  onpointerlockchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onpointerlockchange");
 
-  onpointerlockchange_Setter_(mthis, __arg_0) => mthis["onpointerlockchange"] = __arg_0;
+  onpointerlockchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onpointerlockchange", __arg_0);
 
-  onpointerlockerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerlockerror");
+  onpointerlockerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onpointerlockerror");
 
-  onpointerlockerror_Setter_(mthis, __arg_0) => mthis["onpointerlockerror"] = __arg_0;
+  onpointerlockerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onpointerlockerror", __arg_0);
 
-  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreadystatechange");
+  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onreadystatechange");
 
-  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
+  onreadystatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onreadystatechange", __arg_0);
 
-  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsearch");
+  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onsearch");
 
-  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
+  onsearch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onsearch", __arg_0);
 
-  onsecuritypolicyviolation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsecuritypolicyviolation");
+  onsecuritypolicyviolation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onsecuritypolicyviolation");
 
-  onsecuritypolicyviolation_Setter_(mthis, __arg_0) => mthis["onsecuritypolicyviolation"] = __arg_0;
+  onsecuritypolicyviolation_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onsecuritypolicyviolation", __arg_0);
 
-  onselectionchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselectionchange");
+  onselectionchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onselectionchange");
 
-  onselectionchange_Setter_(mthis, __arg_0) => mthis["onselectionchange"] = __arg_0;
+  onselectionchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onselectionchange", __arg_0);
 
-  onselectstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselectstart");
+  onselectstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onselectstart");
 
-  onselectstart_Setter_(mthis, __arg_0) => mthis["onselectstart"] = __arg_0;
+  onselectstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onselectstart", __arg_0);
 
-  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchcancel");
+  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "ontouchcancel");
 
-  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
+  ontouchcancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "ontouchcancel", __arg_0);
 
-  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchend");
+  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "ontouchend");
 
-  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
+  ontouchend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "ontouchend", __arg_0);
 
-  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchmove");
+  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "ontouchmove");
 
-  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
+  ontouchmove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "ontouchmove", __arg_0);
 
-  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchstart");
+  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "ontouchstart");
 
-  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
+  ontouchstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "ontouchstart", __arg_0);
 
-  onwebkitfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenchange");
+  onwebkitfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onwebkitfullscreenchange");
 
-  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenchange"] = __arg_0;
+  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onwebkitfullscreenchange", __arg_0);
 
-  onwebkitfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenerror");
+  onwebkitfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onwebkitfullscreenerror");
 
-  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenerror"] = __arg_0;
+  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onwebkitfullscreenerror", __arg_0);
 
-  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwheel");
+  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "onwheel");
 
-  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
+  onwheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "onwheel", __arg_0);
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "origin");
 
-  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "plugins");
+  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "plugins");
 
-  pointerLockElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerLockElement");
+  pointerLockElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "pointerLockElement");
 
-  preferredStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preferredStylesheetSet");
+  preferredStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "preferredStylesheetSet");
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "readyState");
 
-  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referrer");
+  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "referrer");
 
-  rootElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rootElement");
+  rootElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "rootElement");
 
-  scripts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scripts");
+  scripts_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "scripts");
 
-  scrollingElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollingElement");
+  scrollingElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "scrollingElement");
 
-  selectedStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedStylesheetSet");
+  selectedStylesheetSet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "selectedStylesheetSet");
 
-  selectedStylesheetSet_Setter_(mthis, __arg_0) => mthis["selectedStylesheetSet"] = __arg_0;
+  selectedStylesheetSet_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "selectedStylesheetSet", __arg_0);
 
-  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleSheets");
+  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "styleSheets");
 
-  timeline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeline");
+  timeline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "timeline");
 
-  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
+  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "title");
 
-  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
+  title_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "title", __arg_0);
 
-  visibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "visibilityState");
+  visibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "visibilityState");
 
-  webkitCurrentFullScreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitCurrentFullScreenElement");
+  webkitCurrentFullScreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "webkitCurrentFullScreenElement");
 
-  webkitFullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitFullscreenElement");
+  webkitFullscreenElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "webkitFullscreenElement");
 
-  webkitFullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitFullscreenEnabled");
+  webkitFullscreenEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "webkitFullscreenEnabled");
 
-  webkitHidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitHidden");
+  webkitHidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "webkitHidden");
 
-  webkitIsFullScreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitIsFullScreen");
+  webkitIsFullScreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "webkitIsFullScreen");
 
-  webkitVisibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitVisibilityState");
+  webkitVisibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "webkitVisibilityState");
 
-  xmlEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlEncoding");
+  xmlEncoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "xmlEncoding");
 
-  xmlStandalone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlStandalone");
+  xmlStandalone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "xmlStandalone");
 
-  xmlStandalone_Setter_(mthis, __arg_0) => mthis["xmlStandalone"] = __arg_0;
+  xmlStandalone_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "xmlStandalone", __arg_0);
 
-  xmlVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xmlVersion");
+  xmlVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Document */, "xmlVersion");
 
-  xmlVersion_Setter_(mthis, __arg_0) => mthis["xmlVersion"] = __arg_0;
+  xmlVersion_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Document */, "xmlVersion", __arg_0);
 
-  adoptNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "adoptNode", []);
+  adoptNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "adoptNode", []);
 
-  adoptNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "adoptNode", [__arg_0]);
+  adoptNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "adoptNode", [__arg_0]);
 
-  caretRangeFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", []);
+  caretRangeFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "caretRangeFromPoint", []);
 
-  caretRangeFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", [__arg_0]);
+  caretRangeFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "caretRangeFromPoint", [__arg_0]);
 
-  caretRangeFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "caretRangeFromPoint", [__arg_0, __arg_1]);
+  caretRangeFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "caretRangeFromPoint", [__arg_0, __arg_1]);
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "close", []);
 
-  createAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAttribute", []);
+  createAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createAttribute", []);
 
-  createAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createAttribute", [__arg_0]);
+  createAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createAttribute", [__arg_0]);
 
-  createAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAttributeNS", []);
+  createAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createAttributeNS", []);
 
-  createAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createAttributeNS", [__arg_0]);
+  createAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createAttributeNS", [__arg_0]);
 
-  createAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createAttributeNS", [__arg_0, __arg_1]);
+  createAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createAttributeNS", [__arg_0, __arg_1]);
 
-  createCDATASection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createCDATASection", []);
+  createCDATASection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createCDATASection", []);
 
-  createCDATASection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createCDATASection", [__arg_0]);
+  createCDATASection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createCDATASection", [__arg_0]);
 
-  createComment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createComment", []);
+  createComment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createComment", []);
 
-  createComment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createComment", [__arg_0]);
+  createComment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createComment", [__arg_0]);
 
-  createDocumentFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDocumentFragment", []);
+  createDocumentFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createDocumentFragment", []);
 
-  createElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createElement", []);
+  createElement_Callback_0_(mthis) native "Blink_Operation_0_Document_createElement";
 
-  createElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createElement", [__arg_0]);
+  createElement_Callback_1_(mthis, __arg_0) native "Blink_Operation_Document_createElement"; /* __arg_0 */
 
-  createElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createElement", [__arg_0, __arg_1]);
+  createElement_Callback_2_(mthis, __arg_0, __arg_1) native "Blink_Operation_Document_createElement"; /* __arg_0, __arg_1 */
 
-  createElementNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", []);
+  createElementNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createElementNS", []);
 
-  createElementNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0]);
+  createElementNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createElementNS", [__arg_0]);
 
-  createElementNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0, __arg_1]);
+  createElementNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createElementNS", [__arg_0, __arg_1]);
 
-  createElementNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createElementNS", [__arg_0, __arg_1, __arg_2]);
+  createElementNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createElementNS", [__arg_0, __arg_1, __arg_2]);
 
-  createEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createEvent", []);
+  createEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createEvent", []);
 
-  createEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createEvent", [__arg_0]);
+  createEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createEvent", [__arg_0]);
 
-  createExpression_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", []);
+  createExpression_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createExpression", []);
 
-  createExpression_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", [__arg_0]);
+  createExpression_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createExpression", [__arg_0]);
 
-  createExpression_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", [__arg_0, __arg_1]);
+  createExpression_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createExpression", [__arg_0, __arg_1]);
 
-  createNSResolver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createNSResolver", []);
+  createNSResolver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createNSResolver", []);
 
-  createNSResolver_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createNSResolver", [__arg_0]);
+  createNSResolver_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createNSResolver", [__arg_0]);
 
-  createNodeIterator_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", []);
+  createNodeIterator_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createNodeIterator", []);
 
-  createNodeIterator_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0]);
+  createNodeIterator_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createNodeIterator", [__arg_0]);
 
-  createNodeIterator_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0, __arg_1]);
+  createNodeIterator_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createNodeIterator", [__arg_0, __arg_1]);
 
-  createNodeIterator_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createNodeIterator", [__arg_0, __arg_1, __arg_2]);
+  createNodeIterator_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createNodeIterator", [__arg_0, __arg_1, __arg_2]);
 
-  createProcessingInstruction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProcessingInstruction", []);
+  createProcessingInstruction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createProcessingInstruction", []);
 
-  createProcessingInstruction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createProcessingInstruction", [__arg_0]);
+  createProcessingInstruction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createProcessingInstruction", [__arg_0]);
 
-  createProcessingInstruction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createProcessingInstruction", [__arg_0, __arg_1]);
+  createProcessingInstruction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createProcessingInstruction", [__arg_0, __arg_1]);
 
-  createRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRange", []);
+  createRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createRange", []);
 
-  createTextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTextNode", []);
+  createTextNode_Callback_0_(mthis) native "Blink_Operation_0_Document_createTextNode";
 
-  createTextNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTextNode", [__arg_0]);
+  createTextNode_Callback_1_(mthis, __arg_0) native "Blink_Operation_Document_createTextNode"; /* __arg_0 */
 
-  createTouch_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  createTouch_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  createTouch_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  createTouch_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  createTouch_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+  createTouch_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
 
-  createTouchList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTouchList", []);
+  createTouchList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTouchList", []);
 
-  createTouchList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTouchList", [__arg_0]);
+  createTouchList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTouchList", [__arg_0]);
 
-  createTreeWalker_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", []);
+  createTreeWalker_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTreeWalker", []);
 
-  createTreeWalker_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0]);
+  createTreeWalker_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTreeWalker", [__arg_0]);
 
-  createTreeWalker_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0, __arg_1]);
+  createTreeWalker_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTreeWalker", [__arg_0, __arg_1]);
 
-  createTreeWalker_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createTreeWalker", [__arg_0, __arg_1, __arg_2]);
+  createTreeWalker_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "createTreeWalker", [__arg_0, __arg_1, __arg_2]);
 
-  elementFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", []);
+  elementFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "elementFromPoint", []);
 
-  elementFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", [__arg_0]);
+  elementFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "elementFromPoint", [__arg_0]);
 
-  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", [__arg_0, __arg_1]);
+  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "elementFromPoint", [__arg_0, __arg_1]);
 
-  elementsFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", []);
+  elementsFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "elementsFromPoint", []);
 
-  elementsFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0]);
+  elementsFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "elementsFromPoint", [__arg_0]);
 
-  elementsFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0, __arg_1]);
+  elementsFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "elementsFromPoint", [__arg_0, __arg_1]);
 
-  evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0]);
+  evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "evaluate", [__arg_0]);
 
-  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1]);
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "evaluate", [__arg_0, __arg_1]);
 
-  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2]);
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "evaluate", [__arg_0, __arg_1, __arg_2]);
 
-  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  execCommand_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "execCommand", []);
+  execCommand_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "execCommand", []);
 
-  execCommand_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "execCommand", [__arg_0]);
+  execCommand_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "execCommand", [__arg_0]);
 
-  execCommand_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "execCommand", [__arg_0, __arg_1]);
+  execCommand_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "execCommand", [__arg_0, __arg_1]);
 
-  execCommand_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "execCommand", [__arg_0, __arg_1, __arg_2]);
+  execCommand_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "execCommand", [__arg_0, __arg_1, __arg_2]);
 
-  exitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "exitFullscreen", []);
+  exitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "exitFullscreen", []);
 
-  exitPointerLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "exitPointerLock", []);
+  exitPointerLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "exitPointerLock", []);
 
-  getCSSCanvasContext_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getCSSCanvasContext", [__arg_0, __arg_1]);
+  getCSSCanvasContext_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getCSSCanvasContext", [__arg_0, __arg_1]);
 
-  getCSSCanvasContext_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getCSSCanvasContext", [__arg_0, __arg_1, __arg_2]);
+  getCSSCanvasContext_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getCSSCanvasContext", [__arg_0, __arg_1, __arg_2]);
 
-  getCSSCanvasContext_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "getCSSCanvasContext", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  getCSSCanvasContext_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getCSSCanvasContext", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", []);
+  getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByClassName", []);
 
-  getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", [__arg_0]);
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByClassName", [__arg_0]);
 
-  getElementsByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByName", []);
+  getElementsByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByName", []);
 
-  getElementsByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByName", [__arg_0]);
+  getElementsByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByName", [__arg_0]);
 
-  getElementsByTagName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", []);
+  getElementsByTagName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByTagName", []);
 
-  getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", [__arg_0]);
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByTagName", [__arg_0]);
 
-  getElementsByTagNameNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", []);
+  getElementsByTagNameNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByTagNameNS", []);
 
-  getElementsByTagNameNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0]);
+  getElementsByTagNameNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByTagNameNS", [__arg_0]);
 
-  getElementsByTagNameNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0, __arg_1]);
+  getElementsByTagNameNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getElementsByTagNameNS", [__arg_0, __arg_1]);
 
-  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelection", []);
+  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "getSelection", []);
 
-  hasFocus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasFocus", []);
+  hasFocus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "hasFocus", []);
 
-  importNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "importNode", []);
+  importNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "importNode", []);
 
-  importNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "importNode", [__arg_0]);
+  importNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "importNode", [__arg_0]);
 
-  importNode_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "importNode", [__arg_0, __arg_1]);
+  importNode_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "importNode", [__arg_0, __arg_1]);
 
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "open", []);
 
-  queryCommandEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandEnabled", []);
+  queryCommandEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandEnabled", []);
 
-  queryCommandEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandEnabled", [__arg_0]);
+  queryCommandEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandEnabled", [__arg_0]);
 
-  queryCommandIndeterm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandIndeterm", []);
+  queryCommandIndeterm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandIndeterm", []);
 
-  queryCommandIndeterm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandIndeterm", [__arg_0]);
+  queryCommandIndeterm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandIndeterm", [__arg_0]);
 
-  queryCommandState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandState", []);
+  queryCommandState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandState", []);
 
-  queryCommandState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandState", [__arg_0]);
+  queryCommandState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandState", [__arg_0]);
 
-  queryCommandSupported_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandSupported", []);
+  queryCommandSupported_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandSupported", []);
 
-  queryCommandSupported_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandSupported", [__arg_0]);
+  queryCommandSupported_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandSupported", [__arg_0]);
 
-  queryCommandValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandValue", []);
+  queryCommandValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandValue", []);
 
-  queryCommandValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryCommandValue", [__arg_0]);
+  queryCommandValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "queryCommandValue", [__arg_0]);
 
-  transformDocumentToTreeView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transformDocumentToTreeView", []);
+  transformDocumentToTreeView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "transformDocumentToTreeView", []);
 
-  transformDocumentToTreeView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformDocumentToTreeView", [__arg_0]);
+  transformDocumentToTreeView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "transformDocumentToTreeView", [__arg_0]);
 
-  webkitCancelFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelFullScreen", []);
+  webkitCancelFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "webkitCancelFullScreen", []);
 
-  webkitExitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitExitFullscreen", []);
+  webkitExitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "webkitExitFullscreen", []);
 
-  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
+  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "write", []);
 
-  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
+  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "write", [__arg_0]);
 
-  writeln_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "writeln", []);
+  writeln_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "writeln", []);
 
-  writeln_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "writeln", [__arg_0]);
+  writeln_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Document */, "writeln", [__arg_0]);
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onabort", __arg_0);
 
-  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocomplete");
 
-  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+  onautocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocomplete", __arg_0);
 
-  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror");
 
-  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+  onautocompleteerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onblur", __arg_0);
 
-  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncancel");
 
-  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+  oncancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncancel", __arg_0);
 
-  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplay");
 
-  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+  oncanplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplay", __arg_0);
 
-  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough");
 
-  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+  oncanplaythrough_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onchange", __arg_0);
 
-  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclick");
 
-  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+  onclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclick", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclose", __arg_0);
 
-  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncontextmenu");
 
-  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+  oncontextmenu_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncontextmenu", __arg_0);
 
-  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncuechange");
 
-  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+  oncuechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncuechange", __arg_0);
 
-  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondblclick");
 
-  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+  ondblclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondblclick", __arg_0);
 
-  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrag");
 
-  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+  ondrag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrag", __arg_0);
 
-  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragend");
 
-  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+  ondragend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragend", __arg_0);
 
-  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragenter");
 
-  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+  ondragenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragenter", __arg_0);
 
-  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragleave");
 
-  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+  ondragleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragleave", __arg_0);
 
-  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragover");
 
-  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+  ondragover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragover", __arg_0);
 
-  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragstart");
 
-  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+  ondragstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragstart", __arg_0);
 
-  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrop");
 
-  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+  ondrop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrop", __arg_0);
 
-  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondurationchange");
 
-  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+  ondurationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondurationchange", __arg_0);
 
-  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onemptied");
 
-  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+  onemptied_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onemptied", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onended", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onfocus", __arg_0);
 
-  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninput");
 
-  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+  oninput_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninput", __arg_0);
 
-  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninvalid");
 
-  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+  oninvalid_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninvalid", __arg_0);
 
-  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeydown");
 
-  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+  onkeydown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeydown", __arg_0);
 
-  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeypress");
 
-  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+  onkeypress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeypress", __arg_0);
 
-  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeyup");
 
-  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+  onkeyup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeyup", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onload", __arg_0);
 
-  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadeddata");
 
-  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+  onloadeddata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadeddata", __arg_0);
 
-  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata");
 
-  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+  onloadedmetadata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadstart", __arg_0);
 
-  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousedown");
 
-  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+  onmousedown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousedown", __arg_0);
 
-  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseenter");
 
-  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+  onmouseenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseenter", __arg_0);
 
-  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseleave");
 
-  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+  onmouseleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseleave", __arg_0);
 
-  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousemove");
 
-  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+  onmousemove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousemove", __arg_0);
 
-  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseout");
 
-  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+  onmouseout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseout", __arg_0);
 
-  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseover");
 
-  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+  onmouseover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseover", __arg_0);
 
-  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseup");
 
-  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+  onmouseup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseup", __arg_0);
 
-  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousewheel");
 
-  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+  onmousewheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousewheel", __arg_0);
 
-  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpause");
 
-  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+  onpause_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpause", __arg_0);
 
-  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplay");
 
-  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+  onplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplay", __arg_0);
 
-  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplaying");
 
-  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+  onplaying_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplaying", __arg_0);
 
-  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointercancel");
 
-  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointercancel", __arg_0);
 
-  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerdown");
 
-  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+  onpointerdown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerdown", __arg_0);
 
-  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerenter");
 
-  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+  onpointerenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerenter", __arg_0);
 
-  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerleave");
 
-  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+  onpointerleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerleave", __arg_0);
 
-  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointermove");
 
-  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+  onpointermove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointermove", __arg_0);
 
-  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerout");
 
-  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+  onpointerout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerout", __arg_0);
 
-  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerover");
 
-  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+  onpointerover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerover", __arg_0);
 
-  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerup");
 
-  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+  onpointerup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerup", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onprogress", __arg_0);
 
-  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onratechange");
 
-  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+  onratechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onratechange", __arg_0);
 
-  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onreset");
 
-  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+  onreset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onreset", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onscroll", __arg_0);
 
-  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeked");
 
-  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+  onseeked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeked", __arg_0);
 
-  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeking");
 
-  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+  onseeking_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeking", __arg_0);
 
-  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onselect");
 
-  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+  onselect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onselect", __arg_0);
 
-  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onshow");
 
-  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+  onshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onshow", __arg_0);
 
-  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onstalled");
 
-  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+  onstalled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onstalled", __arg_0);
 
-  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsubmit");
 
-  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+  onsubmit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsubmit", __arg_0);
 
-  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsuspend");
 
-  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+  onsuspend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsuspend", __arg_0);
 
-  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontimeupdate");
 
-  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+  ontimeupdate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontimeupdate", __arg_0);
 
-  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontoggle");
 
-  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+  ontoggle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontoggle", __arg_0);
 
-  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onvolumechange");
 
-  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+  onvolumechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onvolumechange", __arg_0);
 
-  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onwaiting");
 
-  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+  onwaiting_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onwaiting", __arg_0);
 
-  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
+  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ParentNode */, "childElementCount");
 
-  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
+  children_Getter_(mthis) native "Blink_Getter_ParentNode_children";
 
-  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
+  firstElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_firstElementChild";
 
-  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
+  lastElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_lastElementChild";
 
-  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", []);
 
-  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", [__arg_0]);
 
-  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", []);
 
-  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", [__arg_0]);
 
-  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
+  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", []);
 
-  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
+  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", [__arg_0]);
 
-  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", []);
 
-  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", [__arg_0]);
 
-  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
+  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NonElementParentNode */, "getElementById", []);
 
-  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
+  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NonElementParentNode */, "getElementById", [__arg_0]);
 
 }
 
 class BlinkDocumentFragment extends BlinkNode {
   static final instance = new BlinkDocumentFragment();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "DocumentFragment"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("DocumentFragment");
 
-  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
+  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ParentNode */, "childElementCount");
 
-  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
+  children_Getter_(mthis) native "Blink_Getter_ParentNode_children";
 
-  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
+  firstElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_firstElementChild";
 
-  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
+  lastElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_lastElementChild";
 
-  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", []);
 
-  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", [__arg_0]);
 
-  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", []);
 
-  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", [__arg_0]);
 
-  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
+  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", []);
 
-  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
+  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", [__arg_0]);
 
-  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", []);
 
-  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", [__arg_0]);
 
-  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
+  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NonElementParentNode */, "getElementById", []);
 
-  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
+  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NonElementParentNode */, "getElementById", [__arg_0]);
 
 }
 
 class BlinkDocumentType extends BlinkNode {
   static final instance = new BlinkDocumentType();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DocumentType */, "name");
 
-  publicId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "publicId");
+  publicId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DocumentType */, "publicId");
 
-  systemId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemId");
+  systemId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DocumentType */, "systemId");
 
-  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", []);
 
-  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", [__arg_0]);
 
-  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", []);
 
-  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) native "Blink_Operation_0_ChildNode_remove";
 
-  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", []);
 
-  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", [__arg_0]);
 
 }
 
 class BlinkDynamicsCompressorNode extends BlinkAudioNode {
   static final instance = new BlinkDynamicsCompressorNode();
 
-  attack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attack");
+  attack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DynamicsCompressorNode */, "attack");
 
-  knee_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "knee");
+  knee_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DynamicsCompressorNode */, "knee");
 
-  ratio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ratio");
+  ratio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DynamicsCompressorNode */, "ratio");
 
-  reduction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reduction");
+  reduction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DynamicsCompressorNode */, "reduction");
 
-  release_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "release");
+  release_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DynamicsCompressorNode */, "release");
 
-  threshold_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "threshold");
+  threshold_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* DynamicsCompressorNode */, "threshold");
 
 }
 
@@ -4660,1154 +4660,1154 @@
 class BlinkElement extends BlinkNode {
   static final instance = new BlinkElement();
 
-  attributes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attributes");
+  attributes_Getter_(mthis) native "Blink_Getter_Element_attributes";
 
-  classList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "classList");
+  classList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "classList");
 
-  className_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "className");
+  className_Getter_(mthis) native "Blink_Getter_Element_className";
 
-  className_Setter_(mthis, __arg_0) => mthis["className"] = __arg_0;
+  className_Setter_(mthis, __arg_0) native "Blink_Setter_Element_className";
 
-  clientHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientHeight");
+  clientHeight_Getter_(mthis) native "Blink_Getter_Element_clientHeight";
 
-  clientLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientLeft");
+  clientLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "clientLeft");
 
-  clientTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientTop");
+  clientTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "clientTop");
 
-  clientWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientWidth");
+  clientWidth_Getter_(mthis) native "Blink_Getter_Element_clientWidth";
 
-  computedName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "computedName");
+  computedName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "computedName");
 
-  computedRole_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "computedRole");
+  computedRole_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "computedRole");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) native "Blink_Getter_Element_id";
 
-  id_Setter_(mthis, __arg_0) => mthis["id"] = __arg_0;
+  id_Setter_(mthis, __arg_0) native "Blink_Setter_Element_id";
 
-  innerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerHTML");
+  innerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "innerHTML");
 
-  innerHTML_Setter_(mthis, __arg_0) => mthis["innerHTML"] = __arg_0;
+  innerHTML_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "innerHTML", __arg_0);
 
-  localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localName");
+  localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "localName");
 
-  namespaceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "namespaceURI");
+  namespaceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "namespaceURI");
 
-  offsetHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetHeight");
+  offsetHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "offsetHeight");
 
-  offsetLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetLeft");
+  offsetLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "offsetLeft");
 
-  offsetParent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetParent");
+  offsetParent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "offsetParent");
 
-  offsetTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetTop");
+  offsetTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "offsetTop");
 
-  offsetWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetWidth");
+  offsetWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "offsetWidth");
 
-  onbeforecopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecopy");
+  onbeforecopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onbeforecopy");
 
-  onbeforecopy_Setter_(mthis, __arg_0) => mthis["onbeforecopy"] = __arg_0;
+  onbeforecopy_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onbeforecopy", __arg_0);
 
-  onbeforecut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforecut");
+  onbeforecut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onbeforecut");
 
-  onbeforecut_Setter_(mthis, __arg_0) => mthis["onbeforecut"] = __arg_0;
+  onbeforecut_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onbeforecut", __arg_0);
 
-  onbeforepaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforepaste");
+  onbeforepaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onbeforepaste");
 
-  onbeforepaste_Setter_(mthis, __arg_0) => mthis["onbeforepaste"] = __arg_0;
+  onbeforepaste_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onbeforepaste", __arg_0);
 
-  oncopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncopy");
+  oncopy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "oncopy");
 
-  oncopy_Setter_(mthis, __arg_0) => mthis["oncopy"] = __arg_0;
+  oncopy_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "oncopy", __arg_0);
 
-  oncut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncut");
+  oncut_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "oncut");
 
-  oncut_Setter_(mthis, __arg_0) => mthis["oncut"] = __arg_0;
+  oncut_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "oncut", __arg_0);
 
-  onpaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpaste");
+  onpaste_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onpaste");
 
-  onpaste_Setter_(mthis, __arg_0) => mthis["onpaste"] = __arg_0;
+  onpaste_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onpaste", __arg_0);
 
-  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsearch");
+  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onsearch");
 
-  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
+  onsearch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onsearch", __arg_0);
 
-  onselectstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselectstart");
+  onselectstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onselectstart");
 
-  onselectstart_Setter_(mthis, __arg_0) => mthis["onselectstart"] = __arg_0;
+  onselectstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onselectstart", __arg_0);
 
-  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchcancel");
+  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "ontouchcancel");
 
-  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
+  ontouchcancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "ontouchcancel", __arg_0);
 
-  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchend");
+  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "ontouchend");
 
-  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
+  ontouchend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "ontouchend", __arg_0);
 
-  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchmove");
+  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "ontouchmove");
 
-  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
+  ontouchmove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "ontouchmove", __arg_0);
 
-  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchstart");
+  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "ontouchstart");
 
-  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
+  ontouchstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "ontouchstart", __arg_0);
 
-  onwebkitfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenchange");
+  onwebkitfullscreenchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onwebkitfullscreenchange");
 
-  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenchange"] = __arg_0;
+  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onwebkitfullscreenchange", __arg_0);
 
-  onwebkitfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitfullscreenerror");
+  onwebkitfullscreenerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onwebkitfullscreenerror");
 
-  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenerror"] = __arg_0;
+  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onwebkitfullscreenerror", __arg_0);
 
-  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwheel");
+  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "onwheel");
 
-  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
+  onwheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "onwheel", __arg_0);
 
-  outerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerHTML");
+  outerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "outerHTML");
 
-  outerHTML_Setter_(mthis, __arg_0) => mthis["outerHTML"] = __arg_0;
+  outerHTML_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "outerHTML", __arg_0);
 
-  prefix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "prefix");
+  prefix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "prefix");
 
-  scrollHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollHeight");
+  scrollHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "scrollHeight");
 
-  scrollLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollLeft");
+  scrollLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "scrollLeft");
 
-  scrollLeft_Setter_(mthis, __arg_0) => mthis["scrollLeft"] = __arg_0;
+  scrollLeft_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "scrollLeft", __arg_0);
 
-  scrollTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollTop");
+  scrollTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "scrollTop");
 
-  scrollTop_Setter_(mthis, __arg_0) => mthis["scrollTop"] = __arg_0;
+  scrollTop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Element */, "scrollTop", __arg_0);
 
-  scrollWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollWidth");
+  scrollWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "scrollWidth");
 
-  shadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shadowRoot");
+  shadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Element */, "shadowRoot");
 
-  tagName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tagName");
+  tagName_Getter_(mthis) native "Blink_Getter_Element_tagName";
 
-  animate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "animate", []);
+  animate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "animate", []);
 
-  animate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "animate", [__arg_0]);
+  animate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "animate", [__arg_0]);
 
-  animate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "animate", [__arg_0, __arg_1]);
+  animate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "animate", [__arg_0, __arg_1]);
 
-  closest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closest", []);
+  closest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "closest", []);
 
-  closest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "closest", [__arg_0]);
+  closest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "closest", [__arg_0]);
 
-  createShadowRoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShadowRoot", []);
+  createShadowRoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "createShadowRoot", []);
 
-  createShadowRoot_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShadowRoot", [__arg_0]);
+  createShadowRoot_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "createShadowRoot", [__arg_0]);
 
-  getAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAnimations", []);
+  getAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAnimations", []);
 
-  getAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribute", []);
+  getAttribute_Callback_0_(mthis) native "Blink_Operation_0_Element_getAttribute";
 
-  getAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribute", [__arg_0]);
+  getAttribute_Callback_1_(mthis, __arg_0) native "Blink_Operation_Element_getAttribute"; /* __arg_0 */
 
-  getAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", []);
+  getAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNS", []);
 
-  getAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", [__arg_0]);
+  getAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNS", [__arg_0]);
 
-  getAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNS", [__arg_0, __arg_1]);
+  getAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNS", [__arg_0, __arg_1]);
 
-  getAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNode", []);
+  getAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNode", []);
 
-  getAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNode", [__arg_0]);
+  getAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNode", [__arg_0]);
 
-  getAttributeNodeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNodeNS", []);
+  getAttributeNodeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNodeNS", []);
 
-  getAttributeNodeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNodeNS", [__arg_0]);
+  getAttributeNodeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNodeNS", [__arg_0]);
 
-  getAttributeNodeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttributeNodeNS", [__arg_0, __arg_1]);
+  getAttributeNodeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getAttributeNodeNS", [__arg_0, __arg_1]);
 
-  getBoundingClientRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBoundingClientRect", []);
+  getBoundingClientRect_Callback_0_(mthis) native "Blink_Operation_0_Element_getBoundingClientRect";
 
-  getClientRects_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getClientRects", []);
+  getClientRects_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getClientRects", []);
 
-  getDestinationInsertionPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDestinationInsertionPoints", []);
+  getDestinationInsertionPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getDestinationInsertionPoints", []);
 
-  getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", []);
+  getElementsByClassName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getElementsByClassName", []);
 
-  getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByClassName", [__arg_0]);
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getElementsByClassName", [__arg_0]);
 
-  getElementsByTagName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", []);
+  getElementsByTagName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getElementsByTagName", []);
 
-  getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagName", [__arg_0]);
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getElementsByTagName", [__arg_0]);
 
-  getElementsByTagNameNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", []);
+  getElementsByTagNameNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getElementsByTagNameNS", []);
 
-  getElementsByTagNameNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0]);
+  getElementsByTagNameNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getElementsByTagNameNS", [__arg_0]);
 
-  getElementsByTagNameNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getElementsByTagNameNS", [__arg_0, __arg_1]);
+  getElementsByTagNameNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "getElementsByTagNameNS", [__arg_0, __arg_1]);
 
-  hasAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttribute", []);
+  hasAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "hasAttribute", []);
 
-  hasAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasAttribute", [__arg_0]);
+  hasAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "hasAttribute", [__arg_0]);
 
-  hasAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", []);
+  hasAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "hasAttributeNS", []);
 
-  hasAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", [__arg_0]);
+  hasAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "hasAttributeNS", [__arg_0]);
 
-  hasAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributeNS", [__arg_0, __arg_1]);
+  hasAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "hasAttributeNS", [__arg_0, __arg_1]);
 
-  hasAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasAttributes", []);
+  hasAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "hasAttributes", []);
 
-  insertAdjacentElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", []);
+  insertAdjacentElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentElement", []);
 
-  insertAdjacentElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", [__arg_0]);
+  insertAdjacentElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentElement", [__arg_0]);
 
-  insertAdjacentElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentElement", [__arg_0, __arg_1]);
+  insertAdjacentElement_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentElement", [__arg_0, __arg_1]);
 
-  insertAdjacentHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", []);
+  insertAdjacentHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentHTML", []);
 
-  insertAdjacentHTML_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", [__arg_0]);
+  insertAdjacentHTML_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentHTML", [__arg_0]);
 
-  insertAdjacentHTML_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentHTML", [__arg_0, __arg_1]);
+  insertAdjacentHTML_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentHTML", [__arg_0, __arg_1]);
 
-  insertAdjacentText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", []);
+  insertAdjacentText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentText", []);
 
-  insertAdjacentText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", [__arg_0]);
+  insertAdjacentText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentText", [__arg_0]);
 
-  insertAdjacentText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertAdjacentText", [__arg_0, __arg_1]);
+  insertAdjacentText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "insertAdjacentText", [__arg_0, __arg_1]);
 
-  matches_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matches", []);
+  matches_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "matches", []);
 
-  matches_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matches", [__arg_0]);
+  matches_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "matches", [__arg_0]);
 
-  removeAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttribute", []);
+  removeAttribute_Callback_0_(mthis) native "Blink_Operation_0_Element_removeAttribute";
 
-  removeAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttribute", [__arg_0]);
+  removeAttribute_Callback_1_(mthis, __arg_0) native "Blink_Operation_Element_removeAttribute"; /* __arg_0 */
 
-  removeAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", []);
+  removeAttributeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "removeAttributeNS", []);
 
-  removeAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", [__arg_0]);
+  removeAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "removeAttributeNS", [__arg_0]);
 
-  removeAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNS", [__arg_0, __arg_1]);
+  removeAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "removeAttributeNS", [__arg_0, __arg_1]);
 
-  removeAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNode", []);
+  removeAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "removeAttributeNode", []);
 
-  removeAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeAttributeNode", [__arg_0]);
+  removeAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "removeAttributeNode", [__arg_0]);
 
-  requestFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestFullscreen", []);
+  requestFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "requestFullscreen", []);
 
-  requestPointerLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestPointerLock", []);
+  requestPointerLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "requestPointerLock", []);
 
-  scroll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scroll", []);
+  scroll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scroll", []);
 
-  scroll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0]);
+  scroll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scroll", [__arg_0]);
 
-  scroll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1]);
+  scroll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scroll", [__arg_0, __arg_1]);
 
-  scrollBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", []);
+  scrollBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollBy", []);
 
-  scrollBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0]);
+  scrollBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollBy", [__arg_0]);
 
-  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1]);
+  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollBy", [__arg_0, __arg_1]);
 
-  scrollIntoView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoView", []);
+  scrollIntoView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollIntoView", []);
 
-  scrollIntoView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoView", [__arg_0]);
+  scrollIntoView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollIntoView", [__arg_0]);
 
-  scrollIntoViewIfNeeded_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoViewIfNeeded", []);
+  scrollIntoViewIfNeeded_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollIntoViewIfNeeded", []);
 
-  scrollIntoViewIfNeeded_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollIntoViewIfNeeded", [__arg_0]);
+  scrollIntoViewIfNeeded_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollIntoViewIfNeeded", [__arg_0]);
 
-  scrollTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", []);
+  scrollTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollTo", []);
 
-  scrollTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0]);
+  scrollTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollTo", [__arg_0]);
 
-  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1]);
+  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "scrollTo", [__arg_0, __arg_1]);
 
-  setAttribute_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setAttribute", []);
+  setAttribute_Callback_0_(mthis) native "Blink_Operation_0_Element_setAttribute";
 
-  setAttribute_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttribute", [__arg_0]);
+  setAttribute_Callback_1_(mthis, __arg_0) native "Blink_Operation_Element_setAttribute"; /* __arg_0 */
 
-  setAttribute_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setAttribute", [__arg_0, __arg_1]);
+  setAttribute_Callback_2_(mthis, __arg_0, __arg_1) native "Blink_Operation_Element_setAttribute"; /* __arg_0, __arg_1 */
 
-  setAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0]);
+  setAttributeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "setAttributeNS", [__arg_0]);
 
-  setAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0, __arg_1]);
+  setAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "setAttributeNS", [__arg_0, __arg_1]);
 
-  setAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNS", [__arg_0, __arg_1, __arg_2]);
+  setAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "setAttributeNS", [__arg_0, __arg_1, __arg_2]);
 
-  setAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNode", []);
+  setAttributeNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "setAttributeNode", []);
 
-  setAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNode", [__arg_0]);
+  setAttributeNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "setAttributeNode", [__arg_0]);
 
-  setAttributeNodeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNodeNS", []);
+  setAttributeNodeNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "setAttributeNodeNS", []);
 
-  setAttributeNodeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setAttributeNodeNS", [__arg_0]);
+  setAttributeNodeNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "setAttributeNodeNS", [__arg_0]);
 
-  webkitMatchesSelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitMatchesSelector", []);
+  webkitMatchesSelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "webkitMatchesSelector", []);
 
-  webkitMatchesSelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitMatchesSelector", [__arg_0]);
+  webkitMatchesSelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "webkitMatchesSelector", [__arg_0]);
 
-  webkitRequestFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFullScreen", []);
+  webkitRequestFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Element */, "webkitRequestFullScreen", []);
 
-  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
+  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ParentNode */, "childElementCount");
 
-  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
+  children_Getter_(mthis) native "Blink_Getter_ParentNode_children";
 
-  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
+  firstElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_firstElementChild";
 
-  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
+  lastElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_lastElementChild";
 
-  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", []);
 
-  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", [__arg_0]);
 
-  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", []);
 
-  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", [__arg_0]);
 
-  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
+  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", []);
 
-  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
+  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", [__arg_0]);
 
-  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", []);
 
-  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", [__arg_0]);
 
-  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "after", []);
+  after_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", []);
 
-  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "after", [__arg_0]);
+  after_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "after", [__arg_0]);
 
-  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "before", []);
+  before_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", []);
 
-  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "before", [__arg_0]);
+  before_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "before", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) native "Blink_Operation_0_ChildNode_remove";
 
-  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", []);
+  replaceWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", []);
 
-  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceWith", [__arg_0]);
+  replaceWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ChildNode */, "replaceWith", [__arg_0]);
 
-  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
+  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NonDocumentTypeChildNode */, "nextElementSibling");
 
-  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
+  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NonDocumentTypeChildNode */, "previousElementSibling");
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onabort", __arg_0);
 
-  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocomplete");
 
-  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+  onautocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocomplete", __arg_0);
 
-  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror");
 
-  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+  onautocompleteerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onblur", __arg_0);
 
-  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncancel");
 
-  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+  oncancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncancel", __arg_0);
 
-  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplay");
 
-  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+  oncanplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplay", __arg_0);
 
-  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough");
 
-  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+  oncanplaythrough_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onchange", __arg_0);
 
-  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclick");
 
-  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+  onclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclick", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclose", __arg_0);
 
-  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncontextmenu");
 
-  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+  oncontextmenu_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncontextmenu", __arg_0);
 
-  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncuechange");
 
-  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+  oncuechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncuechange", __arg_0);
 
-  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondblclick");
 
-  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+  ondblclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondblclick", __arg_0);
 
-  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrag");
 
-  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+  ondrag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrag", __arg_0);
 
-  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragend");
 
-  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+  ondragend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragend", __arg_0);
 
-  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragenter");
 
-  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+  ondragenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragenter", __arg_0);
 
-  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragleave");
 
-  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+  ondragleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragleave", __arg_0);
 
-  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragover");
 
-  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+  ondragover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragover", __arg_0);
 
-  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragstart");
 
-  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+  ondragstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragstart", __arg_0);
 
-  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrop");
 
-  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+  ondrop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrop", __arg_0);
 
-  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondurationchange");
 
-  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+  ondurationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondurationchange", __arg_0);
 
-  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onemptied");
 
-  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+  onemptied_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onemptied", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onended", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onfocus", __arg_0);
 
-  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninput");
 
-  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+  oninput_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninput", __arg_0);
 
-  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninvalid");
 
-  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+  oninvalid_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninvalid", __arg_0);
 
-  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeydown");
 
-  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+  onkeydown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeydown", __arg_0);
 
-  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeypress");
 
-  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+  onkeypress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeypress", __arg_0);
 
-  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeyup");
 
-  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+  onkeyup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeyup", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onload", __arg_0);
 
-  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadeddata");
 
-  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+  onloadeddata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadeddata", __arg_0);
 
-  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata");
 
-  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+  onloadedmetadata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadstart", __arg_0);
 
-  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousedown");
 
-  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+  onmousedown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousedown", __arg_0);
 
-  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseenter");
 
-  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+  onmouseenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseenter", __arg_0);
 
-  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseleave");
 
-  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+  onmouseleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseleave", __arg_0);
 
-  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousemove");
 
-  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+  onmousemove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousemove", __arg_0);
 
-  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseout");
 
-  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+  onmouseout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseout", __arg_0);
 
-  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseover");
 
-  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+  onmouseover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseover", __arg_0);
 
-  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseup");
 
-  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+  onmouseup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseup", __arg_0);
 
-  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousewheel");
 
-  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+  onmousewheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousewheel", __arg_0);
 
-  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpause");
 
-  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+  onpause_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpause", __arg_0);
 
-  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplay");
 
-  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+  onplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplay", __arg_0);
 
-  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplaying");
 
-  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+  onplaying_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplaying", __arg_0);
 
-  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointercancel");
 
-  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointercancel", __arg_0);
 
-  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerdown");
 
-  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+  onpointerdown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerdown", __arg_0);
 
-  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerenter");
 
-  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+  onpointerenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerenter", __arg_0);
 
-  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerleave");
 
-  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+  onpointerleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerleave", __arg_0);
 
-  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointermove");
 
-  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+  onpointermove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointermove", __arg_0);
 
-  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerout");
 
-  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+  onpointerout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerout", __arg_0);
 
-  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerover");
 
-  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+  onpointerover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerover", __arg_0);
 
-  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerup");
 
-  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+  onpointerup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerup", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onprogress", __arg_0);
 
-  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onratechange");
 
-  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+  onratechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onratechange", __arg_0);
 
-  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onreset");
 
-  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+  onreset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onreset", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onscroll", __arg_0);
 
-  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeked");
 
-  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+  onseeked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeked", __arg_0);
 
-  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeking");
 
-  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+  onseeking_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeking", __arg_0);
 
-  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onselect");
 
-  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+  onselect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onselect", __arg_0);
 
-  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onshow");
 
-  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+  onshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onshow", __arg_0);
 
-  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onstalled");
 
-  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+  onstalled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onstalled", __arg_0);
 
-  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsubmit");
 
-  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+  onsubmit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsubmit", __arg_0);
 
-  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsuspend");
 
-  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+  onsuspend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsuspend", __arg_0);
 
-  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontimeupdate");
 
-  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+  ontimeupdate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontimeupdate", __arg_0);
 
-  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontoggle");
 
-  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+  ontoggle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontoggle", __arg_0);
 
-  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onvolumechange");
 
-  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+  onvolumechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onvolumechange", __arg_0);
 
-  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onwaiting");
 
-  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+  onwaiting_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onwaiting", __arg_0);
 
 }
 
 class BlinkEntriesCallback {
   static final instance = new BlinkEntriesCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntriesCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EntriesCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkEntry {
   static final instance = new BlinkEntry();
 
-  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filesystem");
+  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Entry */, "filesystem");
 
-  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullPath");
+  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Entry */, "fullPath");
 
-  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isDirectory");
+  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Entry */, "isDirectory");
 
-  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFile");
+  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Entry */, "isFile");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Entry */, "name");
 
-  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", []);
+  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "copyTo", []);
 
-  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0]);
+  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "copyTo", [__arg_0]);
 
-  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1]);
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "copyTo", [__arg_0, __arg_1]);
 
-  copyTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1, __arg_2]);
+  copyTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "copyTo", [__arg_0, __arg_1, __arg_2]);
 
-  copyTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  copyTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "copyTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", []);
+  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "getMetadata", []);
 
-  getMetadata_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", [__arg_0]);
+  getMetadata_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "getMetadata", [__arg_0]);
 
-  getMetadata_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", [__arg_0, __arg_1]);
+  getMetadata_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "getMetadata", [__arg_0, __arg_1]);
 
-  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParent", []);
+  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "getParent", []);
 
-  getParent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParent", [__arg_0]);
+  getParent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "getParent", [__arg_0]);
 
-  getParent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getParent", [__arg_0, __arg_1]);
+  getParent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "getParent", [__arg_0, __arg_1]);
 
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "moveTo", []);
 
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "moveTo", [__arg_0]);
 
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "moveTo", [__arg_0, __arg_1]);
 
-  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1, __arg_2]);
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "moveTo", [__arg_0, __arg_1, __arg_2]);
 
-  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "moveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "remove", []);
 
-  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
+  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "remove", [__arg_0]);
 
-  remove_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0, __arg_1]);
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "remove", [__arg_0, __arg_1]);
 
-  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toURL", []);
+  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Entry */, "toURL", []);
 
 }
 
 class BlinkEntryCallback {
   static final instance = new BlinkEntryCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntryCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EntryCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkEntrySync {
   static final instance = new BlinkEntrySync();
 
-  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filesystem");
+  filesystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EntrySync */, "filesystem");
 
-  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fullPath");
+  fullPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EntrySync */, "fullPath");
 
-  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isDirectory");
+  isDirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EntrySync */, "isDirectory");
 
-  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFile");
+  isFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EntrySync */, "isFile");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EntrySync */, "name");
 
-  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", []);
+  copyTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "copyTo", []);
 
-  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0]);
+  copyTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "copyTo", [__arg_0]);
 
-  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "copyTo", [__arg_0, __arg_1]);
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "copyTo", [__arg_0, __arg_1]);
 
-  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMetadata", []);
+  getMetadata_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "getMetadata", []);
 
-  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParent", []);
+  getParent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "getParent", []);
 
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "moveTo", []);
 
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "moveTo", [__arg_0]);
 
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "moveTo", [__arg_0, __arg_1]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "remove", []);
 
-  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toURL", []);
+  toURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EntrySync */, "toURL", []);
 
 }
 
 class BlinkErrorCallback {
   static final instance = new BlinkErrorCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ErrorCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ErrorCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkErrorEvent extends BlinkEvent {
   static final instance = new BlinkErrorEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ErrorEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ErrorEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ErrorEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ErrorEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ErrorEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ErrorEvent", [__arg_0, __arg_1]);
 
-  colno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "colno");
+  colno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ErrorEvent */, "colno");
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ErrorEvent */, "error");
 
-  filename_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filename");
+  filename_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ErrorEvent */, "filename");
 
-  lineno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineno");
+  lineno_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ErrorEvent */, "lineno");
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ErrorEvent */, "message");
 
 }
 
 class BlinkEvent {
   static final instance = new BlinkEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Event"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Event");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Event"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Event", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Event"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("Event", [__arg_0, __arg_1]);
 
-  bubbles_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bubbles");
+  bubbles_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "bubbles");
 
-  cancelBubble_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cancelBubble");
+  cancelBubble_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "cancelBubble");
 
-  cancelBubble_Setter_(mthis, __arg_0) => mthis["cancelBubble"] = __arg_0;
+  cancelBubble_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Event */, "cancelBubble", __arg_0);
 
-  cancelable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cancelable");
+  cancelable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "cancelable");
 
-  currentTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTarget");
+  currentTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "currentTarget");
 
-  defaultPrevented_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultPrevented");
+  defaultPrevented_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "defaultPrevented");
 
-  eventPhase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "eventPhase");
+  eventPhase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "eventPhase");
 
-  path_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "path");
+  path_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "path");
 
-  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
+  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "returnValue");
 
-  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
+  returnValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Event */, "returnValue", __arg_0);
 
-  srcElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "srcElement");
+  srcElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "srcElement");
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) native "Blink_Getter_Event_target";
 
-  timeStamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeStamp");
+  timeStamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "timeStamp");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Event */, "type");
 
-  initEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0]);
+  initEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Event */, "initEvent", [__arg_0]);
 
-  initEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0, __arg_1]);
+  initEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Event */, "initEvent", [__arg_0, __arg_1]);
 
-  initEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initEvent", [__arg_0, __arg_1, __arg_2]);
+  initEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Event */, "initEvent", [__arg_0, __arg_1, __arg_2]);
 
-  preventDefault_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "preventDefault", []);
+  preventDefault_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Event */, "preventDefault", []);
 
-  stopImmediatePropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stopImmediatePropagation", []);
+  stopImmediatePropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Event */, "stopImmediatePropagation", []);
 
-  stopPropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stopPropagation", []);
+  stopPropagation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Event */, "stopPropagation", []);
 
 }
 
 class BlinkEventListener {
   static final instance = new BlinkEventListener();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EventListener */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EventListener */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkEventSource extends BlinkEventTarget {
   static final instance = new BlinkEventSource();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("EventSource");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("EventSource", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "EventSource"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("EventSource", [__arg_0, __arg_1]);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EventSource */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* EventSource */, "onerror", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EventSource */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* EventSource */, "onmessage", __arg_0);
 
-  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onopen");
+  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EventSource */, "onopen");
 
-  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
+  onopen_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* EventSource */, "onopen", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EventSource */, "readyState");
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EventSource */, "url");
 
-  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "withCredentials");
+  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* EventSource */, "withCredentials");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EventSource */, "close", []);
 
 }
 
 class BlinkEventTarget {
   static final instance = new BlinkEventTarget();
 
-  addEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", []);
+  addEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "addEventListener", []);
 
-  addEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0]);
+  addEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "addEventListener", [__arg_0]);
 
-  addEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0, __arg_1]);
+  addEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "addEventListener", [__arg_0, __arg_1]);
 
-  addEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addEventListener", [__arg_0, __arg_1, __arg_2]);
+  addEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "addEventListener", [__arg_0, __arg_1, __arg_2]);
 
-  dispatchEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "dispatchEvent", []);
+  dispatchEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "dispatchEvent", []);
 
-  dispatchEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "dispatchEvent", [__arg_0]);
+  dispatchEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "dispatchEvent", [__arg_0]);
 
-  removeEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", []);
+  removeEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "removeEventListener", []);
 
-  removeEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0]);
+  removeEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "removeEventListener", [__arg_0]);
 
-  removeEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0, __arg_1]);
+  removeEventListener_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "removeEventListener", [__arg_0, __arg_1]);
 
-  removeEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "removeEventListener", [__arg_0, __arg_1, __arg_2]);
+  removeEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* EventTarget */, "removeEventListener", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkExtendableEvent extends BlinkEvent {
   static final instance = new BlinkExtendableEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ExtendableEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ExtendableEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ExtendableEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ExtendableEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ExtendableEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ExtendableEvent", [__arg_0, __arg_1]);
 
-  waitUntil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "waitUntil", []);
+  waitUntil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ExtendableEvent */, "waitUntil", []);
 
-  waitUntil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "waitUntil", [__arg_0]);
+  waitUntil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ExtendableEvent */, "waitUntil", [__arg_0]);
 
 }
 
 class BlinkFederatedCredential extends BlinkCredential {
   static final instance = new BlinkFederatedCredential();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FederatedCredential"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("FederatedCredential");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FederatedCredential"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("FederatedCredential", [__arg_0]);
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FederatedCredential */, "protocol");
 
-  provider_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "provider");
+  provider_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FederatedCredential */, "provider");
 
 }
 
 class BlinkFetchEvent extends BlinkExtendableEvent {
   static final instance = new BlinkFetchEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FetchEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("FetchEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FetchEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("FetchEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FetchEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("FetchEvent", [__arg_0, __arg_1]);
 
-  isReload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isReload");
+  isReload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FetchEvent */, "isReload");
 
-  request_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "request");
+  request_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FetchEvent */, "request");
 
-  respondWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", []);
+  respondWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FetchEvent */, "respondWith", []);
 
-  respondWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", [__arg_0]);
+  respondWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FetchEvent */, "respondWith", [__arg_0]);
 
 }
 
 class BlinkFile extends BlinkBlob {
   static final instance = new BlinkFile();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("File");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("File", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("File", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "File"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("File", [__arg_0, __arg_1, __arg_2]);
 
-  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModified");
+  lastModified_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* File */, "lastModified");
 
-  lastModifiedDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastModifiedDate");
+  lastModifiedDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* File */, "lastModifiedDate");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* File */, "name");
 
-  webkitRelativePath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitRelativePath");
+  webkitRelativePath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* File */, "webkitRelativePath");
 
 }
 
 class BlinkFileCallback {
   static final instance = new BlinkFileCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkFileEntry extends BlinkEntry {
   static final instance = new BlinkFileEntry();
 
-  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", []);
+  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileEntry */, "createWriter", []);
 
-  createWriter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", [__arg_0]);
+  createWriter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileEntry */, "createWriter", [__arg_0]);
 
-  createWriter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", [__arg_0, __arg_1]);
+  createWriter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FileEntry */, "createWriter", [__arg_0, __arg_1]);
 
-  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "file", []);
+  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileEntry */, "file", []);
 
-  file_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "file", [__arg_0]);
+  file_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileEntry */, "file", [__arg_0]);
 
-  file_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "file", [__arg_0, __arg_1]);
+  file_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FileEntry */, "file", [__arg_0, __arg_1]);
 
 }
 
 class BlinkFileEntrySync extends BlinkEntrySync {
   static final instance = new BlinkFileEntrySync();
 
-  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createWriter", []);
+  createWriter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileEntrySync */, "createWriter", []);
 
-  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "file", []);
+  file_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileEntrySync */, "file", []);
 
 }
 
 class BlinkFileError extends BlinkDOMError {
   static final instance = new BlinkFileError();
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileError */, "code");
 
 }
 
 class BlinkFileList {
   static final instance = new BlinkFileList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileList */, "item", [__arg_0]);
 
 }
 
 class BlinkFileReader extends BlinkEventTarget {
   static final instance = new BlinkFileReader();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FileReader"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("FileReader");
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "error");
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileReader */, "onabort", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileReader */, "onerror", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileReader */, "onload", __arg_0);
 
-  onloadend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadend");
+  onloadend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "onloadend");
 
-  onloadend_Setter_(mthis, __arg_0) => mthis["onloadend"] = __arg_0;
+  onloadend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileReader */, "onloadend", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileReader */, "onloadstart", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileReader */, "onprogress", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "readyState");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileReader */, "result");
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "abort", []);
 
-  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", []);
+  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsArrayBuffer", []);
 
-  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", [__arg_0]);
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsArrayBuffer", [__arg_0]);
 
-  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", []);
+  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsBinaryString", []);
 
-  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", [__arg_0]);
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsBinaryString", [__arg_0]);
 
-  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", []);
+  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsDataURL", []);
 
-  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", [__arg_0]);
+  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsDataURL", [__arg_0]);
 
-  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", []);
+  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsText", []);
 
-  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0]);
+  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsText", [__arg_0]);
 
-  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0, __arg_1]);
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FileReader */, "readAsText", [__arg_0, __arg_1]);
 
 }
 
 class BlinkFileReaderSync {
   static final instance = new BlinkFileReaderSync();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FileReaderSync"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("FileReaderSync");
 
-  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", []);
+  readAsArrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsArrayBuffer", []);
 
-  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsArrayBuffer", [__arg_0]);
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsArrayBuffer", [__arg_0]);
 
-  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", []);
+  readAsBinaryString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsBinaryString", []);
 
-  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsBinaryString", [__arg_0]);
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsBinaryString", [__arg_0]);
 
-  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", []);
+  readAsDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsDataURL", []);
 
-  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsDataURL", [__arg_0]);
+  readAsDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsDataURL", [__arg_0]);
 
-  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", []);
+  readAsText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsText", []);
 
-  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0]);
+  readAsText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsText", [__arg_0]);
 
-  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "readAsText", [__arg_0, __arg_1]);
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FileReaderSync */, "readAsText", [__arg_0, __arg_1]);
 
 }
 
 class BlinkFileSystemCallback {
   static final instance = new BlinkFileSystemCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileSystemCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileSystemCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkFileWriter extends BlinkEventTarget {
   static final instance = new BlinkFileWriter();
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "error");
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "length");
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileWriter */, "onabort", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileWriter */, "onerror", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileWriter */, "onprogress", __arg_0);
 
-  onwrite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwrite");
+  onwrite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "onwrite");
 
-  onwrite_Setter_(mthis, __arg_0) => mthis["onwrite"] = __arg_0;
+  onwrite_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileWriter */, "onwrite", __arg_0);
 
-  onwriteend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwriteend");
+  onwriteend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "onwriteend");
 
-  onwriteend_Setter_(mthis, __arg_0) => mthis["onwriteend"] = __arg_0;
+  onwriteend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileWriter */, "onwriteend", __arg_0);
 
-  onwritestart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwritestart");
+  onwritestart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "onwritestart");
 
-  onwritestart_Setter_(mthis, __arg_0) => mthis["onwritestart"] = __arg_0;
+  onwritestart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FileWriter */, "onwritestart", __arg_0);
 
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "position");
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriter */, "readyState");
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriter */, "abort", []);
 
-  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "seek", []);
+  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriter */, "seek", []);
 
-  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "seek", [__arg_0]);
+  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileWriter */, "seek", [__arg_0]);
 
-  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "truncate", []);
+  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriter */, "truncate", []);
 
-  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "truncate", [__arg_0]);
+  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileWriter */, "truncate", [__arg_0]);
 
-  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
+  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriter */, "write", []);
 
-  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
+  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileWriter */, "write", [__arg_0]);
 
 }
 
 class BlinkFileWriterCallback {
   static final instance = new BlinkFileWriterCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkFileWriterSync {
   static final instance = new BlinkFileWriterSync();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriterSync */, "length");
 
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FileWriterSync */, "position");
 
-  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "seek", []);
+  seek_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterSync */, "seek", []);
 
-  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "seek", [__arg_0]);
+  seek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterSync */, "seek", [__arg_0]);
 
-  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "truncate", []);
+  truncate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterSync */, "truncate", []);
 
-  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "truncate", [__arg_0]);
+  truncate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterSync */, "truncate", [__arg_0]);
 
-  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "write", []);
+  write_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterSync */, "write", []);
 
-  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "write", [__arg_0]);
+  write_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FileWriterSync */, "write", [__arg_0]);
 
 }
 
@@ -5824,1875 +5824,1875 @@
 class BlinkFocusEvent extends BlinkUIEvent {
   static final instance = new BlinkFocusEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FocusEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("FocusEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FocusEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("FocusEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FocusEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("FocusEvent", [__arg_0, __arg_1]);
 
-  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedTarget");
+  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FocusEvent */, "relatedTarget");
 
 }
 
 class BlinkFontFace {
   static final instance = new BlinkFontFace();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("FontFace");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("FontFace", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("FontFace", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FontFace"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("FontFace", [__arg_0, __arg_1, __arg_2]);
 
-  family_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "family");
+  family_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "family");
 
-  family_Setter_(mthis, __arg_0) => mthis["family"] = __arg_0;
+  family_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFace */, "family", __arg_0);
 
-  featureSettings_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "featureSettings");
+  featureSettings_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "featureSettings");
 
-  featureSettings_Setter_(mthis, __arg_0) => mthis["featureSettings"] = __arg_0;
+  featureSettings_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFace */, "featureSettings", __arg_0);
 
-  loaded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loaded");
+  loaded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "loaded");
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "status");
 
-  stretch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stretch");
+  stretch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "stretch");
 
-  stretch_Setter_(mthis, __arg_0) => mthis["stretch"] = __arg_0;
+  stretch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFace */, "stretch", __arg_0);
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "style");
 
-  style_Setter_(mthis, __arg_0) => mthis["style"] = __arg_0;
+  style_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFace */, "style", __arg_0);
 
-  unicodeRange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unicodeRange");
+  unicodeRange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "unicodeRange");
 
-  unicodeRange_Setter_(mthis, __arg_0) => mthis["unicodeRange"] = __arg_0;
+  unicodeRange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFace */, "unicodeRange", __arg_0);
 
-  variant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "variant");
+  variant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "variant");
 
-  variant_Setter_(mthis, __arg_0) => mthis["variant"] = __arg_0;
+  variant_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFace */, "variant", __arg_0);
 
-  weight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "weight");
+  weight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFace */, "weight");
 
-  weight_Setter_(mthis, __arg_0) => mthis["weight"] = __arg_0;
+  weight_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFace */, "weight", __arg_0);
 
-  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFace */, "load", []);
 
 }
 
 class BlinkFontFaceSet extends BlinkEventTarget {
   static final instance = new BlinkFontFaceSet();
 
-  onloading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloading");
+  onloading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFaceSet */, "onloading");
 
-  onloading_Setter_(mthis, __arg_0) => mthis["onloading"] = __arg_0;
+  onloading_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFaceSet */, "onloading", __arg_0);
 
-  onloadingdone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadingdone");
+  onloadingdone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFaceSet */, "onloadingdone");
 
-  onloadingdone_Setter_(mthis, __arg_0) => mthis["onloadingdone"] = __arg_0;
+  onloadingdone_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFaceSet */, "onloadingdone", __arg_0);
 
-  onloadingerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadingerror");
+  onloadingerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFaceSet */, "onloadingerror");
 
-  onloadingerror_Setter_(mthis, __arg_0) => mthis["onloadingerror"] = __arg_0;
+  onloadingerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* FontFaceSet */, "onloadingerror", __arg_0);
 
-  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ready");
+  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFaceSet */, "ready");
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFaceSet */, "size");
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFaceSet */, "status");
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "add", [__arg_0]);
 
-  check_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "check", []);
+  check_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "check", []);
 
-  check_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "check", [__arg_0]);
+  check_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "check", [__arg_0]);
 
-  check_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "check", [__arg_0, __arg_1]);
+  check_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "check", [__arg_0, __arg_1]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "clear", []);
 
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "delete", []);
 
-  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
+  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "delete", [__arg_0]);
 
-  forEach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forEach", []);
+  forEach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "forEach", []);
 
-  forEach_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0]);
+  forEach_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "forEach", [__arg_0]);
 
-  forEach_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "forEach", [__arg_0, __arg_1]);
+  forEach_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "forEach", [__arg_0, __arg_1]);
 
-  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
+  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "has", []);
 
-  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
+  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "has", [__arg_0]);
 
-  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "load", []);
 
-  load_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "load", [__arg_0]);
+  load_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "load", [__arg_0]);
 
-  load_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "load", [__arg_0, __arg_1]);
+  load_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSet */, "load", [__arg_0, __arg_1]);
 
 }
 
 class BlinkFontFaceSetForEachCallback {
   static final instance = new BlinkFontFaceSetForEachCallback();
 
-  handleItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleItem", [__arg_0]);
+  handleItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSetForEachCallback */, "handleItem", [__arg_0]);
 
-  handleItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleItem", [__arg_0, __arg_1]);
+  handleItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSetForEachCallback */, "handleItem", [__arg_0, __arg_1]);
 
-  handleItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "handleItem", [__arg_0, __arg_1, __arg_2]);
+  handleItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* FontFaceSetForEachCallback */, "handleItem", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkFontFaceSetLoadEvent extends BlinkEvent {
   static final instance = new BlinkFontFaceSetLoadEvent();
 
-  fontfaces_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fontfaces");
+  fontfaces_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* FontFaceSetLoadEvent */, "fontfaces");
 
 }
 
 class BlinkFormData {
   static final instance = new BlinkFormData();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FormData"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("FormData");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "FormData"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("FormData", [__arg_0]);
 
-  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "append", []);
 
-  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "append", [__arg_0]);
 
-  append_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0, __arg_1]);
+  append_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "append", [__arg_0, __arg_1]);
 
-  append_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0, __arg_1, __arg_2]);
+  append_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "append", [__arg_0, __arg_1, __arg_2]);
 
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "delete", []);
 
-  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
+  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "delete", [__arg_0]);
 
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
+  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "get", []);
 
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
+  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "get", [__arg_0]);
 
-  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
+  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "getAll", []);
 
-  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
+  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "getAll", [__arg_0]);
 
-  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "has", []);
+  has_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "has", []);
 
-  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "has", [__arg_0]);
+  has_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "has", [__arg_0]);
 
-  set_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "set", []);
+  set_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "set", []);
 
-  set_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0]);
+  set_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "set", [__arg_0]);
 
-  set_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0, __arg_1]);
+  set_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "set", [__arg_0, __arg_1]);
 
-  set_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "set", [__arg_0, __arg_1, __arg_2]);
+  set_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* FormData */, "set", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkFrameRequestCallback {
   static final instance = new BlinkFrameRequestCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* FrameRequestCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* FrameRequestCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkGainNode extends BlinkAudioNode {
   static final instance = new BlinkGainNode();
 
-  gain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gain");
+  gain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GainNode */, "gain");
 
 }
 
 class BlinkGamepad {
   static final instance = new BlinkGamepad();
 
-  axes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "axes");
+  axes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Gamepad */, "axes");
 
-  buttons_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buttons");
+  buttons_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Gamepad */, "buttons");
 
-  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connected");
+  connected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Gamepad */, "connected");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Gamepad */, "id");
 
-  index_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "index");
+  index_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Gamepad */, "index");
 
-  mapping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mapping");
+  mapping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Gamepad */, "mapping");
 
-  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
+  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Gamepad */, "timestamp");
 
 }
 
 class BlinkGamepadButton {
   static final instance = new BlinkGamepadButton();
 
-  pressed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pressed");
+  pressed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GamepadButton */, "pressed");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GamepadButton */, "value");
 
 }
 
 class BlinkGamepadEvent extends BlinkEvent {
   static final instance = new BlinkGamepadEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "GamepadEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("GamepadEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "GamepadEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("GamepadEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "GamepadEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("GamepadEvent", [__arg_0, __arg_1]);
 
-  gamepad_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gamepad");
+  gamepad_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GamepadEvent */, "gamepad");
 
 }
 
 class BlinkGamepadList {
   static final instance = new BlinkGamepadList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GamepadList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* GamepadList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* GamepadList */, "item", [__arg_0]);
 
 }
 
 class BlinkGeofencing {
   static final instance = new BlinkGeofencing();
 
-  getRegisteredRegions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegisteredRegions", []);
+  getRegisteredRegions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Geofencing */, "getRegisteredRegions", []);
 
-  registerRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "registerRegion", []);
+  registerRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Geofencing */, "registerRegion", []);
 
-  registerRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "registerRegion", [__arg_0]);
+  registerRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Geofencing */, "registerRegion", [__arg_0]);
 
-  unregisterRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregisterRegion", []);
+  unregisterRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Geofencing */, "unregisterRegion", []);
 
-  unregisterRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unregisterRegion", [__arg_0]);
+  unregisterRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Geofencing */, "unregisterRegion", [__arg_0]);
 
 }
 
 class BlinkGeofencingEvent extends BlinkEvent {
   static final instance = new BlinkGeofencingEvent();
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GeofencingEvent */, "id");
 
-  region_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "region");
+  region_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GeofencingEvent */, "region");
 
 }
 
 class BlinkGeofencingRegion {
   static final instance = new BlinkGeofencingRegion();
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GeofencingRegion */, "id");
 
 }
 
 class BlinkGeolocation {
   static final instance = new BlinkGeolocation();
 
-  clearWatch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearWatch", []);
+  clearWatch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "clearWatch", []);
 
-  clearWatch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearWatch", [__arg_0]);
+  clearWatch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "clearWatch", [__arg_0]);
 
-  getCurrentPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", []);
+  getCurrentPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "getCurrentPosition", []);
 
-  getCurrentPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0]);
+  getCurrentPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "getCurrentPosition", [__arg_0]);
 
-  getCurrentPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0, __arg_1]);
+  getCurrentPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "getCurrentPosition", [__arg_0, __arg_1]);
 
-  getCurrentPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentPosition", [__arg_0, __arg_1, __arg_2]);
+  getCurrentPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "getCurrentPosition", [__arg_0, __arg_1, __arg_2]);
 
-  watchPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", []);
+  watchPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "watchPosition", []);
 
-  watchPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0]);
+  watchPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "watchPosition", [__arg_0]);
 
-  watchPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0, __arg_1]);
+  watchPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "watchPosition", [__arg_0, __arg_1]);
 
-  watchPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "watchPosition", [__arg_0, __arg_1, __arg_2]);
+  watchPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Geolocation */, "watchPosition", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkGeoposition {
   static final instance = new BlinkGeoposition();
 
-  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
+  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Geoposition */, "coords");
 
-  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
+  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Geoposition */, "timestamp");
 
 }
 
 class BlinkGlobalEventHandlers {
   static final instance = new BlinkGlobalEventHandlers();
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onabort", __arg_0);
 
-  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocomplete");
 
-  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+  onautocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocomplete", __arg_0);
 
-  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror");
 
-  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+  onautocompleteerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onblur", __arg_0);
 
-  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncancel");
 
-  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+  oncancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncancel", __arg_0);
 
-  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplay");
 
-  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+  oncanplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplay", __arg_0);
 
-  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough");
 
-  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+  oncanplaythrough_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onchange", __arg_0);
 
-  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclick");
 
-  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+  onclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclick", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclose", __arg_0);
 
-  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncontextmenu");
 
-  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+  oncontextmenu_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncontextmenu", __arg_0);
 
-  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncuechange");
 
-  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+  oncuechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncuechange", __arg_0);
 
-  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondblclick");
 
-  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+  ondblclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondblclick", __arg_0);
 
-  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrag");
 
-  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+  ondrag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrag", __arg_0);
 
-  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragend");
 
-  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+  ondragend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragend", __arg_0);
 
-  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragenter");
 
-  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+  ondragenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragenter", __arg_0);
 
-  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragleave");
 
-  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+  ondragleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragleave", __arg_0);
 
-  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragover");
 
-  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+  ondragover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragover", __arg_0);
 
-  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragstart");
 
-  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+  ondragstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragstart", __arg_0);
 
-  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrop");
 
-  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+  ondrop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrop", __arg_0);
 
-  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondurationchange");
 
-  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+  ondurationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondurationchange", __arg_0);
 
-  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onemptied");
 
-  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+  onemptied_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onemptied", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onended", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onfocus", __arg_0);
 
-  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninput");
 
-  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+  oninput_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninput", __arg_0);
 
-  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninvalid");
 
-  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+  oninvalid_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninvalid", __arg_0);
 
-  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeydown");
 
-  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+  onkeydown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeydown", __arg_0);
 
-  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeypress");
 
-  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+  onkeypress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeypress", __arg_0);
 
-  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeyup");
 
-  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+  onkeyup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeyup", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onload", __arg_0);
 
-  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadeddata");
 
-  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+  onloadeddata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadeddata", __arg_0);
 
-  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata");
 
-  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+  onloadedmetadata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadstart", __arg_0);
 
-  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousedown");
 
-  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+  onmousedown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousedown", __arg_0);
 
-  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseenter");
 
-  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+  onmouseenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseenter", __arg_0);
 
-  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseleave");
 
-  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+  onmouseleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseleave", __arg_0);
 
-  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousemove");
 
-  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+  onmousemove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousemove", __arg_0);
 
-  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseout");
 
-  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+  onmouseout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseout", __arg_0);
 
-  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseover");
 
-  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+  onmouseover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseover", __arg_0);
 
-  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseup");
 
-  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+  onmouseup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseup", __arg_0);
 
-  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousewheel");
 
-  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+  onmousewheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousewheel", __arg_0);
 
-  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpause");
 
-  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+  onpause_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpause", __arg_0);
 
-  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplay");
 
-  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+  onplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplay", __arg_0);
 
-  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplaying");
 
-  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+  onplaying_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplaying", __arg_0);
 
-  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointercancel");
 
-  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointercancel", __arg_0);
 
-  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerdown");
 
-  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+  onpointerdown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerdown", __arg_0);
 
-  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerenter");
 
-  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+  onpointerenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerenter", __arg_0);
 
-  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerleave");
 
-  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+  onpointerleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerleave", __arg_0);
 
-  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointermove");
 
-  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+  onpointermove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointermove", __arg_0);
 
-  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerout");
 
-  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+  onpointerout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerout", __arg_0);
 
-  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerover");
 
-  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+  onpointerover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerover", __arg_0);
 
-  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerup");
 
-  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+  onpointerup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerup", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onprogress", __arg_0);
 
-  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onratechange");
 
-  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+  onratechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onratechange", __arg_0);
 
-  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onreset");
 
-  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+  onreset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onreset", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onscroll", __arg_0);
 
-  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeked");
 
-  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+  onseeked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeked", __arg_0);
 
-  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeking");
 
-  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+  onseeking_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeking", __arg_0);
 
-  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onselect");
 
-  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+  onselect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onselect", __arg_0);
 
-  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onshow");
 
-  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+  onshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onshow", __arg_0);
 
-  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onstalled");
 
-  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+  onstalled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onstalled", __arg_0);
 
-  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsubmit");
 
-  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+  onsubmit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsubmit", __arg_0);
 
-  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsuspend");
 
-  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+  onsuspend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsuspend", __arg_0);
 
-  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontimeupdate");
 
-  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+  ontimeupdate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontimeupdate", __arg_0);
 
-  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontoggle");
 
-  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+  ontoggle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontoggle", __arg_0);
 
-  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onvolumechange");
 
-  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+  onvolumechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onvolumechange", __arg_0);
 
-  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onwaiting");
 
-  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+  onwaiting_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onwaiting", __arg_0);
 
 }
 
 class BlinkHMDVRDevice extends BlinkVRDevice {
   static final instance = new BlinkHMDVRDevice();
 
-  getEyeParameters_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEyeParameters", []);
+  getEyeParameters_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HMDVRDevice */, "getEyeParameters", []);
 
-  getEyeParameters_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEyeParameters", [__arg_0]);
+  getEyeParameters_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HMDVRDevice */, "getEyeParameters", [__arg_0]);
 
-  setFieldOfView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setFieldOfView", []);
+  setFieldOfView_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HMDVRDevice */, "setFieldOfView", []);
 
-  setFieldOfView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setFieldOfView", [__arg_0]);
+  setFieldOfView_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HMDVRDevice */, "setFieldOfView", [__arg_0]);
 
-  setFieldOfView_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setFieldOfView", [__arg_0, __arg_1]);
+  setFieldOfView_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HMDVRDevice */, "setFieldOfView", [__arg_0, __arg_1]);
 
 }
 
 class BlinkHTMLAllCollection {
   static final instance = new BlinkHTMLAllCollection();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAllCollection */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLAllCollection */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLAllCollection */, "item", [__arg_0]);
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLAllCollection */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLAllCollection */, "namedItem", [__arg_0]);
 
 }
 
 class BlinkHTMLAnchorElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLAnchorElement();
 
-  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charset");
+  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "charset");
 
-  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
+  charset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "charset", __arg_0);
 
-  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
+  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "coords");
 
-  coords_Setter_(mthis, __arg_0) => mthis["coords"] = __arg_0;
+  coords_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "coords", __arg_0);
 
-  download_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "download");
+  download_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "download");
 
-  download_Setter_(mthis, __arg_0) => mthis["download"] = __arg_0;
+  download_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "download", __arg_0);
 
-  hreflang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hreflang");
+  hreflang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "hreflang");
 
-  hreflang_Setter_(mthis, __arg_0) => mthis["hreflang"] = __arg_0;
+  hreflang_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "hreflang", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "name", __arg_0);
 
-  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ping");
+  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "ping");
 
-  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
+  ping_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "ping", __arg_0);
 
-  rel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rel");
+  rel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "rel");
 
-  rel_Setter_(mthis, __arg_0) => mthis["rel"] = __arg_0;
+  rel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "rel", __arg_0);
 
-  rev_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rev");
+  rev_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "rev");
 
-  rev_Setter_(mthis, __arg_0) => mthis["rev"] = __arg_0;
+  rev_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "rev", __arg_0);
 
-  shape_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shape");
+  shape_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "shape");
 
-  shape_Setter_(mthis, __arg_0) => mthis["shape"] = __arg_0;
+  shape_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "shape", __arg_0);
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "target");
 
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+  target_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "target", __arg_0);
 
-  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "text");
 
-  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+  text_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "text", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAnchorElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAnchorElement */, "type", __arg_0);
 
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hash");
 
-  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+  hash_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hash", __arg_0);
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "host");
 
-  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+  host_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "host", __arg_0);
 
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hostname");
 
-  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+  hostname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hostname", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "href");
 
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+  href_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "href", __arg_0);
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "origin");
 
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "password");
 
-  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
+  password_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "password", __arg_0);
 
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "pathname");
 
-  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+  pathname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "pathname", __arg_0);
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "port");
 
-  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+  port_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "port", __arg_0);
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "protocol");
 
-  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+  protocol_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "protocol", __arg_0);
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "search");
 
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+  search_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "search", __arg_0);
 
-  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
+  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "username");
 
-  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
+  username_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "username", __arg_0);
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* URLUtils */, "toString", []);
 
 }
 
 class BlinkHTMLAppletElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLAppletElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "align", __arg_0);
 
-  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
+  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "alt");
 
-  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
+  alt_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "alt", __arg_0);
 
-  archive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "archive");
+  archive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "archive");
 
-  archive_Setter_(mthis, __arg_0) => mthis["archive"] = __arg_0;
+  archive_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "archive", __arg_0);
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "code");
 
-  code_Setter_(mthis, __arg_0) => mthis["code"] = __arg_0;
+  code_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "code", __arg_0);
 
-  codeBase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "codeBase");
+  codeBase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "codeBase");
 
-  codeBase_Setter_(mthis, __arg_0) => mthis["codeBase"] = __arg_0;
+  codeBase_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "codeBase", __arg_0);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "height", __arg_0);
 
-  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "hspace");
 
-  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
+  hspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "hspace", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "name", __arg_0);
 
-  object_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "object");
+  object_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "object");
 
-  object_Setter_(mthis, __arg_0) => mthis["object"] = __arg_0;
+  object_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "object", __arg_0);
 
-  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "vspace");
 
-  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+  vspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "vspace", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAppletElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAppletElement */, "width", __arg_0);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLAppletElement */, "__getter__", [__arg_0]);
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLAppletElement */, "__setter__", [__arg_0, __arg_1]);
 
 }
 
 class BlinkHTMLAreaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLAreaElement();
 
-  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
+  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAreaElement */, "alt");
 
-  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
+  alt_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAreaElement */, "alt", __arg_0);
 
-  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coords");
+  coords_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAreaElement */, "coords");
 
-  coords_Setter_(mthis, __arg_0) => mthis["coords"] = __arg_0;
+  coords_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAreaElement */, "coords", __arg_0);
 
-  noHref_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noHref");
+  noHref_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAreaElement */, "noHref");
 
-  noHref_Setter_(mthis, __arg_0) => mthis["noHref"] = __arg_0;
+  noHref_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAreaElement */, "noHref", __arg_0);
 
-  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ping");
+  ping_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAreaElement */, "ping");
 
-  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
+  ping_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAreaElement */, "ping", __arg_0);
 
-  shape_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shape");
+  shape_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAreaElement */, "shape");
 
-  shape_Setter_(mthis, __arg_0) => mthis["shape"] = __arg_0;
+  shape_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAreaElement */, "shape", __arg_0);
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLAreaElement */, "target");
 
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+  target_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLAreaElement */, "target", __arg_0);
 
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hash");
 
-  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+  hash_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hash", __arg_0);
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "host");
 
-  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+  host_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "host", __arg_0);
 
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hostname");
 
-  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+  hostname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hostname", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "href");
 
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+  href_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "href", __arg_0);
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "origin");
 
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "password");
 
-  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
+  password_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "password", __arg_0);
 
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "pathname");
 
-  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+  pathname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "pathname", __arg_0);
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "port");
 
-  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+  port_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "port", __arg_0);
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "protocol");
 
-  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+  protocol_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "protocol", __arg_0);
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "search");
 
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+  search_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "search", __arg_0);
 
-  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
+  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "username");
 
-  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
+  username_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "username", __arg_0);
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* URLUtils */, "toString", []);
 
 }
 
 class BlinkHTMLAudioElement extends BlinkHTMLMediaElement {
   static final instance = new BlinkHTMLAudioElement();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Audio"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Audio");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Audio"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Audio", [__arg_0]);
 
 }
 
 class BlinkHTMLBRElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLBRElement();
 
-  clear_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clear");
+  clear_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBRElement */, "clear");
 
-  clear_Setter_(mthis, __arg_0) => mthis["clear"] = __arg_0;
+  clear_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBRElement */, "clear", __arg_0);
 
 }
 
 class BlinkHTMLBaseElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLBaseElement();
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBaseElement */, "href");
 
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+  href_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBaseElement */, "href", __arg_0);
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBaseElement */, "target");
 
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+  target_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBaseElement */, "target", __arg_0);
 
 }
 
 class BlinkHTMLBodyElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLBodyElement();
 
-  aLink_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "aLink");
+  aLink_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "aLink");
 
-  aLink_Setter_(mthis, __arg_0) => mthis["aLink"] = __arg_0;
+  aLink_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "aLink", __arg_0);
 
-  background_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "background");
+  background_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "background");
 
-  background_Setter_(mthis, __arg_0) => mthis["background"] = __arg_0;
+  background_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "background", __arg_0);
 
-  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "bgColor");
 
-  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+  bgColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "bgColor", __arg_0);
 
-  link_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "link");
+  link_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "link");
 
-  link_Setter_(mthis, __arg_0) => mthis["link"] = __arg_0;
+  link_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "link", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "onblur", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "onfocus", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "onload", __arg_0);
 
-  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
+  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "onorientationchange");
 
-  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
+  onorientationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "onorientationchange", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "onscroll", __arg_0);
 
-  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "text");
 
-  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+  text_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "text", __arg_0);
 
-  vLink_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vLink");
+  vLink_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLBodyElement */, "vLink");
 
-  vLink_Setter_(mthis, __arg_0) => mthis["vLink"] = __arg_0;
+  vLink_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLBodyElement */, "vLink", __arg_0);
 
-  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onbeforeunload");
 
-  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
+  onbeforeunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onbeforeunload", __arg_0);
 
-  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onhashchange");
 
-  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
+  onhashchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onhashchange", __arg_0);
 
-  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onlanguagechange");
 
-  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
+  onlanguagechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onlanguagechange", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onmessage", __arg_0);
 
-  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onoffline");
 
-  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
+  onoffline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onoffline", __arg_0);
 
-  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "ononline");
 
-  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
+  ononline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "ononline", __arg_0);
 
-  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpagehide");
 
-  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
+  onpagehide_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpagehide", __arg_0);
 
-  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpageshow");
 
-  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
+  onpageshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpageshow", __arg_0);
 
-  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpopstate");
 
-  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+  onpopstate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpopstate", __arg_0);
 
-  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onrejectionhandled");
 
-  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+  onrejectionhandled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onrejectionhandled", __arg_0);
 
-  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onstorage");
 
-  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
+  onstorage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onstorage", __arg_0);
 
-  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunhandledrejection");
 
-  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+  onunhandledrejection_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunhandledrejection", __arg_0);
 
-  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunload");
 
-  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
+  onunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunload", __arg_0);
 
 }
 
 class BlinkHTMLButtonElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLButtonElement();
 
-  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
+  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "autofocus");
 
-  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
+  autofocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "autofocus", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "disabled", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "form");
 
-  formAction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formAction");
+  formAction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "formAction");
 
-  formAction_Setter_(mthis, __arg_0) => mthis["formAction"] = __arg_0;
+  formAction_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "formAction", __arg_0);
 
-  formEnctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formEnctype");
+  formEnctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "formEnctype");
 
-  formEnctype_Setter_(mthis, __arg_0) => mthis["formEnctype"] = __arg_0;
+  formEnctype_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "formEnctype", __arg_0);
 
-  formMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formMethod");
+  formMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "formMethod");
 
-  formMethod_Setter_(mthis, __arg_0) => mthis["formMethod"] = __arg_0;
+  formMethod_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "formMethod", __arg_0);
 
-  formNoValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formNoValidate");
+  formNoValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "formNoValidate");
 
-  formNoValidate_Setter_(mthis, __arg_0) => mthis["formNoValidate"] = __arg_0;
+  formNoValidate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "formNoValidate", __arg_0);
 
-  formTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formTarget");
+  formTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "formTarget");
 
-  formTarget_Setter_(mthis, __arg_0) => mthis["formTarget"] = __arg_0;
+  formTarget_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "formTarget", __arg_0);
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "labels");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "name", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "type", __arg_0);
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "validity");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLButtonElement */, "value", __arg_0);
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLButtonElement */, "willValidate");
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLButtonElement */, "checkValidity", []);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLButtonElement */, "reportValidity", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLButtonElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLButtonElement */, "setCustomValidity", [__arg_0]);
 
 }
 
 class BlinkHTMLCanvasElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLCanvasElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLCanvasElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLCanvasElement */, "height", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLCanvasElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLCanvasElement */, "width", __arg_0);
 
-  getContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContext", []);
+  getContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCanvasElement */, "getContext", []);
 
-  getContext_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getContext", [__arg_0]);
+  getContext_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCanvasElement */, "getContext", [__arg_0]);
 
-  getContext_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getContext", [__arg_0, __arg_1]);
+  getContext_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCanvasElement */, "getContext", [__arg_0, __arg_1]);
 
-  toDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", []);
+  toDataURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCanvasElement */, "toDataURL", []);
 
-  toDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", [__arg_0]);
+  toDataURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCanvasElement */, "toDataURL", [__arg_0]);
 
-  toDataURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "toDataURL", [__arg_0, __arg_1]);
+  toDataURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCanvasElement */, "toDataURL", [__arg_0, __arg_1]);
 
 }
 
 class BlinkHTMLCollection {
   static final instance = new BlinkHTMLCollection();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) native "Blink_Getter_HTMLCollection_length";
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) native "Blink_Operation_0_HTMLCollection_item";
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) native "Blink_Operation_HTMLCollection_item"; /* __arg_0 */
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCollection */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLCollection */, "namedItem", [__arg_0]);
 
 }
 
 class BlinkHTMLContentElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLContentElement();
 
-  select_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "select");
+  select_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLContentElement */, "select");
 
-  select_Setter_(mthis, __arg_0) => mthis["select"] = __arg_0;
+  select_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLContentElement */, "select", __arg_0);
 
-  getDistributedNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDistributedNodes", []);
+  getDistributedNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLContentElement */, "getDistributedNodes", []);
 
 }
 
 class BlinkHTMLDListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDListElement();
 
-  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDListElement */, "compact");
 
-  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+  compact_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDListElement */, "compact", __arg_0);
 
 }
 
 class BlinkHTMLDataListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDataListElement();
 
-  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "options");
+  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDataListElement */, "options");
 
 }
 
 class BlinkHTMLDetailsElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDetailsElement();
 
-  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "open");
+  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDetailsElement */, "open");
 
-  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
+  open_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDetailsElement */, "open", __arg_0);
 
 }
 
 class BlinkHTMLDialogElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDialogElement();
 
-  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "open");
+  open_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDialogElement */, "open");
 
-  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
+  open_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDialogElement */, "open", __arg_0);
 
-  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "returnValue");
+  returnValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDialogElement */, "returnValue");
 
-  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
+  returnValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDialogElement */, "returnValue", __arg_0);
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLDialogElement */, "close", []);
 
-  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0]);
+  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLDialogElement */, "close", [__arg_0]);
 
-  show_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "show", []);
+  show_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLDialogElement */, "show", []);
 
-  showModal_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "showModal", []);
+  showModal_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLDialogElement */, "showModal", []);
 
 }
 
 class BlinkHTMLDirectoryElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDirectoryElement();
 
-  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDirectoryElement */, "compact");
 
-  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+  compact_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDirectoryElement */, "compact", __arg_0);
 
 }
 
 class BlinkHTMLDivElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDivElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDivElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDivElement */, "align", __arg_0);
 
 }
 
 class BlinkHTMLDocument extends BlinkDocument {
   static final instance = new BlinkHTMLDocument();
 
-  alinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alinkColor");
+  alinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDocument */, "alinkColor");
 
-  alinkColor_Setter_(mthis, __arg_0) => mthis["alinkColor"] = __arg_0;
+  alinkColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDocument */, "alinkColor", __arg_0);
 
-  all_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "all");
+  all_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDocument */, "all");
 
-  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDocument */, "bgColor");
 
-  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+  bgColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDocument */, "bgColor", __arg_0);
 
-  fgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fgColor");
+  fgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDocument */, "fgColor");
 
-  fgColor_Setter_(mthis, __arg_0) => mthis["fgColor"] = __arg_0;
+  fgColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDocument */, "fgColor", __arg_0);
 
-  linkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "linkColor");
+  linkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDocument */, "linkColor");
 
-  linkColor_Setter_(mthis, __arg_0) => mthis["linkColor"] = __arg_0;
+  linkColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDocument */, "linkColor", __arg_0);
 
-  vlinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vlinkColor");
+  vlinkColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLDocument */, "vlinkColor");
 
-  vlinkColor_Setter_(mthis, __arg_0) => mthis["vlinkColor"] = __arg_0;
+  vlinkColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLDocument */, "vlinkColor", __arg_0);
 
-  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "captureEvents", []);
+  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLDocument */, "captureEvents", []);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLDocument */, "clear", []);
 
-  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseEvents", []);
+  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLDocument */, "releaseEvents", []);
 
 }
 
 class BlinkHTMLElement extends BlinkElement {
   static final instance = new BlinkHTMLElement();
 
-  accessKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accessKey");
+  accessKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "accessKey");
 
-  accessKey_Setter_(mthis, __arg_0) => mthis["accessKey"] = __arg_0;
+  accessKey_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "accessKey", __arg_0);
 
-  contentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentEditable");
+  contentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "contentEditable");
 
-  contentEditable_Setter_(mthis, __arg_0) => mthis["contentEditable"] = __arg_0;
+  contentEditable_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "contentEditable", __arg_0);
 
-  contextMenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contextMenu");
+  contextMenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "contextMenu");
 
-  contextMenu_Setter_(mthis, __arg_0) => mthis["contextMenu"] = __arg_0;
+  contextMenu_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "contextMenu", __arg_0);
 
-  dataset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataset");
+  dataset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "dataset");
 
-  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dir");
+  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "dir");
 
-  dir_Setter_(mthis, __arg_0) => mthis["dir"] = __arg_0;
+  dir_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "dir", __arg_0);
 
-  draggable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "draggable");
+  draggable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "draggable");
 
-  draggable_Setter_(mthis, __arg_0) => mthis["draggable"] = __arg_0;
+  draggable_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "draggable", __arg_0);
 
-  hidden_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hidden");
+  hidden_Getter_(mthis) native "Blink_Getter_HTMLElement_hidden";
 
-  hidden_Setter_(mthis, __arg_0) => mthis["hidden"] = __arg_0;
+  hidden_Setter_(mthis, __arg_0) native "Blink_Setter_HTMLElement_hidden";
 
-  innerText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerText");
+  innerText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "innerText");
 
-  innerText_Setter_(mthis, __arg_0) => mthis["innerText"] = __arg_0;
+  innerText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "innerText", __arg_0);
 
-  isContentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isContentEditable");
+  isContentEditable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "isContentEditable");
 
-  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lang");
+  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "lang");
 
-  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
+  lang_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "lang", __arg_0);
 
-  offsetHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetHeight");
+  offsetHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "offsetHeight");
 
-  offsetLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetLeft");
+  offsetLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "offsetLeft");
 
-  offsetParent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetParent");
+  offsetParent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "offsetParent");
 
-  offsetTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetTop");
+  offsetTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "offsetTop");
 
-  offsetWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetWidth");
+  offsetWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "offsetWidth");
 
-  outerText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerText");
+  outerText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "outerText");
 
-  outerText_Setter_(mthis, __arg_0) => mthis["outerText"] = __arg_0;
+  outerText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "outerText", __arg_0);
 
-  spellcheck_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "spellcheck");
+  spellcheck_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "spellcheck");
 
-  spellcheck_Setter_(mthis, __arg_0) => mthis["spellcheck"] = __arg_0;
+  spellcheck_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "spellcheck", __arg_0);
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) native "Blink_Getter_HTMLElement_style";
 
-  tabIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tabIndex");
+  tabIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "tabIndex");
 
-  tabIndex_Setter_(mthis, __arg_0) => mthis["tabIndex"] = __arg_0;
+  tabIndex_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "tabIndex", __arg_0);
 
-  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
+  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "title");
 
-  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
+  title_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "title", __arg_0);
 
-  translate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "translate");
+  translate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "translate");
 
-  translate_Setter_(mthis, __arg_0) => mthis["translate"] = __arg_0;
+  translate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "translate", __arg_0);
 
-  webkitdropzone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitdropzone");
+  webkitdropzone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLElement */, "webkitdropzone");
 
-  webkitdropzone_Setter_(mthis, __arg_0) => mthis["webkitdropzone"] = __arg_0;
+  webkitdropzone_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLElement */, "webkitdropzone", __arg_0);
 
-  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
+  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLElement */, "blur", []);
 
-  click_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "click", []);
+  click_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLElement */, "click", []);
 
-  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLElement */, "focus", []);
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onabort", __arg_0);
 
-  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocomplete");
 
-  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+  onautocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocomplete", __arg_0);
 
-  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror");
 
-  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+  onautocompleteerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onblur", __arg_0);
 
-  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncancel");
 
-  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+  oncancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncancel", __arg_0);
 
-  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplay");
 
-  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+  oncanplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplay", __arg_0);
 
-  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough");
 
-  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+  oncanplaythrough_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onchange", __arg_0);
 
-  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclick");
 
-  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+  onclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclick", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclose", __arg_0);
 
-  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncontextmenu");
 
-  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+  oncontextmenu_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncontextmenu", __arg_0);
 
-  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncuechange");
 
-  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+  oncuechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncuechange", __arg_0);
 
-  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondblclick");
 
-  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+  ondblclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondblclick", __arg_0);
 
-  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrag");
 
-  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+  ondrag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrag", __arg_0);
 
-  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragend");
 
-  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+  ondragend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragend", __arg_0);
 
-  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragenter");
 
-  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+  ondragenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragenter", __arg_0);
 
-  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragleave");
 
-  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+  ondragleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragleave", __arg_0);
 
-  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragover");
 
-  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+  ondragover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragover", __arg_0);
 
-  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragstart");
 
-  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+  ondragstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragstart", __arg_0);
 
-  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrop");
 
-  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+  ondrop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrop", __arg_0);
 
-  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondurationchange");
 
-  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+  ondurationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondurationchange", __arg_0);
 
-  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onemptied");
 
-  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+  onemptied_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onemptied", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onended", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onfocus", __arg_0);
 
-  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninput");
 
-  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+  oninput_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninput", __arg_0);
 
-  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninvalid");
 
-  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+  oninvalid_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninvalid", __arg_0);
 
-  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeydown");
 
-  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+  onkeydown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeydown", __arg_0);
 
-  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeypress");
 
-  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+  onkeypress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeypress", __arg_0);
 
-  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeyup");
 
-  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+  onkeyup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeyup", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onload", __arg_0);
 
-  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadeddata");
 
-  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+  onloadeddata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadeddata", __arg_0);
 
-  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata");
 
-  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+  onloadedmetadata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadstart", __arg_0);
 
-  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousedown");
 
-  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+  onmousedown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousedown", __arg_0);
 
-  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseenter");
 
-  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+  onmouseenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseenter", __arg_0);
 
-  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseleave");
 
-  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+  onmouseleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseleave", __arg_0);
 
-  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousemove");
 
-  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+  onmousemove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousemove", __arg_0);
 
-  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseout");
 
-  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+  onmouseout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseout", __arg_0);
 
-  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseover");
 
-  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+  onmouseover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseover", __arg_0);
 
-  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseup");
 
-  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+  onmouseup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseup", __arg_0);
 
-  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousewheel");
 
-  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+  onmousewheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousewheel", __arg_0);
 
-  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpause");
 
-  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+  onpause_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpause", __arg_0);
 
-  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplay");
 
-  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+  onplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplay", __arg_0);
 
-  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplaying");
 
-  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+  onplaying_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplaying", __arg_0);
 
-  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointercancel");
 
-  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointercancel", __arg_0);
 
-  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerdown");
 
-  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+  onpointerdown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerdown", __arg_0);
 
-  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerenter");
 
-  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+  onpointerenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerenter", __arg_0);
 
-  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerleave");
 
-  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+  onpointerleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerleave", __arg_0);
 
-  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointermove");
 
-  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+  onpointermove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointermove", __arg_0);
 
-  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerout");
 
-  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+  onpointerout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerout", __arg_0);
 
-  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerover");
 
-  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+  onpointerover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerover", __arg_0);
 
-  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerup");
 
-  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+  onpointerup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerup", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onprogress", __arg_0);
 
-  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onratechange");
 
-  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+  onratechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onratechange", __arg_0);
 
-  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onreset");
 
-  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+  onreset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onreset", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onscroll", __arg_0);
 
-  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeked");
 
-  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+  onseeked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeked", __arg_0);
 
-  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeking");
 
-  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+  onseeking_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeking", __arg_0);
 
-  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onselect");
 
-  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+  onselect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onselect", __arg_0);
 
-  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onshow");
 
-  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+  onshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onshow", __arg_0);
 
-  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onstalled");
 
-  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+  onstalled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onstalled", __arg_0);
 
-  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsubmit");
 
-  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+  onsubmit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsubmit", __arg_0);
 
-  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsuspend");
 
-  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+  onsuspend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsuspend", __arg_0);
 
-  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontimeupdate");
 
-  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+  ontimeupdate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontimeupdate", __arg_0);
 
-  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontoggle");
 
-  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+  ontoggle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontoggle", __arg_0);
 
-  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onvolumechange");
 
-  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+  onvolumechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onvolumechange", __arg_0);
 
-  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onwaiting");
 
-  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+  onwaiting_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onwaiting", __arg_0);
 
 }
 
 class BlinkHTMLEmbedElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLEmbedElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLEmbedElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLEmbedElement */, "align", __arg_0);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLEmbedElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLEmbedElement */, "height", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLEmbedElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLEmbedElement */, "name", __arg_0);
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLEmbedElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLEmbedElement */, "src", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLEmbedElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLEmbedElement */, "type", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLEmbedElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLEmbedElement */, "width", __arg_0);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLEmbedElement */, "__getter__", [__arg_0]);
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLEmbedElement */, "__setter__", [__arg_0, __arg_1]);
 
-  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLEmbedElement */, "getSVGDocument", []);
 
 }
 
 class BlinkHTMLFieldSetElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFieldSetElement();
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFieldSetElement */, "disabled", __arg_0);
 
-  elements_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elements");
+  elements_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "elements");
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "form");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFieldSetElement */, "name", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "type");
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "validity");
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFieldSetElement */, "willValidate");
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFieldSetElement */, "checkValidity", []);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFieldSetElement */, "reportValidity", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFieldSetElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFieldSetElement */, "setCustomValidity", [__arg_0]);
 
 }
 
 class BlinkHTMLFontElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFontElement();
 
-  color_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "color");
+  color_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFontElement */, "color");
 
-  color_Setter_(mthis, __arg_0) => mthis["color"] = __arg_0;
+  color_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFontElement */, "color", __arg_0);
 
-  face_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "face");
+  face_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFontElement */, "face");
 
-  face_Setter_(mthis, __arg_0) => mthis["face"] = __arg_0;
+  face_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFontElement */, "face", __arg_0);
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFontElement */, "size");
 
-  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+  size_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFontElement */, "size", __arg_0);
 
 }
 
 class BlinkHTMLFormControlsCollection extends BlinkHTMLCollection {
   static final instance = new BlinkHTMLFormControlsCollection();
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormControlsCollection */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormControlsCollection */, "item", [__arg_0]);
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormControlsCollection */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormControlsCollection */, "namedItem", [__arg_0]);
 
 }
 
 class BlinkHTMLFormElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFormElement();
 
-  acceptCharset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "acceptCharset");
+  acceptCharset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "acceptCharset");
 
-  acceptCharset_Setter_(mthis, __arg_0) => mthis["acceptCharset"] = __arg_0;
+  acceptCharset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "acceptCharset", __arg_0);
 
-  action_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "action");
+  action_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "action");
 
-  action_Setter_(mthis, __arg_0) => mthis["action"] = __arg_0;
+  action_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "action", __arg_0);
 
-  autocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autocomplete");
+  autocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "autocomplete");
 
-  autocomplete_Setter_(mthis, __arg_0) => mthis["autocomplete"] = __arg_0;
+  autocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "autocomplete", __arg_0);
 
-  elements_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elements");
+  elements_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "elements");
 
-  encoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "encoding");
+  encoding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "encoding");
 
-  encoding_Setter_(mthis, __arg_0) => mthis["encoding"] = __arg_0;
+  encoding_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "encoding", __arg_0);
 
-  enctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "enctype");
+  enctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "enctype");
 
-  enctype_Setter_(mthis, __arg_0) => mthis["enctype"] = __arg_0;
+  enctype_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "enctype", __arg_0);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "length");
 
-  method_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "method");
+  method_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "method");
 
-  method_Setter_(mthis, __arg_0) => mthis["method"] = __arg_0;
+  method_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "method", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "name", __arg_0);
 
-  noValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noValidate");
+  noValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "noValidate");
 
-  noValidate_Setter_(mthis, __arg_0) => mthis["noValidate"] = __arg_0;
+  noValidate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "noValidate", __arg_0);
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFormElement */, "target");
 
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+  target_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFormElement */, "target", __arg_0);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "__getter__", [__arg_0]);
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "checkValidity", []);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "item", [__arg_0]);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "reportValidity", []);
 
-  requestAutocomplete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestAutocomplete", []);
+  requestAutocomplete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "requestAutocomplete", []);
 
-  requestAutocomplete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestAutocomplete", [__arg_0]);
+  requestAutocomplete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "requestAutocomplete", [__arg_0]);
 
-  reset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reset", []);
+  reset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "reset", []);
 
-  submit_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "submit", []);
+  submit_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFormElement */, "submit", []);
 
 }
 
 class BlinkHTMLFrameElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFrameElement();
 
-  contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentDocument");
+  contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "contentDocument");
 
-  contentWindow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentWindow");
+  contentWindow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "contentWindow");
 
-  frameBorder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameBorder");
+  frameBorder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "frameBorder");
 
-  frameBorder_Setter_(mthis, __arg_0) => mthis["frameBorder"] = __arg_0;
+  frameBorder_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "frameBorder", __arg_0);
 
-  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longDesc");
+  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "longDesc");
 
-  longDesc_Setter_(mthis, __arg_0) => mthis["longDesc"] = __arg_0;
+  longDesc_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "longDesc", __arg_0);
 
-  marginHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginHeight");
+  marginHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "marginHeight");
 
-  marginHeight_Setter_(mthis, __arg_0) => mthis["marginHeight"] = __arg_0;
+  marginHeight_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "marginHeight", __arg_0);
 
-  marginWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginWidth");
+  marginWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "marginWidth");
 
-  marginWidth_Setter_(mthis, __arg_0) => mthis["marginWidth"] = __arg_0;
+  marginWidth_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "marginWidth", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "name", __arg_0);
 
-  noResize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noResize");
+  noResize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "noResize");
 
-  noResize_Setter_(mthis, __arg_0) => mthis["noResize"] = __arg_0;
+  noResize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "noResize", __arg_0);
 
-  scrolling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrolling");
+  scrolling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "scrolling");
 
-  scrolling_Setter_(mthis, __arg_0) => mthis["scrolling"] = __arg_0;
+  scrolling_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "scrolling", __arg_0);
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameElement */, "src", __arg_0);
 
-  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFrameElement */, "getSVGDocument", []);
 
 }
 
 class BlinkHTMLFrameSetElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFrameSetElement();
 
-  cols_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cols");
+  cols_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "cols");
 
-  cols_Setter_(mthis, __arg_0) => mthis["cols"] = __arg_0;
+  cols_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "cols", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "onblur", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "onfocus", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "onload", __arg_0);
 
-  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
+  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "onorientationchange");
 
-  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
+  onorientationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "onorientationchange", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "onscroll", __arg_0);
 
-  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLFrameSetElement */, "rows");
 
-  rows_Setter_(mthis, __arg_0) => mthis["rows"] = __arg_0;
+  rows_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLFrameSetElement */, "rows", __arg_0);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLFrameSetElement */, "__getter__", [__arg_0]);
 
-  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onbeforeunload");
 
-  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
+  onbeforeunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onbeforeunload", __arg_0);
 
-  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onhashchange");
 
-  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
+  onhashchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onhashchange", __arg_0);
 
-  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onlanguagechange");
 
-  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
+  onlanguagechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onlanguagechange", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onmessage", __arg_0);
 
-  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onoffline");
 
-  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
+  onoffline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onoffline", __arg_0);
 
-  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "ononline");
 
-  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
+  ononline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "ononline", __arg_0);
 
-  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpagehide");
 
-  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
+  onpagehide_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpagehide", __arg_0);
 
-  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpageshow");
 
-  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
+  onpageshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpageshow", __arg_0);
 
-  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpopstate");
 
-  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+  onpopstate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpopstate", __arg_0);
 
-  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onrejectionhandled");
 
-  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+  onrejectionhandled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onrejectionhandled", __arg_0);
 
-  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onstorage");
 
-  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
+  onstorage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onstorage", __arg_0);
 
-  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunhandledrejection");
 
-  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+  onunhandledrejection_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunhandledrejection", __arg_0);
 
-  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunload");
 
-  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
+  onunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunload", __arg_0);
 
 }
 
 class BlinkHTMLHRElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLHRElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLHRElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLHRElement */, "align", __arg_0);
 
-  color_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "color");
+  color_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLHRElement */, "color");
 
-  color_Setter_(mthis, __arg_0) => mthis["color"] = __arg_0;
+  color_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLHRElement */, "color", __arg_0);
 
-  noShade_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noShade");
+  noShade_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLHRElement */, "noShade");
 
-  noShade_Setter_(mthis, __arg_0) => mthis["noShade"] = __arg_0;
+  noShade_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLHRElement */, "noShade", __arg_0);
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLHRElement */, "size");
 
-  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+  size_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLHRElement */, "size", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLHRElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLHRElement */, "width", __arg_0);
 
 }
 
@@ -7704,1172 +7704,1172 @@
 class BlinkHTMLHeadingElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLHeadingElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLHeadingElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLHeadingElement */, "align", __arg_0);
 
 }
 
 class BlinkHTMLHtmlElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLHtmlElement();
 
-  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLHtmlElement */, "version");
 
-  version_Setter_(mthis, __arg_0) => mthis["version"] = __arg_0;
+  version_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLHtmlElement */, "version", __arg_0);
 
 }
 
 class BlinkHTMLIFrameElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLIFrameElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "align", __arg_0);
 
-  allowFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "allowFullscreen");
+  allowFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "allowFullscreen");
 
-  allowFullscreen_Setter_(mthis, __arg_0) => mthis["allowFullscreen"] = __arg_0;
+  allowFullscreen_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "allowFullscreen", __arg_0);
 
-  contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentDocument");
+  contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "contentDocument");
 
-  contentWindow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentWindow");
+  contentWindow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "contentWindow");
 
-  frameBorder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameBorder");
+  frameBorder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "frameBorder");
 
-  frameBorder_Setter_(mthis, __arg_0) => mthis["frameBorder"] = __arg_0;
+  frameBorder_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "frameBorder", __arg_0);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "height", __arg_0);
 
-  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longDesc");
+  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "longDesc");
 
-  longDesc_Setter_(mthis, __arg_0) => mthis["longDesc"] = __arg_0;
+  longDesc_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "longDesc", __arg_0);
 
-  marginHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginHeight");
+  marginHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "marginHeight");
 
-  marginHeight_Setter_(mthis, __arg_0) => mthis["marginHeight"] = __arg_0;
+  marginHeight_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "marginHeight", __arg_0);
 
-  marginWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "marginWidth");
+  marginWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "marginWidth");
 
-  marginWidth_Setter_(mthis, __arg_0) => mthis["marginWidth"] = __arg_0;
+  marginWidth_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "marginWidth", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "name", __arg_0);
 
-  sandbox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sandbox");
+  sandbox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "sandbox");
 
-  scrolling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrolling");
+  scrolling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "scrolling");
 
-  scrolling_Setter_(mthis, __arg_0) => mthis["scrolling"] = __arg_0;
+  scrolling_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "scrolling", __arg_0);
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "src", __arg_0);
 
-  srcdoc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "srcdoc");
+  srcdoc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "srcdoc");
 
-  srcdoc_Setter_(mthis, __arg_0) => mthis["srcdoc"] = __arg_0;
+  srcdoc_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "srcdoc", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLIFrameElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLIFrameElement */, "width", __arg_0);
 
-  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLIFrameElement */, "getSVGDocument", []);
 
 }
 
 class BlinkHTMLImageElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLImageElement();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Image");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Image", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Image"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("Image", [__arg_0, __arg_1]);
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "align", __arg_0);
 
-  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
+  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "alt");
 
-  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
+  alt_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "alt", __arg_0);
 
-  border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "border");
+  border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "border");
 
-  border_Setter_(mthis, __arg_0) => mthis["border"] = __arg_0;
+  border_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "border", __arg_0);
 
-  complete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "complete");
+  complete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "complete");
 
-  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crossOrigin");
+  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "crossOrigin");
 
-  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
+  crossOrigin_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "crossOrigin", __arg_0);
 
-  currentSrc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentSrc");
+  currentSrc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "currentSrc");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "height", __arg_0);
 
-  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "hspace");
 
-  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
+  hspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "hspace", __arg_0);
 
-  isMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isMap");
+  isMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "isMap");
 
-  isMap_Setter_(mthis, __arg_0) => mthis["isMap"] = __arg_0;
+  isMap_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "isMap", __arg_0);
 
-  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "longDesc");
+  longDesc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "longDesc");
 
-  longDesc_Setter_(mthis, __arg_0) => mthis["longDesc"] = __arg_0;
+  longDesc_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "longDesc", __arg_0);
 
-  lowsrc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lowsrc");
+  lowsrc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "lowsrc");
 
-  lowsrc_Setter_(mthis, __arg_0) => mthis["lowsrc"] = __arg_0;
+  lowsrc_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "lowsrc", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "name", __arg_0);
 
-  naturalHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "naturalHeight");
+  naturalHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "naturalHeight");
 
-  naturalWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "naturalWidth");
+  naturalWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "naturalWidth");
 
-  sizes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sizes");
+  sizes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "sizes");
 
-  sizes_Setter_(mthis, __arg_0) => mthis["sizes"] = __arg_0;
+  sizes_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "sizes", __arg_0);
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "src", __arg_0);
 
-  srcset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "srcset");
+  srcset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "srcset");
 
-  srcset_Setter_(mthis, __arg_0) => mthis["srcset"] = __arg_0;
+  srcset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "srcset", __arg_0);
 
-  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useMap");
+  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "useMap");
 
-  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
+  useMap_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "useMap", __arg_0);
 
-  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "vspace");
 
-  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+  vspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "vspace", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLImageElement */, "width", __arg_0);
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLImageElement */, "y");
 
 }
 
 class BlinkHTMLInputElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLInputElement();
 
-  accept_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "accept");
+  accept_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "accept");
 
-  accept_Setter_(mthis, __arg_0) => mthis["accept"] = __arg_0;
+  accept_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "accept", __arg_0);
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "align", __arg_0);
 
-  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alt");
+  alt_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "alt");
 
-  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
+  alt_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "alt", __arg_0);
 
-  autocapitalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autocapitalize");
+  autocapitalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "autocapitalize");
 
-  autocapitalize_Setter_(mthis, __arg_0) => mthis["autocapitalize"] = __arg_0;
+  autocapitalize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "autocapitalize", __arg_0);
 
-  autocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autocomplete");
+  autocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "autocomplete");
 
-  autocomplete_Setter_(mthis, __arg_0) => mthis["autocomplete"] = __arg_0;
+  autocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "autocomplete", __arg_0);
 
-  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
+  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "autofocus");
 
-  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
+  autofocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "autofocus", __arg_0);
 
-  capture_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "capture");
+  capture_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "capture");
 
-  capture_Setter_(mthis, __arg_0) => mthis["capture"] = __arg_0;
+  capture_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "capture", __arg_0);
 
-  checked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "checked");
+  checked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "checked");
 
-  checked_Setter_(mthis, __arg_0) => mthis["checked"] = __arg_0;
+  checked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "checked", __arg_0);
 
-  defaultChecked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultChecked");
+  defaultChecked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "defaultChecked");
 
-  defaultChecked_Setter_(mthis, __arg_0) => mthis["defaultChecked"] = __arg_0;
+  defaultChecked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "defaultChecked", __arg_0);
 
-  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultValue");
+  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "defaultValue");
 
-  defaultValue_Setter_(mthis, __arg_0) => mthis["defaultValue"] = __arg_0;
+  defaultValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "defaultValue", __arg_0);
 
-  dirName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dirName");
+  dirName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "dirName");
 
-  dirName_Setter_(mthis, __arg_0) => mthis["dirName"] = __arg_0;
+  dirName_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "dirName", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "disabled", __arg_0);
 
-  files_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "files");
+  files_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "files");
 
-  files_Setter_(mthis, __arg_0) => mthis["files"] = __arg_0;
+  files_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "files", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "form");
 
-  formAction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formAction");
+  formAction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "formAction");
 
-  formAction_Setter_(mthis, __arg_0) => mthis["formAction"] = __arg_0;
+  formAction_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "formAction", __arg_0);
 
-  formEnctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formEnctype");
+  formEnctype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "formEnctype");
 
-  formEnctype_Setter_(mthis, __arg_0) => mthis["formEnctype"] = __arg_0;
+  formEnctype_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "formEnctype", __arg_0);
 
-  formMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formMethod");
+  formMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "formMethod");
 
-  formMethod_Setter_(mthis, __arg_0) => mthis["formMethod"] = __arg_0;
+  formMethod_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "formMethod", __arg_0);
 
-  formNoValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formNoValidate");
+  formNoValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "formNoValidate");
 
-  formNoValidate_Setter_(mthis, __arg_0) => mthis["formNoValidate"] = __arg_0;
+  formNoValidate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "formNoValidate", __arg_0);
 
-  formTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formTarget");
+  formTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "formTarget");
 
-  formTarget_Setter_(mthis, __arg_0) => mthis["formTarget"] = __arg_0;
+  formTarget_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "formTarget", __arg_0);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "height", __arg_0);
 
-  incremental_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "incremental");
+  incremental_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "incremental");
 
-  incremental_Setter_(mthis, __arg_0) => mthis["incremental"] = __arg_0;
+  incremental_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "incremental", __arg_0);
 
-  indeterminate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indeterminate");
+  indeterminate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "indeterminate");
 
-  indeterminate_Setter_(mthis, __arg_0) => mthis["indeterminate"] = __arg_0;
+  indeterminate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "indeterminate", __arg_0);
 
-  inputMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputMode");
+  inputMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "inputMode");
 
-  inputMode_Setter_(mthis, __arg_0) => mthis["inputMode"] = __arg_0;
+  inputMode_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "inputMode", __arg_0);
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "labels");
 
-  list_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "list");
+  list_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "list");
 
-  max_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "max");
+  max_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "max");
 
-  max_Setter_(mthis, __arg_0) => mthis["max"] = __arg_0;
+  max_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "max", __arg_0);
 
-  maxLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxLength");
+  maxLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "maxLength");
 
-  maxLength_Setter_(mthis, __arg_0) => mthis["maxLength"] = __arg_0;
+  maxLength_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "maxLength", __arg_0);
 
-  min_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "min");
+  min_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "min");
 
-  min_Setter_(mthis, __arg_0) => mthis["min"] = __arg_0;
+  min_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "min", __arg_0);
 
-  minLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minLength");
+  minLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "minLength");
 
-  minLength_Setter_(mthis, __arg_0) => mthis["minLength"] = __arg_0;
+  minLength_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "minLength", __arg_0);
 
-  multiple_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "multiple");
+  multiple_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "multiple");
 
-  multiple_Setter_(mthis, __arg_0) => mthis["multiple"] = __arg_0;
+  multiple_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "multiple", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "name", __arg_0);
 
-  pattern_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pattern");
+  pattern_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "pattern");
 
-  pattern_Setter_(mthis, __arg_0) => mthis["pattern"] = __arg_0;
+  pattern_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "pattern", __arg_0);
 
-  placeholder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "placeholder");
+  placeholder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "placeholder");
 
-  placeholder_Setter_(mthis, __arg_0) => mthis["placeholder"] = __arg_0;
+  placeholder_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "placeholder", __arg_0);
 
-  readOnly_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readOnly");
+  readOnly_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "readOnly");
 
-  readOnly_Setter_(mthis, __arg_0) => mthis["readOnly"] = __arg_0;
+  readOnly_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "readOnly", __arg_0);
 
-  required_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "required");
+  required_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "required");
 
-  required_Setter_(mthis, __arg_0) => mthis["required"] = __arg_0;
+  required_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "required", __arg_0);
 
-  selectionDirection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionDirection");
+  selectionDirection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "selectionDirection");
 
-  selectionDirection_Setter_(mthis, __arg_0) => mthis["selectionDirection"] = __arg_0;
+  selectionDirection_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "selectionDirection", __arg_0);
 
-  selectionEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionEnd");
+  selectionEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "selectionEnd");
 
-  selectionEnd_Setter_(mthis, __arg_0) => mthis["selectionEnd"] = __arg_0;
+  selectionEnd_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "selectionEnd", __arg_0);
 
-  selectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionStart");
+  selectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "selectionStart");
 
-  selectionStart_Setter_(mthis, __arg_0) => mthis["selectionStart"] = __arg_0;
+  selectionStart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "selectionStart", __arg_0);
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "size");
 
-  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+  size_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "size", __arg_0);
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "src", __arg_0);
 
-  step_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "step");
+  step_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "step");
 
-  step_Setter_(mthis, __arg_0) => mthis["step"] = __arg_0;
+  step_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "step", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "type", __arg_0);
 
-  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useMap");
+  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "useMap");
 
-  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
+  useMap_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "useMap", __arg_0);
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "validity");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "value", __arg_0);
 
-  valueAsDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsDate");
+  valueAsDate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "valueAsDate");
 
-  valueAsDate_Setter_(mthis, __arg_0) => mthis["valueAsDate"] = __arg_0;
+  valueAsDate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "valueAsDate", __arg_0);
 
-  valueAsNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsNumber");
+  valueAsNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "valueAsNumber");
 
-  valueAsNumber_Setter_(mthis, __arg_0) => mthis["valueAsNumber"] = __arg_0;
+  valueAsNumber_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "valueAsNumber", __arg_0);
 
-  webkitEntries_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitEntries");
+  webkitEntries_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "webkitEntries");
 
-  webkitdirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitdirectory");
+  webkitdirectory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "webkitdirectory");
 
-  webkitdirectory_Setter_(mthis, __arg_0) => mthis["webkitdirectory"] = __arg_0;
+  webkitdirectory_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "webkitdirectory", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLInputElement */, "width", __arg_0);
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLInputElement */, "willValidate");
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "checkValidity", []);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "reportValidity", []);
 
-  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "select", []);
+  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "select", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setCustomValidity", [__arg_0]);
 
-  setRangeText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", []);
+  setRangeText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setRangeText", []);
 
-  setRangeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0]);
+  setRangeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setRangeText", [__arg_0]);
 
-  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0, __arg_1]);
+  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setRangeText", [__arg_0, __arg_1]);
 
-  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0, __arg_1, __arg_2]);
+  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setRangeText", [__arg_0, __arg_1, __arg_2]);
 
-  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setRangeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  setSelectionRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", []);
+  setSelectionRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setSelectionRange", []);
 
-  setSelectionRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0]);
+  setSelectionRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setSelectionRange", [__arg_0]);
 
-  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0, __arg_1]);
+  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setSelectionRange", [__arg_0, __arg_1]);
 
-  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0, __arg_1, __arg_2]);
+  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "setSelectionRange", [__arg_0, __arg_1, __arg_2]);
 
-  stepDown_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stepDown", []);
+  stepDown_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "stepDown", []);
 
-  stepDown_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stepDown", [__arg_0]);
+  stepDown_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "stepDown", [__arg_0]);
 
-  stepUp_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stepUp", []);
+  stepUp_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "stepUp", []);
 
-  stepUp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stepUp", [__arg_0]);
+  stepUp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLInputElement */, "stepUp", [__arg_0]);
 
 }
 
 class BlinkHTMLKeygenElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLKeygenElement();
 
-  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
+  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "autofocus");
 
-  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
+  autofocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLKeygenElement */, "autofocus", __arg_0);
 
-  challenge_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "challenge");
+  challenge_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "challenge");
 
-  challenge_Setter_(mthis, __arg_0) => mthis["challenge"] = __arg_0;
+  challenge_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLKeygenElement */, "challenge", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLKeygenElement */, "disabled", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "form");
 
-  keytype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keytype");
+  keytype_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "keytype");
 
-  keytype_Setter_(mthis, __arg_0) => mthis["keytype"] = __arg_0;
+  keytype_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLKeygenElement */, "keytype", __arg_0);
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "labels");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLKeygenElement */, "name", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "type");
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "validity");
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLKeygenElement */, "willValidate");
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLKeygenElement */, "checkValidity", []);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLKeygenElement */, "reportValidity", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLKeygenElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLKeygenElement */, "setCustomValidity", [__arg_0]);
 
 }
 
 class BlinkHTMLLIElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLIElement();
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLIElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLIElement */, "type", __arg_0);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLIElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLIElement */, "value", __arg_0);
 
 }
 
 class BlinkHTMLLabelElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLabelElement();
 
-  control_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "control");
+  control_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLabelElement */, "control");
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLabelElement */, "form");
 
-  htmlFor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "htmlFor");
+  htmlFor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLabelElement */, "htmlFor");
 
-  htmlFor_Setter_(mthis, __arg_0) => mthis["htmlFor"] = __arg_0;
+  htmlFor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLabelElement */, "htmlFor", __arg_0);
 
 }
 
 class BlinkHTMLLegendElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLegendElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLegendElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLegendElement */, "align", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLegendElement */, "form");
 
 }
 
 class BlinkHTMLLinkElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLinkElement();
 
-  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charset");
+  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "charset");
 
-  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
+  charset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "charset", __arg_0);
 
-  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crossOrigin");
+  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "crossOrigin");
 
-  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
+  crossOrigin_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "crossOrigin", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "disabled", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "href");
 
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+  href_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "href", __arg_0);
 
-  hreflang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hreflang");
+  hreflang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "hreflang");
 
-  hreflang_Setter_(mthis, __arg_0) => mthis["hreflang"] = __arg_0;
+  hreflang_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "hreflang", __arg_0);
 
-  import_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "import");
+  import_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "import");
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
+  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "integrity");
 
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
+  integrity_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "integrity", __arg_0);
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "media");
 
-  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
+  media_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "media", __arg_0);
 
-  rel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rel");
+  rel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "rel");
 
-  rel_Setter_(mthis, __arg_0) => mthis["rel"] = __arg_0;
+  rel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "rel", __arg_0);
 
-  rev_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rev");
+  rev_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "rev");
 
-  rev_Setter_(mthis, __arg_0) => mthis["rev"] = __arg_0;
+  rev_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "rev", __arg_0);
 
-  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sheet");
+  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "sheet");
 
-  sizes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sizes");
+  sizes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "sizes");
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "target");
 
-  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
+  target_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "target", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLLinkElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLLinkElement */, "type", __arg_0);
 
 }
 
 class BlinkHTMLMapElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMapElement();
 
-  areas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "areas");
+  areas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMapElement */, "areas");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMapElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMapElement */, "name", __arg_0);
 
 }
 
 class BlinkHTMLMarqueeElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMarqueeElement();
 
-  behavior_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "behavior");
+  behavior_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "behavior");
 
-  behavior_Setter_(mthis, __arg_0) => mthis["behavior"] = __arg_0;
+  behavior_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "behavior", __arg_0);
 
-  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "bgColor");
 
-  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+  bgColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "bgColor", __arg_0);
 
-  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
+  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "direction");
 
-  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
+  direction_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "direction", __arg_0);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "height", __arg_0);
 
-  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "hspace");
 
-  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
+  hspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "hspace", __arg_0);
 
-  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loop");
+  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "loop");
 
-  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
+  loop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "loop", __arg_0);
 
-  scrollAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollAmount");
+  scrollAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "scrollAmount");
 
-  scrollAmount_Setter_(mthis, __arg_0) => mthis["scrollAmount"] = __arg_0;
+  scrollAmount_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "scrollAmount", __arg_0);
 
-  scrollDelay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollDelay");
+  scrollDelay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "scrollDelay");
 
-  scrollDelay_Setter_(mthis, __arg_0) => mthis["scrollDelay"] = __arg_0;
+  scrollDelay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "scrollDelay", __arg_0);
 
-  trueSpeed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "trueSpeed");
+  trueSpeed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "trueSpeed");
 
-  trueSpeed_Setter_(mthis, __arg_0) => mthis["trueSpeed"] = __arg_0;
+  trueSpeed_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "trueSpeed", __arg_0);
 
-  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "vspace");
 
-  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+  vspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "vspace", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMarqueeElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMarqueeElement */, "width", __arg_0);
 
-  attachedCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachedCallback", []);
+  attachedCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "attachedCallback", []);
 
-  attributeChangedCallback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attributeChangedCallback", [__arg_0]);
+  attributeChangedCallback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "attributeChangedCallback", [__arg_0]);
 
-  attributeChangedCallback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attributeChangedCallback", [__arg_0, __arg_1]);
+  attributeChangedCallback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "attributeChangedCallback", [__arg_0, __arg_1]);
 
-  attributeChangedCallback_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "attributeChangedCallback", [__arg_0, __arg_1, __arg_2]);
+  attributeChangedCallback_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "attributeChangedCallback", [__arg_0, __arg_1, __arg_2]);
 
-  createdCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createdCallback", []);
+  createdCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "createdCallback", []);
 
-  detachedCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachedCallback", []);
+  detachedCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "detachedCallback", []);
 
-  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
+  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "start", []);
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMarqueeElement */, "stop", []);
 
 }
 
 class BlinkHTMLMediaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMediaElement();
 
-  audioTracks_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "audioTracks");
+  audioTracks_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "audioTracks");
 
-  autoplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autoplay");
+  autoplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "autoplay");
 
-  autoplay_Setter_(mthis, __arg_0) => mthis["autoplay"] = __arg_0;
+  autoplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "autoplay", __arg_0);
 
-  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffered");
+  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "buffered");
 
-  controller_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "controller");
+  controller_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "controller");
 
-  controller_Setter_(mthis, __arg_0) => mthis["controller"] = __arg_0;
+  controller_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "controller", __arg_0);
 
-  controls_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "controls");
+  controls_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "controls");
 
-  controls_Setter_(mthis, __arg_0) => mthis["controls"] = __arg_0;
+  controls_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "controls", __arg_0);
 
-  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crossOrigin");
+  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "crossOrigin");
 
-  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
+  crossOrigin_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "crossOrigin", __arg_0);
 
-  currentSrc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentSrc");
+  currentSrc_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "currentSrc");
 
-  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "currentTime");
 
-  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
+  currentTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "currentTime", __arg_0);
 
-  defaultMuted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultMuted");
+  defaultMuted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "defaultMuted");
 
-  defaultMuted_Setter_(mthis, __arg_0) => mthis["defaultMuted"] = __arg_0;
+  defaultMuted_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "defaultMuted", __arg_0);
 
-  defaultPlaybackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultPlaybackRate");
+  defaultPlaybackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "defaultPlaybackRate");
 
-  defaultPlaybackRate_Setter_(mthis, __arg_0) => mthis["defaultPlaybackRate"] = __arg_0;
+  defaultPlaybackRate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "defaultPlaybackRate", __arg_0);
 
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "duration");
 
-  ended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ended");
+  ended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "ended");
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "error");
 
-  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loop");
+  loop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "loop");
 
-  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
+  loop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "loop", __arg_0);
 
-  mediaGroup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaGroup");
+  mediaGroup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "mediaGroup");
 
-  mediaGroup_Setter_(mthis, __arg_0) => mthis["mediaGroup"] = __arg_0;
+  mediaGroup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "mediaGroup", __arg_0);
 
-  mediaKeys_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaKeys");
+  mediaKeys_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "mediaKeys");
 
-  muted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "muted");
+  muted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "muted");
 
-  muted_Setter_(mthis, __arg_0) => mthis["muted"] = __arg_0;
+  muted_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "muted", __arg_0);
 
-  networkState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "networkState");
+  networkState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "networkState");
 
-  onencrypted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onencrypted");
+  onencrypted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "onencrypted");
 
-  onencrypted_Setter_(mthis, __arg_0) => mthis["onencrypted"] = __arg_0;
+  onencrypted_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "onencrypted", __arg_0);
 
-  onwebkitkeyadded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitkeyadded");
+  onwebkitkeyadded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "onwebkitkeyadded");
 
-  onwebkitkeyadded_Setter_(mthis, __arg_0) => mthis["onwebkitkeyadded"] = __arg_0;
+  onwebkitkeyadded_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "onwebkitkeyadded", __arg_0);
 
-  onwebkitkeyerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitkeyerror");
+  onwebkitkeyerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "onwebkitkeyerror");
 
-  onwebkitkeyerror_Setter_(mthis, __arg_0) => mthis["onwebkitkeyerror"] = __arg_0;
+  onwebkitkeyerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "onwebkitkeyerror", __arg_0);
 
-  onwebkitkeymessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitkeymessage");
+  onwebkitkeymessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "onwebkitkeymessage");
 
-  onwebkitkeymessage_Setter_(mthis, __arg_0) => mthis["onwebkitkeymessage"] = __arg_0;
+  onwebkitkeymessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "onwebkitkeymessage", __arg_0);
 
-  onwebkitneedkey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitneedkey");
+  onwebkitneedkey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "onwebkitneedkey");
 
-  onwebkitneedkey_Setter_(mthis, __arg_0) => mthis["onwebkitneedkey"] = __arg_0;
+  onwebkitneedkey_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "onwebkitneedkey", __arg_0);
 
-  paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paused");
+  paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "paused");
 
-  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "playbackRate");
 
-  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+  playbackRate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "playbackRate", __arg_0);
 
-  played_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "played");
+  played_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "played");
 
-  preload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preload");
+  preload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "preload");
 
-  preload_Setter_(mthis, __arg_0) => mthis["preload"] = __arg_0;
+  preload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "preload", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "readyState");
 
-  seekable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "seekable");
+  seekable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "seekable");
 
-  seeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "seeking");
+  seeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "seeking");
 
-  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "session");
+  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "session");
 
-  session_Setter_(mthis, __arg_0) => mthis["session"] = __arg_0;
+  session_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "session", __arg_0);
 
-  sinkId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sinkId");
+  sinkId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "sinkId");
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "src", __arg_0);
 
-  textTracks_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textTracks");
+  textTracks_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "textTracks");
 
-  videoTracks_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "videoTracks");
+  videoTracks_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "videoTracks");
 
-  volume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "volume");
+  volume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "volume");
 
-  volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
+  volume_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMediaElement */, "volume", __arg_0);
 
-  webkitAudioDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitAudioDecodedByteCount");
+  webkitAudioDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "webkitAudioDecodedByteCount");
 
-  webkitVideoDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitVideoDecodedByteCount");
+  webkitVideoDecodedByteCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMediaElement */, "webkitVideoDecodedByteCount");
 
-  addTextTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", []);
+  addTextTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "addTextTrack", []);
 
-  addTextTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0]);
+  addTextTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "addTextTrack", [__arg_0]);
 
-  addTextTrack_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0, __arg_1]);
+  addTextTrack_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "addTextTrack", [__arg_0, __arg_1]);
 
-  addTextTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addTextTrack", [__arg_0, __arg_1, __arg_2]);
+  addTextTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "addTextTrack", [__arg_0, __arg_1, __arg_2]);
 
-  canPlayType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", []);
+  canPlayType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "canPlayType", []);
 
-  canPlayType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", [__arg_0]);
+  canPlayType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "canPlayType", [__arg_0]);
 
-  canPlayType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "canPlayType", [__arg_0, __arg_1]);
+  canPlayType_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "canPlayType", [__arg_0, __arg_1]);
 
-  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "load", []);
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "pause", []);
 
-  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
+  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "play", []);
 
-  setMediaKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setMediaKeys", []);
+  setMediaKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "setMediaKeys", []);
 
-  setMediaKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setMediaKeys", [__arg_0]);
+  setMediaKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "setMediaKeys", [__arg_0]);
 
-  setSinkId_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setSinkId", []);
+  setSinkId_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "setSinkId", []);
 
-  setSinkId_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setSinkId", [__arg_0]);
+  setSinkId_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "setSinkId", [__arg_0]);
 
-  webkitAddKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", []);
+  webkitAddKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitAddKey", []);
 
-  webkitAddKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", [__arg_0]);
+  webkitAddKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitAddKey", [__arg_0]);
 
-  webkitAddKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", [__arg_0, __arg_1]);
+  webkitAddKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitAddKey", [__arg_0, __arg_1]);
 
-  webkitAddKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", [__arg_0, __arg_1, __arg_2]);
+  webkitAddKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitAddKey", [__arg_0, __arg_1, __arg_2]);
 
-  webkitAddKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitAddKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  webkitAddKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitAddKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  webkitCancelKeyRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelKeyRequest", []);
+  webkitCancelKeyRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitCancelKeyRequest", []);
 
-  webkitCancelKeyRequest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelKeyRequest", [__arg_0]);
+  webkitCancelKeyRequest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitCancelKeyRequest", [__arg_0]);
 
-  webkitCancelKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelKeyRequest", [__arg_0, __arg_1]);
+  webkitCancelKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitCancelKeyRequest", [__arg_0, __arg_1]);
 
-  webkitGenerateKeyRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitGenerateKeyRequest", []);
+  webkitGenerateKeyRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitGenerateKeyRequest", []);
 
-  webkitGenerateKeyRequest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitGenerateKeyRequest", [__arg_0]);
+  webkitGenerateKeyRequest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitGenerateKeyRequest", [__arg_0]);
 
-  webkitGenerateKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitGenerateKeyRequest", [__arg_0, __arg_1]);
+  webkitGenerateKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLMediaElement */, "webkitGenerateKeyRequest", [__arg_0, __arg_1]);
 
 }
 
 class BlinkHTMLMenuElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMenuElement();
 
-  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuElement */, "compact");
 
-  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+  compact_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuElement */, "compact", __arg_0);
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuElement */, "label");
 
-  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
+  label_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuElement */, "label", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuElement */, "type", __arg_0);
 
 }
 
 class BlinkHTMLMenuItemElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMenuItemElement();
 
-  checked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "checked");
+  checked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuItemElement */, "checked");
 
-  checked_Setter_(mthis, __arg_0) => mthis["checked"] = __arg_0;
+  checked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuItemElement */, "checked", __arg_0);
 
-  default_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "default");
+  default_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuItemElement */, "default");
 
-  default_Setter_(mthis, __arg_0) => mthis["default"] = __arg_0;
+  default_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuItemElement */, "default", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuItemElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuItemElement */, "disabled", __arg_0);
 
-  icon_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "icon");
+  icon_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuItemElement */, "icon");
 
-  icon_Setter_(mthis, __arg_0) => mthis["icon"] = __arg_0;
+  icon_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuItemElement */, "icon", __arg_0);
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuItemElement */, "label");
 
-  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
+  label_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuItemElement */, "label", __arg_0);
 
-  radiogroup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiogroup");
+  radiogroup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuItemElement */, "radiogroup");
 
-  radiogroup_Setter_(mthis, __arg_0) => mthis["radiogroup"] = __arg_0;
+  radiogroup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuItemElement */, "radiogroup", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMenuItemElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMenuItemElement */, "type", __arg_0);
 
 }
 
 class BlinkHTMLMetaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMetaElement();
 
-  content_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "content");
+  content_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMetaElement */, "content");
 
-  content_Setter_(mthis, __arg_0) => mthis["content"] = __arg_0;
+  content_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMetaElement */, "content", __arg_0);
 
-  httpEquiv_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "httpEquiv");
+  httpEquiv_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMetaElement */, "httpEquiv");
 
-  httpEquiv_Setter_(mthis, __arg_0) => mthis["httpEquiv"] = __arg_0;
+  httpEquiv_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMetaElement */, "httpEquiv", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMetaElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMetaElement */, "name", __arg_0);
 
-  scheme_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scheme");
+  scheme_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMetaElement */, "scheme");
 
-  scheme_Setter_(mthis, __arg_0) => mthis["scheme"] = __arg_0;
+  scheme_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMetaElement */, "scheme", __arg_0);
 
 }
 
 class BlinkHTMLMeterElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMeterElement();
 
-  high_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "high");
+  high_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMeterElement */, "high");
 
-  high_Setter_(mthis, __arg_0) => mthis["high"] = __arg_0;
+  high_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMeterElement */, "high", __arg_0);
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMeterElement */, "labels");
 
-  low_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "low");
+  low_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMeterElement */, "low");
 
-  low_Setter_(mthis, __arg_0) => mthis["low"] = __arg_0;
+  low_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMeterElement */, "low", __arg_0);
 
-  max_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "max");
+  max_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMeterElement */, "max");
 
-  max_Setter_(mthis, __arg_0) => mthis["max"] = __arg_0;
+  max_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMeterElement */, "max", __arg_0);
 
-  min_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "min");
+  min_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMeterElement */, "min");
 
-  min_Setter_(mthis, __arg_0) => mthis["min"] = __arg_0;
+  min_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMeterElement */, "min", __arg_0);
 
-  optimum_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "optimum");
+  optimum_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMeterElement */, "optimum");
 
-  optimum_Setter_(mthis, __arg_0) => mthis["optimum"] = __arg_0;
+  optimum_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMeterElement */, "optimum", __arg_0);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLMeterElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLMeterElement */, "value", __arg_0);
 
 }
 
 class BlinkHTMLModElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLModElement();
 
-  cite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cite");
+  cite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLModElement */, "cite");
 
-  cite_Setter_(mthis, __arg_0) => mthis["cite"] = __arg_0;
+  cite_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLModElement */, "cite", __arg_0);
 
-  dateTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dateTime");
+  dateTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLModElement */, "dateTime");
 
-  dateTime_Setter_(mthis, __arg_0) => mthis["dateTime"] = __arg_0;
+  dateTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLModElement */, "dateTime", __arg_0);
 
 }
 
 class BlinkHTMLOListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOListElement();
 
-  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOListElement */, "compact");
 
-  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+  compact_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOListElement */, "compact", __arg_0);
 
-  reversed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reversed");
+  reversed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOListElement */, "reversed");
 
-  reversed_Setter_(mthis, __arg_0) => mthis["reversed"] = __arg_0;
+  reversed_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOListElement */, "reversed", __arg_0);
 
-  start_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "start");
+  start_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOListElement */, "start");
 
-  start_Setter_(mthis, __arg_0) => mthis["start"] = __arg_0;
+  start_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOListElement */, "start", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOListElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOListElement */, "type", __arg_0);
 
 }
 
 class BlinkHTMLObjectElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLObjectElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "align", __arg_0);
 
-  archive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "archive");
+  archive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "archive");
 
-  archive_Setter_(mthis, __arg_0) => mthis["archive"] = __arg_0;
+  archive_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "archive", __arg_0);
 
-  border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "border");
+  border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "border");
 
-  border_Setter_(mthis, __arg_0) => mthis["border"] = __arg_0;
+  border_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "border", __arg_0);
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "code");
 
-  code_Setter_(mthis, __arg_0) => mthis["code"] = __arg_0;
+  code_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "code", __arg_0);
 
-  codeBase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "codeBase");
+  codeBase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "codeBase");
 
-  codeBase_Setter_(mthis, __arg_0) => mthis["codeBase"] = __arg_0;
+  codeBase_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "codeBase", __arg_0);
 
-  codeType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "codeType");
+  codeType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "codeType");
 
-  codeType_Setter_(mthis, __arg_0) => mthis["codeType"] = __arg_0;
+  codeType_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "codeType", __arg_0);
 
-  contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "contentDocument");
+  contentDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "contentDocument");
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "data");
 
-  data_Setter_(mthis, __arg_0) => mthis["data"] = __arg_0;
+  data_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "data", __arg_0);
 
-  declare_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "declare");
+  declare_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "declare");
 
-  declare_Setter_(mthis, __arg_0) => mthis["declare"] = __arg_0;
+  declare_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "declare", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "form");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "height", __arg_0);
 
-  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hspace");
+  hspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "hspace");
 
-  hspace_Setter_(mthis, __arg_0) => mthis["hspace"] = __arg_0;
+  hspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "hspace", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "name", __arg_0);
 
-  standby_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "standby");
+  standby_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "standby");
 
-  standby_Setter_(mthis, __arg_0) => mthis["standby"] = __arg_0;
+  standby_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "standby", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "type", __arg_0);
 
-  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useMap");
+  useMap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "useMap");
 
-  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
+  useMap_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "useMap", __arg_0);
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "validity");
 
-  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vspace");
+  vspace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "vspace");
 
-  vspace_Setter_(mthis, __arg_0) => mthis["vspace"] = __arg_0;
+  vspace_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "vspace", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLObjectElement */, "width", __arg_0);
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLObjectElement */, "willValidate");
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLObjectElement */, "__getter__", [__arg_0]);
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLObjectElement */, "__setter__", [__arg_0, __arg_1]);
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLObjectElement */, "checkValidity", []);
 
-  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSVGDocument", []);
+  getSVGDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLObjectElement */, "getSVGDocument", []);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLObjectElement */, "reportValidity", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLObjectElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLObjectElement */, "setCustomValidity", [__arg_0]);
 
 }
 
 class BlinkHTMLOptGroupElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOptGroupElement();
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptGroupElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptGroupElement */, "disabled", __arg_0);
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptGroupElement */, "label");
 
-  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
+  label_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptGroupElement */, "label", __arg_0);
 
 }
 
 class BlinkHTMLOptionElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOptionElement();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Option"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Option");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Option"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Option", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Option"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("Option", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Option"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("Option", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Option"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("Option", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  defaultSelected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultSelected");
+  defaultSelected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "defaultSelected");
 
-  defaultSelected_Setter_(mthis, __arg_0) => mthis["defaultSelected"] = __arg_0;
+  defaultSelected_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionElement */, "defaultSelected", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionElement */, "disabled", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "form");
 
-  index_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "index");
+  index_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "index");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "label");
 
-  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
+  label_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionElement */, "label", __arg_0);
 
-  selected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selected");
+  selected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "selected");
 
-  selected_Setter_(mthis, __arg_0) => mthis["selected"] = __arg_0;
+  selected_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionElement */, "selected", __arg_0);
 
-  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "text");
 
-  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+  text_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionElement */, "text", __arg_0);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionElement */, "value", __arg_0);
 
 }
 
 class BlinkHTMLOptionsCollection extends BlinkHTMLCollection {
   static final instance = new BlinkHTMLOptionsCollection();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionsCollection */, "length");
 
-  length_Setter_(mthis, __arg_0) => mthis["length"] = __arg_0;
+  length_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionsCollection */, "length", __arg_0);
 
-  selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedIndex");
+  selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOptionsCollection */, "selectedIndex");
 
-  selectedIndex_Setter_(mthis, __arg_0) => mthis["selectedIndex"] = __arg_0;
+  selectedIndex_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOptionsCollection */, "selectedIndex", __arg_0);
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "__setter__", [__arg_0, __arg_1]);
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "add", [__arg_0]);
 
-  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "add", [__arg_0, __arg_1]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "item", [__arg_0]);
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "namedItem", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "remove", []);
 
-  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
+  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOptionsCollection */, "remove", [__arg_0]);
 
 }
 
 class BlinkHTMLOutputElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOutputElement();
 
-  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultValue");
+  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "defaultValue");
 
-  defaultValue_Setter_(mthis, __arg_0) => mthis["defaultValue"] = __arg_0;
+  defaultValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOutputElement */, "defaultValue", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "form");
 
-  htmlFor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "htmlFor");
+  htmlFor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "htmlFor");
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "labels");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOutputElement */, "name", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "type");
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "validity");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLOutputElement */, "value", __arg_0);
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLOutputElement */, "willValidate");
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOutputElement */, "checkValidity", []);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOutputElement */, "reportValidity", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOutputElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLOutputElement */, "setCustomValidity", [__arg_0]);
 
 }
 
 class BlinkHTMLParagraphElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLParagraphElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLParagraphElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLParagraphElement */, "align", __arg_0);
 
 }
 
 class BlinkHTMLParamElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLParamElement();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLParamElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLParamElement */, "name", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLParamElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLParamElement */, "type", __arg_0);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLParamElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLParamElement */, "value", __arg_0);
 
-  valueType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueType");
+  valueType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLParamElement */, "valueType");
 
-  valueType_Setter_(mthis, __arg_0) => mthis["valueType"] = __arg_0;
+  valueType_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLParamElement */, "valueType", __arg_0);
 
 }
 
@@ -8881,197 +8881,197 @@
 class BlinkHTMLPreElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLPreElement();
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLPreElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLPreElement */, "width", __arg_0);
 
 }
 
 class BlinkHTMLProgressElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLProgressElement();
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLProgressElement */, "labels");
 
-  max_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "max");
+  max_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLProgressElement */, "max");
 
-  max_Setter_(mthis, __arg_0) => mthis["max"] = __arg_0;
+  max_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLProgressElement */, "max", __arg_0);
 
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLProgressElement */, "position");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLProgressElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLProgressElement */, "value", __arg_0);
 
 }
 
 class BlinkHTMLQuoteElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLQuoteElement();
 
-  cite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cite");
+  cite_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLQuoteElement */, "cite");
 
-  cite_Setter_(mthis, __arg_0) => mthis["cite"] = __arg_0;
+  cite_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLQuoteElement */, "cite", __arg_0);
 
 }
 
 class BlinkHTMLScriptElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLScriptElement();
 
-  async_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "async");
+  async_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "async");
 
-  async_Setter_(mthis, __arg_0) => mthis["async"] = __arg_0;
+  async_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "async", __arg_0);
 
-  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charset");
+  charset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "charset");
 
-  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
+  charset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "charset", __arg_0);
 
-  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crossOrigin");
+  crossOrigin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "crossOrigin");
 
-  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
+  crossOrigin_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "crossOrigin", __arg_0);
 
-  defer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defer");
+  defer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "defer");
 
-  defer_Setter_(mthis, __arg_0) => mthis["defer"] = __arg_0;
+  defer_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "defer", __arg_0);
 
-  event_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "event");
+  event_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "event");
 
-  event_Setter_(mthis, __arg_0) => mthis["event"] = __arg_0;
+  event_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "event", __arg_0);
 
-  htmlFor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "htmlFor");
+  htmlFor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "htmlFor");
 
-  htmlFor_Setter_(mthis, __arg_0) => mthis["htmlFor"] = __arg_0;
+  htmlFor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "htmlFor", __arg_0);
 
-  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "integrity");
+  integrity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "integrity");
 
-  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
+  integrity_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "integrity", __arg_0);
 
-  nonce_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nonce");
+  nonce_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "nonce");
 
-  nonce_Setter_(mthis, __arg_0) => mthis["nonce"] = __arg_0;
+  nonce_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "nonce", __arg_0);
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "src", __arg_0);
 
-  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "text");
 
-  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+  text_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "text", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLScriptElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLScriptElement */, "type", __arg_0);
 
 }
 
 class BlinkHTMLSelectElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLSelectElement();
 
-  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
+  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "autofocus");
 
-  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
+  autofocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "autofocus", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "disabled", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "form");
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "labels");
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "length");
 
-  length_Setter_(mthis, __arg_0) => mthis["length"] = __arg_0;
+  length_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "length", __arg_0);
 
-  multiple_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "multiple");
+  multiple_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "multiple");
 
-  multiple_Setter_(mthis, __arg_0) => mthis["multiple"] = __arg_0;
+  multiple_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "multiple", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "name", __arg_0);
 
-  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "options");
+  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "options");
 
-  required_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "required");
+  required_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "required");
 
-  required_Setter_(mthis, __arg_0) => mthis["required"] = __arg_0;
+  required_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "required", __arg_0);
 
-  selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedIndex");
+  selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "selectedIndex");
 
-  selectedIndex_Setter_(mthis, __arg_0) => mthis["selectedIndex"] = __arg_0;
+  selectedIndex_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "selectedIndex", __arg_0);
 
-  selectedOptions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedOptions");
+  selectedOptions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "selectedOptions");
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "size");
 
-  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+  size_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "size", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "type");
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "validity");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSelectElement */, "value", __arg_0);
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSelectElement */, "willValidate");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "__setter__", [__arg_0, __arg_1]);
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "add", [__arg_0]);
 
-  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "add", [__arg_0, __arg_1]);
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "checkValidity", []);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "item", [__arg_0]);
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "namedItem", [__arg_0]);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "reportValidity", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLSelectElement */, "setCustomValidity", [__arg_0]);
 
 }
 
 class BlinkHTMLShadowElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLShadowElement();
 
-  getDistributedNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDistributedNodes", []);
+  getDistributedNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLShadowElement */, "getDistributedNodes", []);
 
 }
 
 class BlinkHTMLSourceElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLSourceElement();
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSourceElement */, "media");
 
-  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
+  media_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSourceElement */, "media", __arg_0);
 
-  sizes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sizes");
+  sizes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSourceElement */, "sizes");
 
-  sizes_Setter_(mthis, __arg_0) => mthis["sizes"] = __arg_0;
+  sizes_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSourceElement */, "sizes", __arg_0);
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSourceElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSourceElement */, "src", __arg_0);
 
-  srcset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "srcset");
+  srcset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSourceElement */, "srcset");
 
-  srcset_Setter_(mthis, __arg_0) => mthis["srcset"] = __arg_0;
+  srcset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSourceElement */, "srcset", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLSourceElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLSourceElement */, "type", __arg_0);
 
 }
 
@@ -9083,450 +9083,450 @@
 class BlinkHTMLStyleElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLStyleElement();
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLStyleElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLStyleElement */, "disabled", __arg_0);
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLStyleElement */, "media");
 
-  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
+  media_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLStyleElement */, "media", __arg_0);
 
-  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sheet");
+  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLStyleElement */, "sheet");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLStyleElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLStyleElement */, "type", __arg_0);
 
 }
 
 class BlinkHTMLTableCaptionElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableCaptionElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCaptionElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCaptionElement */, "align", __arg_0);
 
 }
 
 class BlinkHTMLTableCellElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableCellElement();
 
-  abbr_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "abbr");
+  abbr_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "abbr");
 
-  abbr_Setter_(mthis, __arg_0) => mthis["abbr"] = __arg_0;
+  abbr_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "abbr", __arg_0);
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "align", __arg_0);
 
-  axis_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "axis");
+  axis_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "axis");
 
-  axis_Setter_(mthis, __arg_0) => mthis["axis"] = __arg_0;
+  axis_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "axis", __arg_0);
 
-  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "bgColor");
 
-  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+  bgColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "bgColor", __arg_0);
 
-  cellIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cellIndex");
+  cellIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "cellIndex");
 
-  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "ch");
 
-  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+  ch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "ch", __arg_0);
 
-  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "chOff");
 
-  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+  chOff_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "chOff", __arg_0);
 
-  colSpan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "colSpan");
+  colSpan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "colSpan");
 
-  colSpan_Setter_(mthis, __arg_0) => mthis["colSpan"] = __arg_0;
+  colSpan_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "colSpan", __arg_0);
 
-  headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "headers");
+  headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "headers");
 
-  headers_Setter_(mthis, __arg_0) => mthis["headers"] = __arg_0;
+  headers_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "headers", __arg_0);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "height", __arg_0);
 
-  noWrap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "noWrap");
+  noWrap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "noWrap");
 
-  noWrap_Setter_(mthis, __arg_0) => mthis["noWrap"] = __arg_0;
+  noWrap_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "noWrap", __arg_0);
 
-  rowSpan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowSpan");
+  rowSpan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "rowSpan");
 
-  rowSpan_Setter_(mthis, __arg_0) => mthis["rowSpan"] = __arg_0;
+  rowSpan_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "rowSpan", __arg_0);
 
-  scope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scope");
+  scope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "scope");
 
-  scope_Setter_(mthis, __arg_0) => mthis["scope"] = __arg_0;
+  scope_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "scope", __arg_0);
 
-  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "vAlign");
 
-  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+  vAlign_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "vAlign", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableCellElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableCellElement */, "width", __arg_0);
 
 }
 
 class BlinkHTMLTableColElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableColElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableColElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableColElement */, "align", __arg_0);
 
-  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableColElement */, "ch");
 
-  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+  ch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableColElement */, "ch", __arg_0);
 
-  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableColElement */, "chOff");
 
-  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+  chOff_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableColElement */, "chOff", __arg_0);
 
-  span_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "span");
+  span_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableColElement */, "span");
 
-  span_Setter_(mthis, __arg_0) => mthis["span"] = __arg_0;
+  span_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableColElement */, "span", __arg_0);
 
-  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableColElement */, "vAlign");
 
-  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+  vAlign_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableColElement */, "vAlign", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableColElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableColElement */, "width", __arg_0);
 
 }
 
 class BlinkHTMLTableElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "align", __arg_0);
 
-  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "bgColor");
 
-  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+  bgColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "bgColor", __arg_0);
 
-  border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "border");
+  border_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "border");
 
-  border_Setter_(mthis, __arg_0) => mthis["border"] = __arg_0;
+  border_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "border", __arg_0);
 
-  caption_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "caption");
+  caption_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "caption");
 
-  caption_Setter_(mthis, __arg_0) => mthis["caption"] = __arg_0;
+  caption_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "caption", __arg_0);
 
-  cellPadding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cellPadding");
+  cellPadding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "cellPadding");
 
-  cellPadding_Setter_(mthis, __arg_0) => mthis["cellPadding"] = __arg_0;
+  cellPadding_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "cellPadding", __arg_0);
 
-  cellSpacing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cellSpacing");
+  cellSpacing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "cellSpacing");
 
-  cellSpacing_Setter_(mthis, __arg_0) => mthis["cellSpacing"] = __arg_0;
+  cellSpacing_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "cellSpacing", __arg_0);
 
-  frame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frame");
+  frame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "frame");
 
-  frame_Setter_(mthis, __arg_0) => mthis["frame"] = __arg_0;
+  frame_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "frame", __arg_0);
 
-  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "rows");
 
-  rules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rules");
+  rules_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "rules");
 
-  rules_Setter_(mthis, __arg_0) => mthis["rules"] = __arg_0;
+  rules_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "rules", __arg_0);
 
-  summary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "summary");
+  summary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "summary");
 
-  summary_Setter_(mthis, __arg_0) => mthis["summary"] = __arg_0;
+  summary_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "summary", __arg_0);
 
-  tBodies_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tBodies");
+  tBodies_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "tBodies");
 
-  tFoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tFoot");
+  tFoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "tFoot");
 
-  tFoot_Setter_(mthis, __arg_0) => mthis["tFoot"] = __arg_0;
+  tFoot_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "tFoot", __arg_0);
 
-  tHead_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tHead");
+  tHead_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "tHead");
 
-  tHead_Setter_(mthis, __arg_0) => mthis["tHead"] = __arg_0;
+  tHead_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "tHead", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableElement */, "width", __arg_0);
 
-  createCaption_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createCaption", []);
+  createCaption_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "createCaption", []);
 
-  createTBody_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTBody", []);
+  createTBody_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "createTBody", []);
 
-  createTFoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTFoot", []);
+  createTFoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "createTFoot", []);
 
-  createTHead_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTHead", []);
+  createTHead_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "createTHead", []);
 
-  deleteCaption_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteCaption", []);
+  deleteCaption_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "deleteCaption", []);
 
-  deleteRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRow", []);
+  deleteRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "deleteRow", []);
 
-  deleteRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRow", [__arg_0]);
+  deleteRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "deleteRow", [__arg_0]);
 
-  deleteTFoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTFoot", []);
+  deleteTFoot_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "deleteTFoot", []);
 
-  deleteTHead_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTHead", []);
+  deleteTHead_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "deleteTHead", []);
 
-  insertRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRow", []);
+  insertRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "insertRow", []);
 
-  insertRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRow", [__arg_0]);
+  insertRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableElement */, "insertRow", [__arg_0]);
 
 }
 
 class BlinkHTMLTableRowElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableRowElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableRowElement */, "align", __arg_0);
 
-  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bgColor");
+  bgColor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "bgColor");
 
-  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
+  bgColor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableRowElement */, "bgColor", __arg_0);
 
-  cells_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cells");
+  cells_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "cells");
 
-  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "ch");
 
-  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+  ch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableRowElement */, "ch", __arg_0);
 
-  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "chOff");
 
-  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+  chOff_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableRowElement */, "chOff", __arg_0);
 
-  rowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowIndex");
+  rowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "rowIndex");
 
-  sectionRowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sectionRowIndex");
+  sectionRowIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "sectionRowIndex");
 
-  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableRowElement */, "vAlign");
 
-  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+  vAlign_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableRowElement */, "vAlign", __arg_0);
 
-  deleteCell_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteCell", []);
+  deleteCell_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableRowElement */, "deleteCell", []);
 
-  deleteCell_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteCell", [__arg_0]);
+  deleteCell_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableRowElement */, "deleteCell", [__arg_0]);
 
-  insertCell_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertCell", []);
+  insertCell_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableRowElement */, "insertCell", []);
 
-  insertCell_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertCell", [__arg_0]);
+  insertCell_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableRowElement */, "insertCell", [__arg_0]);
 
 }
 
 class BlinkHTMLTableSectionElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableSectionElement();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableSectionElement */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableSectionElement */, "align", __arg_0);
 
-  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ch");
+  ch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableSectionElement */, "ch");
 
-  ch_Setter_(mthis, __arg_0) => mthis["ch"] = __arg_0;
+  ch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableSectionElement */, "ch", __arg_0);
 
-  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "chOff");
+  chOff_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableSectionElement */, "chOff");
 
-  chOff_Setter_(mthis, __arg_0) => mthis["chOff"] = __arg_0;
+  chOff_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableSectionElement */, "chOff", __arg_0);
 
-  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableSectionElement */, "rows");
 
-  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vAlign");
+  vAlign_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTableSectionElement */, "vAlign");
 
-  vAlign_Setter_(mthis, __arg_0) => mthis["vAlign"] = __arg_0;
+  vAlign_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTableSectionElement */, "vAlign", __arg_0);
 
-  deleteRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRow", []);
+  deleteRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableSectionElement */, "deleteRow", []);
 
-  deleteRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRow", [__arg_0]);
+  deleteRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableSectionElement */, "deleteRow", [__arg_0]);
 
-  insertRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertRow", []);
+  insertRow_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableSectionElement */, "insertRow", []);
 
-  insertRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertRow", [__arg_0]);
+  insertRow_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTableSectionElement */, "insertRow", [__arg_0]);
 
 }
 
 class BlinkHTMLTemplateElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTemplateElement();
 
-  content_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "content");
+  content_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTemplateElement */, "content");
 
 }
 
 class BlinkHTMLTextAreaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTextAreaElement();
 
-  autocapitalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autocapitalize");
+  autocapitalize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "autocapitalize");
 
-  autocapitalize_Setter_(mthis, __arg_0) => mthis["autocapitalize"] = __arg_0;
+  autocapitalize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "autocapitalize", __arg_0);
 
-  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autofocus");
+  autofocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "autofocus");
 
-  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
+  autofocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "autofocus", __arg_0);
 
-  cols_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cols");
+  cols_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "cols");
 
-  cols_Setter_(mthis, __arg_0) => mthis["cols"] = __arg_0;
+  cols_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "cols", __arg_0);
 
-  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultValue");
+  defaultValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "defaultValue");
 
-  defaultValue_Setter_(mthis, __arg_0) => mthis["defaultValue"] = __arg_0;
+  defaultValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "defaultValue", __arg_0);
 
-  dirName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dirName");
+  dirName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "dirName");
 
-  dirName_Setter_(mthis, __arg_0) => mthis["dirName"] = __arg_0;
+  dirName_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "dirName", __arg_0);
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "disabled", __arg_0);
 
-  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "form");
+  form_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "form");
 
-  inputMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputMode");
+  inputMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "inputMode");
 
-  inputMode_Setter_(mthis, __arg_0) => mthis["inputMode"] = __arg_0;
+  inputMode_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "inputMode", __arg_0);
 
-  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "labels");
+  labels_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "labels");
 
-  maxLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxLength");
+  maxLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "maxLength");
 
-  maxLength_Setter_(mthis, __arg_0) => mthis["maxLength"] = __arg_0;
+  maxLength_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "maxLength", __arg_0);
 
-  minLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minLength");
+  minLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "minLength");
 
-  minLength_Setter_(mthis, __arg_0) => mthis["minLength"] = __arg_0;
+  minLength_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "minLength", __arg_0);
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "name", __arg_0);
 
-  placeholder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "placeholder");
+  placeholder_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "placeholder");
 
-  placeholder_Setter_(mthis, __arg_0) => mthis["placeholder"] = __arg_0;
+  placeholder_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "placeholder", __arg_0);
 
-  readOnly_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readOnly");
+  readOnly_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "readOnly");
 
-  readOnly_Setter_(mthis, __arg_0) => mthis["readOnly"] = __arg_0;
+  readOnly_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "readOnly", __arg_0);
 
-  required_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "required");
+  required_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "required");
 
-  required_Setter_(mthis, __arg_0) => mthis["required"] = __arg_0;
+  required_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "required", __arg_0);
 
-  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "rows");
 
-  rows_Setter_(mthis, __arg_0) => mthis["rows"] = __arg_0;
+  rows_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "rows", __arg_0);
 
-  selectionDirection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionDirection");
+  selectionDirection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "selectionDirection");
 
-  selectionDirection_Setter_(mthis, __arg_0) => mthis["selectionDirection"] = __arg_0;
+  selectionDirection_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "selectionDirection", __arg_0);
 
-  selectionEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionEnd");
+  selectionEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "selectionEnd");
 
-  selectionEnd_Setter_(mthis, __arg_0) => mthis["selectionEnd"] = __arg_0;
+  selectionEnd_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "selectionEnd", __arg_0);
 
-  selectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectionStart");
+  selectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "selectionStart");
 
-  selectionStart_Setter_(mthis, __arg_0) => mthis["selectionStart"] = __arg_0;
+  selectionStart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "selectionStart", __arg_0);
 
-  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textLength");
+  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "textLength");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "type");
 
-  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validationMessage");
+  validationMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "validationMessage");
 
-  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "validity");
+  validity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "validity");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "value", __arg_0);
 
-  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "willValidate");
+  willValidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "willValidate");
 
-  wrap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wrap");
+  wrap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTextAreaElement */, "wrap");
 
-  wrap_Setter_(mthis, __arg_0) => mthis["wrap"] = __arg_0;
+  wrap_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTextAreaElement */, "wrap", __arg_0);
 
-  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkValidity", []);
+  checkValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "checkValidity", []);
 
-  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reportValidity", []);
+  reportValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "reportValidity", []);
 
-  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "select", []);
+  select_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "select", []);
 
-  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", []);
+  setCustomValidity_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setCustomValidity", []);
 
-  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCustomValidity", [__arg_0]);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setCustomValidity", [__arg_0]);
 
-  setRangeText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", []);
+  setRangeText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setRangeText", []);
 
-  setRangeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0]);
+  setRangeText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setRangeText", [__arg_0]);
 
-  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0, __arg_1]);
+  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setRangeText", [__arg_0, __arg_1]);
 
-  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0, __arg_1, __arg_2]);
+  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setRangeText", [__arg_0, __arg_1, __arg_2]);
 
-  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setRangeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setRangeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  setSelectionRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", []);
+  setSelectionRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setSelectionRange", []);
 
-  setSelectionRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0]);
+  setSelectionRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setSelectionRange", [__arg_0]);
 
-  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0, __arg_1]);
+  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setSelectionRange", [__arg_0, __arg_1]);
 
-  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setSelectionRange", [__arg_0, __arg_1, __arg_2]);
+  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HTMLTextAreaElement */, "setSelectionRange", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkHTMLTitleElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTitleElement();
 
-  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTitleElement */, "text");
 
-  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+  text_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTitleElement */, "text", __arg_0);
 
 }
 
 class BlinkHTMLTrackElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTrackElement();
 
-  default_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "default");
+  default_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTrackElement */, "default");
 
-  default_Setter_(mthis, __arg_0) => mthis["default"] = __arg_0;
+  default_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTrackElement */, "default", __arg_0);
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTrackElement */, "kind");
 
-  kind_Setter_(mthis, __arg_0) => mthis["kind"] = __arg_0;
+  kind_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTrackElement */, "kind", __arg_0);
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTrackElement */, "label");
 
-  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
+  label_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTrackElement */, "label", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTrackElement */, "readyState");
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTrackElement */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTrackElement */, "src", __arg_0);
 
-  srclang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "srclang");
+  srclang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTrackElement */, "srclang");
 
-  srclang_Setter_(mthis, __arg_0) => mthis["srclang"] = __arg_0;
+  srclang_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLTrackElement */, "srclang", __arg_0);
 
-  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
+  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLTrackElement */, "track");
 
 }
 
 class BlinkHTMLUListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLUListElement();
 
-  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "compact");
+  compact_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLUListElement */, "compact");
 
-  compact_Setter_(mthis, __arg_0) => mthis["compact"] = __arg_0;
+  compact_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLUListElement */, "compact", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLUListElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLUListElement */, "type", __arg_0);
 
 }
 
@@ -9538,519 +9538,519 @@
 class BlinkHTMLVideoElement extends BlinkHTMLMediaElement {
   static final instance = new BlinkHTMLVideoElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLVideoElement */, "height", __arg_0);
 
-  poster_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "poster");
+  poster_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "poster");
 
-  poster_Setter_(mthis, __arg_0) => mthis["poster"] = __arg_0;
+  poster_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLVideoElement */, "poster", __arg_0);
 
-  videoHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "videoHeight");
+  videoHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "videoHeight");
 
-  videoWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "videoWidth");
+  videoWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "videoWidth");
 
-  webkitDecodedFrameCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitDecodedFrameCount");
+  webkitDecodedFrameCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "webkitDecodedFrameCount");
 
-  webkitDisplayingFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitDisplayingFullscreen");
+  webkitDisplayingFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "webkitDisplayingFullscreen");
 
-  webkitDroppedFrameCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitDroppedFrameCount");
+  webkitDroppedFrameCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "webkitDroppedFrameCount");
 
-  webkitSupportsFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitSupportsFullscreen");
+  webkitSupportsFullscreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "webkitSupportsFullscreen");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HTMLVideoElement */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* HTMLVideoElement */, "width", __arg_0);
 
-  getVideoPlaybackQuality_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVideoPlaybackQuality", []);
+  getVideoPlaybackQuality_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLVideoElement */, "getVideoPlaybackQuality", []);
 
-  webkitEnterFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitEnterFullScreen", []);
+  webkitEnterFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLVideoElement */, "webkitEnterFullScreen", []);
 
-  webkitEnterFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitEnterFullscreen", []);
+  webkitEnterFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLVideoElement */, "webkitEnterFullscreen", []);
 
-  webkitExitFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitExitFullScreen", []);
+  webkitExitFullScreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLVideoElement */, "webkitExitFullScreen", []);
 
-  webkitExitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitExitFullscreen", []);
+  webkitExitFullscreen_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* HTMLVideoElement */, "webkitExitFullscreen", []);
 
 }
 
 class BlinkHashChangeEvent extends BlinkEvent {
   static final instance = new BlinkHashChangeEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "HashChangeEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("HashChangeEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "HashChangeEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("HashChangeEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "HashChangeEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("HashChangeEvent", [__arg_0, __arg_1]);
 
-  newURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newURL");
+  newURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HashChangeEvent */, "newURL");
 
-  oldURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oldURL");
+  oldURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* HashChangeEvent */, "oldURL");
 
-  initHashChangeEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2]);
+  initHashChangeEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* HashChangeEvent */, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2]);
 
-  initHashChangeEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  initHashChangeEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* HashChangeEvent */, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  initHashChangeEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  initHashChangeEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* HashChangeEvent */, "initHashChangeEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkHeaders {
   static final instance = new BlinkHeaders();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Headers"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Headers");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Headers"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Headers", [__arg_0]);
 
 }
 
 class BlinkHistory {
   static final instance = new BlinkHistory();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* History */, "length");
 
-  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "options");
+  options_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* History */, "options");
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* History */, "state");
 
-  back_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "back", []);
+  back_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* History */, "back", []);
 
-  forward_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forward", []);
+  forward_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* History */, "forward", []);
 
-  go_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "go", []);
+  go_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* History */, "go", []);
 
-  go_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "go", [__arg_0]);
+  go_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* History */, "go", [__arg_0]);
 
-  pushState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0]);
+  pushState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* History */, "pushState", [__arg_0]);
 
-  pushState_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0, __arg_1]);
+  pushState_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* History */, "pushState", [__arg_0, __arg_1]);
 
-  pushState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0, __arg_1, __arg_2]);
+  pushState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* History */, "pushState", [__arg_0, __arg_1, __arg_2]);
 
-  pushState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "pushState", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  pushState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* History */, "pushState", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  replaceState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", [__arg_0]);
+  replaceState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* History */, "replaceState", [__arg_0]);
 
-  replaceState_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", [__arg_0, __arg_1]);
+  replaceState_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* History */, "replaceState", [__arg_0, __arg_1]);
 
-  replaceState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", [__arg_0, __arg_1, __arg_2]);
+  replaceState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* History */, "replaceState", [__arg_0, __arg_1, __arg_2]);
 
-  replaceState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "replaceState", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  replaceState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* History */, "replaceState", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkIDBCursor {
   static final instance = new BlinkIDBCursor();
 
-  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "direction");
+  direction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBCursor */, "direction");
 
-  key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "key");
+  key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBCursor */, "key");
 
-  primaryKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "primaryKey");
+  primaryKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBCursor */, "primaryKey");
 
-  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
+  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBCursor */, "source");
 
-  advance_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "advance", []);
+  advance_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "advance", []);
 
-  advance_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "advance", [__arg_0]);
+  advance_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "advance", [__arg_0]);
 
-  continue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "continue", []);
+  continue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "continue", []);
 
-  continue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "continue", [__arg_0]);
+  continue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "continue", [__arg_0]);
 
-  continuePrimaryKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", []);
+  continuePrimaryKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "continuePrimaryKey", []);
 
-  continuePrimaryKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", [__arg_0]);
+  continuePrimaryKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "continuePrimaryKey", [__arg_0]);
 
-  continuePrimaryKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "continuePrimaryKey", [__arg_0, __arg_1]);
+  continuePrimaryKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "continuePrimaryKey", [__arg_0, __arg_1]);
 
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "delete", []);
 
-  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
+  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "update", []);
 
-  update_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "update", [__arg_0]);
+  update_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBCursor */, "update", [__arg_0]);
 
 }
 
 class BlinkIDBCursorWithValue extends BlinkIDBCursor {
   static final instance = new BlinkIDBCursorWithValue();
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBCursorWithValue */, "value");
 
 }
 
 class BlinkIDBDatabase extends BlinkEventTarget {
   static final instance = new BlinkIDBDatabase();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBDatabase */, "name");
 
-  objectStoreNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "objectStoreNames");
+  objectStoreNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBDatabase */, "objectStoreNames");
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBDatabase */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBDatabase */, "onabort", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBDatabase */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBDatabase */, "onclose", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBDatabase */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBDatabase */, "onerror", __arg_0);
 
-  onversionchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onversionchange");
+  onversionchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBDatabase */, "onversionchange");
 
-  onversionchange_Setter_(mthis, __arg_0) => mthis["onversionchange"] = __arg_0;
+  onversionchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBDatabase */, "onversionchange", __arg_0);
 
-  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBDatabase */, "version");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "close", []);
 
-  createObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", []);
+  createObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "createObjectStore", []);
 
-  createObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", [__arg_0]);
+  createObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "createObjectStore", [__arg_0]);
 
-  createObjectStore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createObjectStore", [__arg_0, __arg_1]);
+  createObjectStore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "createObjectStore", [__arg_0, __arg_1]);
 
-  deleteObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteObjectStore", []);
+  deleteObjectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "deleteObjectStore", []);
 
-  deleteObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteObjectStore", [__arg_0]);
+  deleteObjectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "deleteObjectStore", [__arg_0]);
 
-  transaction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transaction", []);
+  transaction_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "transaction", []);
 
-  transaction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0]);
+  transaction_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "transaction", [__arg_0]);
 
-  transaction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transaction", [__arg_0, __arg_1]);
+  transaction_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBDatabase */, "transaction", [__arg_0, __arg_1]);
 
 }
 
 class BlinkIDBFactory {
   static final instance = new BlinkIDBFactory();
 
-  cmp_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cmp", []);
+  cmp_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "cmp", []);
 
-  cmp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cmp", [__arg_0]);
+  cmp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "cmp", [__arg_0]);
 
-  cmp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "cmp", [__arg_0, __arg_1]);
+  cmp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "cmp", [__arg_0, __arg_1]);
 
-  deleteDatabase_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteDatabase", []);
+  deleteDatabase_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "deleteDatabase", []);
 
-  deleteDatabase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteDatabase", [__arg_0]);
+  deleteDatabase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "deleteDatabase", [__arg_0]);
 
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "open", []);
 
-  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
+  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "open", [__arg_0]);
 
-  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1]);
+  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "open", [__arg_0, __arg_1]);
 
-  webkitGetDatabaseNames_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetDatabaseNames", []);
+  webkitGetDatabaseNames_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBFactory */, "webkitGetDatabaseNames", []);
 
 }
 
 class BlinkIDBIndex {
   static final instance = new BlinkIDBIndex();
 
-  keyPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyPath");
+  keyPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBIndex */, "keyPath");
 
-  multiEntry_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "multiEntry");
+  multiEntry_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBIndex */, "multiEntry");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBIndex */, "name");
 
-  objectStore_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "objectStore");
+  objectStore_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBIndex */, "objectStore");
 
-  unique_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unique");
+  unique_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBIndex */, "unique");
 
-  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "count", []);
+  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "count", []);
 
-  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "count", [__arg_0]);
+  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "count", [__arg_0]);
 
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
+  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "get", []);
 
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
+  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "get", [__arg_0]);
 
-  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
+  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getAll", []);
 
-  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
+  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getAll", [__arg_0]);
 
-  getAll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0, __arg_1]);
+  getAll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getAll", [__arg_0, __arg_1]);
 
-  getAllKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", []);
+  getAllKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getAllKeys", []);
 
-  getAllKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0]);
+  getAllKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getAllKeys", [__arg_0]);
 
-  getAllKeys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0, __arg_1]);
+  getAllKeys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getAllKeys", [__arg_0, __arg_1]);
 
-  getKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getKey", []);
+  getKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getKey", []);
 
-  getKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getKey", [__arg_0]);
+  getKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "getKey", [__arg_0]);
 
-  openCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", []);
+  openCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "openCursor", []);
 
-  openCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", [__arg_0]);
+  openCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "openCursor", [__arg_0]);
 
-  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", [__arg_0, __arg_1]);
+  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "openCursor", [__arg_0, __arg_1]);
 
-  openKeyCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openKeyCursor", []);
+  openKeyCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "openKeyCursor", []);
 
-  openKeyCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openKeyCursor", [__arg_0]);
+  openKeyCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "openKeyCursor", [__arg_0]);
 
-  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openKeyCursor", [__arg_0, __arg_1]);
+  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBIndex */, "openKeyCursor", [__arg_0, __arg_1]);
 
 }
 
 class BlinkIDBKeyRange {
   static final instance = new BlinkIDBKeyRange();
 
-  lower_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lower");
+  lower_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBKeyRange */, "lower");
 
-  lowerOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lowerOpen");
+  lowerOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBKeyRange */, "lowerOpen");
 
-  upper_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upper");
+  upper_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBKeyRange */, "upper");
 
-  upperOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upperOpen");
+  upperOpen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBKeyRange */, "upperOpen");
 
-  bound_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "bound", []);
+  bound_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "bound", []);
 
-  bound_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "bound", [__arg_0]);
+  bound_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "bound", [__arg_0]);
 
-  bound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "bound", [__arg_0, __arg_1]);
+  bound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "bound", [__arg_0, __arg_1]);
 
-  bound_Callback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "bound", [__arg_0, __arg_1, __arg_2]);
+  bound_Callback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "bound", [__arg_0, __arg_1, __arg_2]);
 
-  bound_Callback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "bound", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  bound_Callback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "bound", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  lowerBound_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "lowerBound", []);
+  lowerBound_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "lowerBound", []);
 
-  lowerBound_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "lowerBound", [__arg_0]);
+  lowerBound_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "lowerBound", [__arg_0]);
 
-  lowerBound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "lowerBound", [__arg_0, __arg_1]);
+  lowerBound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "lowerBound", [__arg_0, __arg_1]);
 
-  only_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "only", []);
+  only_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "only", []);
 
-  only_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "only", [__arg_0]);
+  only_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "only", [__arg_0]);
 
-  upperBound_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "upperBound", []);
+  upperBound_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "upperBound", []);
 
-  upperBound_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "upperBound", [__arg_0]);
+  upperBound_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "upperBound", [__arg_0]);
 
-  upperBound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange"), "upperBound", [__arg_0, __arg_1]);
+  upperBound_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "IDBKeyRange") /* IDBKeyRange */, "upperBound", [__arg_0, __arg_1]);
 
 }
 
 class BlinkIDBObjectStore {
   static final instance = new BlinkIDBObjectStore();
 
-  autoIncrement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "autoIncrement");
+  autoIncrement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBObjectStore */, "autoIncrement");
 
-  indexNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexNames");
+  indexNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBObjectStore */, "indexNames");
 
-  keyPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyPath");
+  keyPath_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBObjectStore */, "keyPath");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBObjectStore */, "name");
 
-  transaction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transaction");
+  transaction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBObjectStore */, "transaction");
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "add", [__arg_0]);
 
-  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "add", [__arg_0, __arg_1]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "clear", []);
 
-  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "count", []);
+  count_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "count", []);
 
-  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "count", [__arg_0]);
+  count_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "count", [__arg_0]);
 
-  createIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createIndex", []);
+  createIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "createIndex", []);
 
-  createIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createIndex", [__arg_0]);
+  createIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "createIndex", [__arg_0]);
 
-  createIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createIndex", [__arg_0, __arg_1]);
+  createIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "createIndex", [__arg_0, __arg_1]);
 
-  createIndex_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createIndex", [__arg_0, __arg_1, __arg_2]);
+  createIndex_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "createIndex", [__arg_0, __arg_1, __arg_2]);
 
-  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "delete", []);
+  delete_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "delete", []);
 
-  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "delete", [__arg_0]);
+  delete_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "delete", [__arg_0]);
 
-  deleteIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteIndex", []);
+  deleteIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "deleteIndex", []);
 
-  deleteIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteIndex", [__arg_0]);
+  deleteIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "deleteIndex", [__arg_0]);
 
-  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "get", []);
+  get_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "get", []);
 
-  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "get", [__arg_0]);
+  get_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "get", [__arg_0]);
 
-  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAll", []);
+  getAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "getAll", []);
 
-  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0]);
+  getAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "getAll", [__arg_0]);
 
-  getAll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAll", [__arg_0, __arg_1]);
+  getAll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "getAll", [__arg_0, __arg_1]);
 
-  getAllKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", []);
+  getAllKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "getAllKeys", []);
 
-  getAllKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0]);
+  getAllKeys_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "getAllKeys", [__arg_0]);
 
-  getAllKeys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAllKeys", [__arg_0, __arg_1]);
+  getAllKeys_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "getAllKeys", [__arg_0, __arg_1]);
 
-  index_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "index", []);
+  index_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "index", []);
 
-  index_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "index", [__arg_0]);
+  index_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "index", [__arg_0]);
 
-  openCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", []);
+  openCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "openCursor", []);
 
-  openCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", [__arg_0]);
+  openCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "openCursor", [__arg_0]);
 
-  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openCursor", [__arg_0, __arg_1]);
+  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "openCursor", [__arg_0, __arg_1]);
 
-  openKeyCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "openKeyCursor", []);
+  openKeyCursor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "openKeyCursor", []);
 
-  openKeyCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "openKeyCursor", [__arg_0]);
+  openKeyCursor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "openKeyCursor", [__arg_0]);
 
-  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openKeyCursor", [__arg_0, __arg_1]);
+  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "openKeyCursor", [__arg_0, __arg_1]);
 
-  put_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "put", []);
+  put_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "put", []);
 
-  put_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "put", [__arg_0]);
+  put_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "put", [__arg_0]);
 
-  put_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "put", [__arg_0, __arg_1]);
+  put_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* IDBObjectStore */, "put", [__arg_0, __arg_1]);
 
 }
 
 class BlinkIDBOpenDBRequest extends BlinkIDBRequest {
   static final instance = new BlinkIDBOpenDBRequest();
 
-  onblocked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblocked");
+  onblocked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBOpenDBRequest */, "onblocked");
 
-  onblocked_Setter_(mthis, __arg_0) => mthis["onblocked"] = __arg_0;
+  onblocked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBOpenDBRequest */, "onblocked", __arg_0);
 
-  onupgradeneeded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onupgradeneeded");
+  onupgradeneeded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBOpenDBRequest */, "onupgradeneeded");
 
-  onupgradeneeded_Setter_(mthis, __arg_0) => mthis["onupgradeneeded"] = __arg_0;
+  onupgradeneeded_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBOpenDBRequest */, "onupgradeneeded", __arg_0);
 
 }
 
 class BlinkIDBRequest extends BlinkEventTarget {
   static final instance = new BlinkIDBRequest();
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBRequest */, "error");
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBRequest */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBRequest */, "onerror", __arg_0);
 
-  onsuccess_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuccess");
+  onsuccess_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBRequest */, "onsuccess");
 
-  onsuccess_Setter_(mthis, __arg_0) => mthis["onsuccess"] = __arg_0;
+  onsuccess_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBRequest */, "onsuccess", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBRequest */, "readyState");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBRequest */, "result");
 
-  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
+  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBRequest */, "source");
 
-  transaction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transaction");
+  transaction_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBRequest */, "transaction");
 
 }
 
 class BlinkIDBTransaction extends BlinkEventTarget {
   static final instance = new BlinkIDBTransaction();
 
-  db_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "db");
+  db_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBTransaction */, "db");
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBTransaction */, "error");
 
-  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
+  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBTransaction */, "mode");
 
-  objectStoreNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "objectStoreNames");
+  objectStoreNames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBTransaction */, "objectStoreNames");
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBTransaction */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBTransaction */, "onabort", __arg_0);
 
-  oncomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncomplete");
+  oncomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBTransaction */, "oncomplete");
 
-  oncomplete_Setter_(mthis, __arg_0) => mthis["oncomplete"] = __arg_0;
+  oncomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBTransaction */, "oncomplete", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBTransaction */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* IDBTransaction */, "onerror", __arg_0);
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBTransaction */, "abort", []);
 
-  objectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "objectStore", []);
+  objectStore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* IDBTransaction */, "objectStore", []);
 
-  objectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "objectStore", [__arg_0]);
+  objectStore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* IDBTransaction */, "objectStore", [__arg_0]);
 
 }
 
 class BlinkIDBVersionChangeEvent extends BlinkEvent {
   static final instance = new BlinkIDBVersionChangeEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "IDBVersionChangeEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("IDBVersionChangeEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "IDBVersionChangeEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("IDBVersionChangeEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "IDBVersionChangeEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("IDBVersionChangeEvent", [__arg_0, __arg_1]);
 
-  dataLoss_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataLoss");
+  dataLoss_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBVersionChangeEvent */, "dataLoss");
 
-  dataLossMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataLossMessage");
+  dataLossMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBVersionChangeEvent */, "dataLossMessage");
 
-  newVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newVersion");
+  newVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBVersionChangeEvent */, "newVersion");
 
-  oldVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oldVersion");
+  oldVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* IDBVersionChangeEvent */, "oldVersion");
 
 }
 
 class BlinkImageBitmap {
   static final instance = new BlinkImageBitmap();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ImageBitmap */, "height");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ImageBitmap */, "width");
 
 }
 
 class BlinkImageData {
   static final instance = new BlinkImageData();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ImageData"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ImageData");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ImageData"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ImageData", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ImageData"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ImageData", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ImageData"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("ImageData", [__arg_0, __arg_1, __arg_2]);
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ImageData */, "data");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ImageData */, "height");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ImageData */, "width");
 
 }
 
 class BlinkInjectedScriptHost {
   static final instance = new BlinkInjectedScriptHost();
 
-  inspect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "inspect", []);
+  inspect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* InjectedScriptHost */, "inspect", []);
 
-  inspect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "inspect", [__arg_0]);
+  inspect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* InjectedScriptHost */, "inspect", [__arg_0]);
 
-  inspect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "inspect", [__arg_0, __arg_1]);
+  inspect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* InjectedScriptHost */, "inspect", [__arg_0, __arg_1]);
 
 }
 
 class BlinkInputDevice {
   static final instance = new BlinkInputDevice();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "InputDevice"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("InputDevice");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "InputDevice"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("InputDevice", [__arg_0]);
 
-  firesTouchEvents_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firesTouchEvents");
+  firesTouchEvents_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* InputDevice */, "firesTouchEvents");
 
 }
 
@@ -10072,1416 +10072,1416 @@
 class BlinkIterator {
   static final instance = new BlinkIterator();
 
-  next_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "next", []);
+  next_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Iterator */, "next", []);
 
-  next_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "next", [__arg_0]);
+  next_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Iterator */, "next", [__arg_0]);
 
 }
 
 class BlinkKeyboardEvent extends BlinkUIEvent {
   static final instance = new BlinkKeyboardEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyboardEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("KeyboardEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyboardEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("KeyboardEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyboardEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("KeyboardEvent", [__arg_0, __arg_1]);
 
-  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altKey");
+  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "altKey");
 
-  charCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charCode");
+  charCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "charCode");
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "code");
 
-  ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ctrlKey");
+  ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "ctrlKey");
 
-  key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "key");
+  key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "key");
 
-  keyCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyCode");
+  keyCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "keyCode");
 
-  keyIdentifier_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyIdentifier");
+  keyIdentifier_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "keyIdentifier");
 
-  keyLocation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyLocation");
+  keyLocation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "keyLocation");
 
-  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
+  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "location");
 
-  metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "metaKey");
+  metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "metaKey");
 
-  repeat_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "repeat");
+  repeat_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "repeat");
 
-  shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shiftKey");
+  shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "shiftKey");
 
-  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "which");
+  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* KeyboardEvent */, "which");
 
-  getModifierState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getModifierState", []);
+  getModifierState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* KeyboardEvent */, "getModifierState", []);
 
-  getModifierState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getModifierState", [__arg_0]);
+  getModifierState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* KeyboardEvent */, "getModifierState", [__arg_0]);
 
-  initKeyboardEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  initKeyboardEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* KeyboardEvent */, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  initKeyboardEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  initKeyboardEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* KeyboardEvent */, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  initKeyboardEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  initKeyboardEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* KeyboardEvent */, "initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
 }
 
 class BlinkKeyframeEffect extends BlinkAnimationEffectReadOnly {
   static final instance = new BlinkKeyframeEffect();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("KeyframeEffect");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("KeyframeEffect", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("KeyframeEffect", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "KeyframeEffect"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("KeyframeEffect", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkLocation {
   static final instance = new BlinkLocation();
 
-  ancestorOrigins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ancestorOrigins");
+  ancestorOrigins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "ancestorOrigins");
 
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "hash");
 
-  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+  hash_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Location */, "hash", __arg_0);
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "host");
 
-  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+  host_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Location */, "host", __arg_0);
 
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "hostname");
 
-  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+  hostname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Location */, "hostname", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) native "Blink_Getter_Location_href";
 
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+  href_Setter_(mthis, __arg_0) native "Blink_Setter_Location_href";
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "origin");
 
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "pathname");
 
-  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+  pathname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Location */, "pathname", __arg_0);
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "port");
 
-  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+  port_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Location */, "port", __arg_0);
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "protocol");
 
-  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+  protocol_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Location */, "protocol", __arg_0);
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Location */, "search");
 
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+  search_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Location */, "search", __arg_0);
 
-  assign_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "assign", []);
+  assign_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Location */, "assign", []);
 
-  assign_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "assign", [__arg_0]);
+  assign_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Location */, "assign", [__arg_0]);
 
-  reload_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reload", []);
+  reload_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Location */, "reload", []);
 
-  replace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replace", []);
+  replace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Location */, "replace", []);
 
-  replace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replace", [__arg_0]);
+  replace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Location */, "replace", [__arg_0]);
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Location */, "toString", []);
 
-  valueOf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "valueOf", []);
+  valueOf_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Location */, "valueOf", []);
 
 }
 
 class BlinkMIDIAccess extends BlinkEventTarget {
   static final instance = new BlinkMIDIAccess();
 
-  inputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inputs");
+  inputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIAccess */, "inputs");
 
-  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIAccess */, "onstatechange");
 
-  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+  onstatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MIDIAccess */, "onstatechange", __arg_0);
 
-  outputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outputs");
+  outputs_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIAccess */, "outputs");
 
-  sysexEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sysexEnabled");
+  sysexEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIAccess */, "sysexEnabled");
 
 }
 
 class BlinkMIDIConnectionEvent extends BlinkEvent {
   static final instance = new BlinkMIDIConnectionEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIConnectionEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MIDIConnectionEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIConnectionEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MIDIConnectionEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIConnectionEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MIDIConnectionEvent", [__arg_0, __arg_1]);
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIConnectionEvent */, "port");
 
 }
 
 class BlinkMIDIInput extends BlinkMIDIPort {
   static final instance = new BlinkMIDIInput();
 
-  onmidimessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmidimessage");
+  onmidimessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIInput */, "onmidimessage");
 
-  onmidimessage_Setter_(mthis, __arg_0) => mthis["onmidimessage"] = __arg_0;
+  onmidimessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MIDIInput */, "onmidimessage", __arg_0);
 
 }
 
 class BlinkMIDIInputMap {
   static final instance = new BlinkMIDIInputMap();
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIInputMap */, "size");
 
 }
 
 class BlinkMIDIMessageEvent extends BlinkEvent {
   static final instance = new BlinkMIDIMessageEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIMessageEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MIDIMessageEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIMessageEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MIDIMessageEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MIDIMessageEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MIDIMessageEvent", [__arg_0, __arg_1]);
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIMessageEvent */, "data");
 
-  receivedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "receivedTime");
+  receivedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIMessageEvent */, "receivedTime");
 
 }
 
 class BlinkMIDIOutput extends BlinkMIDIPort {
   static final instance = new BlinkMIDIOutput();
 
-  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
+  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MIDIOutput */, "send", []);
 
-  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
+  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MIDIOutput */, "send", [__arg_0]);
 
-  send_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0, __arg_1]);
+  send_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* MIDIOutput */, "send", [__arg_0, __arg_1]);
 
 }
 
 class BlinkMIDIOutputMap {
   static final instance = new BlinkMIDIOutputMap();
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIOutputMap */, "size");
 
 }
 
 class BlinkMIDIPort extends BlinkEventTarget {
   static final instance = new BlinkMIDIPort();
 
-  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connection");
+  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "connection");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "id");
 
-  manufacturer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "manufacturer");
+  manufacturer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "manufacturer");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "name");
 
-  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "onstatechange");
 
-  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+  onstatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MIDIPort */, "onstatechange", __arg_0);
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "state");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "type");
 
-  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "version");
+  version_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MIDIPort */, "version");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MIDIPort */, "close", []);
 
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MIDIPort */, "open", []);
 
 }
 
 class BlinkMediaController extends BlinkEventTarget {
   static final instance = new BlinkMediaController();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaController"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaController");
 
-  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffered");
+  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "buffered");
 
-  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTime");
+  currentTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "currentTime");
 
-  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
+  currentTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaController */, "currentTime", __arg_0);
 
-  defaultPlaybackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultPlaybackRate");
+  defaultPlaybackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "defaultPlaybackRate");
 
-  defaultPlaybackRate_Setter_(mthis, __arg_0) => mthis["defaultPlaybackRate"] = __arg_0;
+  defaultPlaybackRate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaController */, "defaultPlaybackRate", __arg_0);
 
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "duration");
 
-  muted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "muted");
+  muted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "muted");
 
-  muted_Setter_(mthis, __arg_0) => mthis["muted"] = __arg_0;
+  muted_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaController */, "muted", __arg_0);
 
-  paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paused");
+  paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "paused");
 
-  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackRate");
+  playbackRate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "playbackRate");
 
-  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
+  playbackRate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaController */, "playbackRate", __arg_0);
 
-  playbackState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "playbackState");
+  playbackState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "playbackState");
 
-  played_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "played");
+  played_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "played");
 
-  seekable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "seekable");
+  seekable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "seekable");
 
-  volume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "volume");
+  volume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaController */, "volume");
 
-  volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
+  volume_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaController */, "volume", __arg_0);
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaController */, "pause", []);
 
-  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "play", []);
+  play_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaController */, "play", []);
 
-  unpause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unpause", []);
+  unpause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaController */, "unpause", []);
 
 }
 
 class BlinkMediaDeviceInfo {
   static final instance = new BlinkMediaDeviceInfo();
 
-  deviceId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deviceId");
+  deviceId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaDeviceInfo */, "deviceId");
 
-  groupId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "groupId");
+  groupId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaDeviceInfo */, "groupId");
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaDeviceInfo */, "kind");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaDeviceInfo */, "label");
 
 }
 
 class BlinkMediaDevices {
   static final instance = new BlinkMediaDevices();
 
-  enumerateDevices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enumerateDevices", []);
+  enumerateDevices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaDevices */, "enumerateDevices", []);
 
-  getUserMedia_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUserMedia", []);
+  getUserMedia_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaDevices */, "getUserMedia", []);
 
-  getUserMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUserMedia", [__arg_0]);
+  getUserMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaDevices */, "getUserMedia", [__arg_0]);
 
 }
 
 class BlinkMediaElementAudioSourceNode extends BlinkAudioSourceNode {
   static final instance = new BlinkMediaElementAudioSourceNode();
 
-  mediaElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaElement");
+  mediaElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaElementAudioSourceNode */, "mediaElement");
 
 }
 
 class BlinkMediaEncryptedEvent extends BlinkEvent {
   static final instance = new BlinkMediaEncryptedEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaEncryptedEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaEncryptedEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaEncryptedEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MediaEncryptedEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaEncryptedEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MediaEncryptedEvent", [__arg_0, __arg_1]);
 
-  initData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "initData");
+  initData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaEncryptedEvent */, "initData");
 
-  initDataType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "initDataType");
+  initDataType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaEncryptedEvent */, "initDataType");
 
 }
 
 class BlinkMediaError {
   static final instance = new BlinkMediaError();
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaError */, "code");
 
 }
 
 class BlinkMediaKeyError {
   static final instance = new BlinkMediaKeyError();
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyError */, "code");
 
-  systemCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemCode");
+  systemCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyError */, "systemCode");
 
 }
 
 class BlinkMediaKeyEvent extends BlinkEvent {
   static final instance = new BlinkMediaKeyEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaKeyEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MediaKeyEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MediaKeyEvent", [__arg_0, __arg_1]);
 
-  defaultURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultURL");
+  defaultURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyEvent */, "defaultURL");
 
-  errorCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "errorCode");
+  errorCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyEvent */, "errorCode");
 
-  initData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "initData");
+  initData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyEvent */, "initData");
 
-  keySystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keySystem");
+  keySystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyEvent */, "keySystem");
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyEvent */, "message");
 
-  sessionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sessionId");
+  sessionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyEvent */, "sessionId");
 
-  systemCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemCode");
+  systemCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyEvent */, "systemCode");
 
 }
 
 class BlinkMediaKeyMessageEvent extends BlinkEvent {
   static final instance = new BlinkMediaKeyMessageEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyMessageEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaKeyMessageEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyMessageEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MediaKeyMessageEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaKeyMessageEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MediaKeyMessageEvent", [__arg_0, __arg_1]);
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyMessageEvent */, "message");
 
-  messageType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "messageType");
+  messageType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyMessageEvent */, "messageType");
 
 }
 
 class BlinkMediaKeySession extends BlinkEventTarget {
   static final instance = new BlinkMediaKeySession();
 
-  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
+  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeySession */, "closed");
 
-  expiration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "expiration");
+  expiration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeySession */, "expiration");
 
-  keyStatuses_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyStatuses");
+  keyStatuses_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeySession */, "keyStatuses");
 
-  sessionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sessionId");
+  sessionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeySession */, "sessionId");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "close", []);
 
-  generateRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateRequest", []);
+  generateRequest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "generateRequest", []);
 
-  generateRequest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateRequest", [__arg_0]);
+  generateRequest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "generateRequest", [__arg_0]);
 
-  generateRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "generateRequest", [__arg_0, __arg_1]);
+  generateRequest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "generateRequest", [__arg_0, __arg_1]);
 
-  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "load", []);
+  load_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "load", []);
 
-  load_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "load", [__arg_0]);
+  load_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "load", [__arg_0]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "remove", []);
 
-  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
+  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "update", []);
 
-  update_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "update", [__arg_0]);
+  update_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySession */, "update", [__arg_0]);
 
 }
 
 class BlinkMediaKeyStatusMap {
   static final instance = new BlinkMediaKeyStatusMap();
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeyStatusMap */, "size");
 
 }
 
 class BlinkMediaKeySystemAccess {
   static final instance = new BlinkMediaKeySystemAccess();
 
-  keySystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keySystem");
+  keySystem_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaKeySystemAccess */, "keySystem");
 
-  createMediaKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createMediaKeys", []);
+  createMediaKeys_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySystemAccess */, "createMediaKeys", []);
 
-  getConfiguration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getConfiguration", []);
+  getConfiguration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeySystemAccess */, "getConfiguration", []);
 
 }
 
 class BlinkMediaKeys {
   static final instance = new BlinkMediaKeys();
 
-  createSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSession", []);
+  createSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeys */, "createSession", []);
 
-  createSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSession", [__arg_0]);
+  createSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeys */, "createSession", [__arg_0]);
 
-  setServerCertificate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setServerCertificate", []);
+  setServerCertificate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeys */, "setServerCertificate", []);
 
-  setServerCertificate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setServerCertificate", [__arg_0]);
+  setServerCertificate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaKeys */, "setServerCertificate", [__arg_0]);
 
 }
 
 class BlinkMediaList {
   static final instance = new BlinkMediaList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaList */, "length");
 
-  mediaText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaText");
+  mediaText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaList */, "mediaText");
 
-  mediaText_Setter_(mthis, __arg_0) => mthis["mediaText"] = __arg_0;
+  mediaText_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaList */, "mediaText", __arg_0);
 
-  appendMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendMedium", []);
+  appendMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaList */, "appendMedium", []);
 
-  appendMedium_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendMedium", [__arg_0]);
+  appendMedium_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaList */, "appendMedium", [__arg_0]);
 
-  deleteMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteMedium", []);
+  deleteMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaList */, "deleteMedium", []);
 
-  deleteMedium_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteMedium", [__arg_0]);
+  deleteMedium_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaList */, "deleteMedium", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaList */, "item", [__arg_0]);
 
 }
 
 class BlinkMediaQueryList extends BlinkEventTarget {
   static final instance = new BlinkMediaQueryList();
 
-  matches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "matches");
+  matches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaQueryList */, "matches");
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaQueryList */, "media");
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaQueryList */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaQueryList */, "onchange", __arg_0);
 
-  addListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addListener", []);
+  addListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaQueryList */, "addListener", []);
 
-  addListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addListener", [__arg_0]);
+  addListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaQueryList */, "addListener", [__arg_0]);
 
-  removeListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeListener", []);
+  removeListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaQueryList */, "removeListener", []);
 
-  removeListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeListener", [__arg_0]);
+  removeListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaQueryList */, "removeListener", [__arg_0]);
 
 }
 
 class BlinkMediaQueryListEvent extends BlinkEvent {
   static final instance = new BlinkMediaQueryListEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaQueryListEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaQueryListEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaQueryListEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MediaQueryListEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaQueryListEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MediaQueryListEvent", [__arg_0, __arg_1]);
 
-  matches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "matches");
+  matches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaQueryListEvent */, "matches");
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaQueryListEvent */, "media");
 
 }
 
 class BlinkMediaSession {
   static final instance = new BlinkMediaSession();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaSession"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaSession");
 
-  activate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activate", []);
+  activate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaSession */, "activate", []);
 
-  deactivate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deactivate", []);
+  deactivate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaSession */, "deactivate", []);
 
 }
 
 class BlinkMediaSource extends BlinkEventTarget {
   static final instance = new BlinkMediaSource();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaSource"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaSource");
 
-  activeSourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeSourceBuffers");
+  activeSourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaSource */, "activeSourceBuffers");
 
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaSource */, "duration");
 
-  duration_Setter_(mthis, __arg_0) => mthis["duration"] = __arg_0;
+  duration_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaSource */, "duration", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaSource */, "readyState");
 
-  sourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceBuffers");
+  sourceBuffers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaSource */, "sourceBuffers");
 
-  addSourceBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addSourceBuffer", []);
+  addSourceBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaSource */, "addSourceBuffer", []);
 
-  addSourceBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addSourceBuffer", [__arg_0]);
+  addSourceBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaSource */, "addSourceBuffer", [__arg_0]);
 
-  endOfStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endOfStream", []);
+  endOfStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaSource */, "endOfStream", []);
 
-  endOfStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endOfStream", [__arg_0]);
+  endOfStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaSource */, "endOfStream", [__arg_0]);
 
-  isTypeSupported_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaSource"), "isTypeSupported", []);
+  isTypeSupported_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaSource") /* MediaSource */, "isTypeSupported", []);
 
-  isTypeSupported_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaSource"), "isTypeSupported", [__arg_0]);
+  isTypeSupported_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaSource") /* MediaSource */, "isTypeSupported", [__arg_0]);
 
-  removeSourceBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeSourceBuffer", []);
+  removeSourceBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaSource */, "removeSourceBuffer", []);
 
-  removeSourceBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeSourceBuffer", [__arg_0]);
+  removeSourceBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaSource */, "removeSourceBuffer", [__arg_0]);
 
 }
 
 class BlinkMediaStream extends BlinkEventTarget {
   static final instance = new BlinkMediaStream();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStream"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaStream");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStream"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MediaStream", [__arg_0]);
 
-  active_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "active");
+  active_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "active");
 
-  ended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ended");
+  ended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "ended");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "id");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "label");
 
-  onactive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onactive");
+  onactive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "onactive");
 
-  onactive_Setter_(mthis, __arg_0) => mthis["onactive"] = __arg_0;
+  onactive_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStream */, "onactive", __arg_0);
 
-  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
+  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "onaddtrack");
 
-  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
+  onaddtrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStream */, "onaddtrack", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStream */, "onended", __arg_0);
 
-  oninactive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninactive");
+  oninactive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "oninactive");
 
-  oninactive_Setter_(mthis, __arg_0) => mthis["oninactive"] = __arg_0;
+  oninactive_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStream */, "oninactive", __arg_0);
 
-  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovetrack");
+  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStream */, "onremovetrack");
 
-  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
+  onremovetrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStream */, "onremovetrack", __arg_0);
 
-  addTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addTrack", []);
+  addTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "addTrack", []);
 
-  addTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addTrack", [__arg_0]);
+  addTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "addTrack", [__arg_0]);
 
-  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
+  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "clone", []);
 
-  getAudioTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAudioTracks", []);
+  getAudioTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "getAudioTracks", []);
 
-  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
+  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "getTrackById", []);
 
-  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
+  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "getTrackById", [__arg_0]);
 
-  getTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTracks", []);
+  getTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "getTracks", []);
 
-  getVideoTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVideoTracks", []);
+  getVideoTracks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "getVideoTracks", []);
 
-  removeTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeTrack", []);
+  removeTrack_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "removeTrack", []);
 
-  removeTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeTrack", [__arg_0]);
+  removeTrack_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "removeTrack", [__arg_0]);
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStream */, "stop", []);
 
 }
 
 class BlinkMediaStreamAudioDestinationNode extends BlinkAudioNode {
   static final instance = new BlinkMediaStreamAudioDestinationNode();
 
-  stream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stream");
+  stream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamAudioDestinationNode */, "stream");
 
 }
 
 class BlinkMediaStreamAudioSourceNode extends BlinkAudioSourceNode {
   static final instance = new BlinkMediaStreamAudioSourceNode();
 
-  mediaStream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaStream");
+  mediaStream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamAudioSourceNode */, "mediaStream");
 
 }
 
 class BlinkMediaStreamEvent extends BlinkEvent {
   static final instance = new BlinkMediaStreamEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MediaStreamEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MediaStreamEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MediaStreamEvent", [__arg_0, __arg_1]);
 
-  stream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stream");
+  stream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamEvent */, "stream");
 
 }
 
 class BlinkMediaStreamTrack extends BlinkEventTarget {
   static final instance = new BlinkMediaStreamTrack();
 
-  enabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "enabled");
+  enabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "enabled");
 
-  enabled_Setter_(mthis, __arg_0) => mthis["enabled"] = __arg_0;
+  enabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStreamTrack */, "enabled", __arg_0);
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "id");
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "kind");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "label");
 
-  muted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "muted");
+  muted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "muted");
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStreamTrack */, "onended", __arg_0);
 
-  onmute_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmute");
+  onmute_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "onmute");
 
-  onmute_Setter_(mthis, __arg_0) => mthis["onmute"] = __arg_0;
+  onmute_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStreamTrack */, "onmute", __arg_0);
 
-  onunmute_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunmute");
+  onunmute_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "onunmute");
 
-  onunmute_Setter_(mthis, __arg_0) => mthis["onunmute"] = __arg_0;
+  onunmute_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MediaStreamTrack */, "onunmute", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrack */, "readyState");
 
-  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
+  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStreamTrack */, "clone", []);
 
-  getSources_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack"), "getSources", []);
+  getSources_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack") /* MediaStreamTrack */, "getSources", []);
 
-  getSources_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack"), "getSources", [__arg_0]);
+  getSources_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "MediaStreamTrack") /* MediaStreamTrack */, "getSources", [__arg_0]);
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStreamTrack */, "stop", []);
 
 }
 
 class BlinkMediaStreamTrackEvent extends BlinkEvent {
   static final instance = new BlinkMediaStreamTrackEvent();
 
-  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
+  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MediaStreamTrackEvent */, "track");
 
 }
 
 class BlinkMediaStreamTrackSourcesCallback {
   static final instance = new BlinkMediaStreamTrackSourcesCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MediaStreamTrackSourcesCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MediaStreamTrackSourcesCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkMemoryInfo {
   static final instance = new BlinkMemoryInfo();
 
-  jsHeapSizeLimit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "jsHeapSizeLimit");
+  jsHeapSizeLimit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MemoryInfo */, "jsHeapSizeLimit");
 
-  totalJSHeapSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "totalJSHeapSize");
+  totalJSHeapSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MemoryInfo */, "totalJSHeapSize");
 
-  usedJSHeapSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "usedJSHeapSize");
+  usedJSHeapSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MemoryInfo */, "usedJSHeapSize");
 
 }
 
 class BlinkMessageChannel {
   static final instance = new BlinkMessageChannel();
 
-  port1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port1");
+  port1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessageChannel */, "port1");
 
-  port2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port2");
+  port2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessageChannel */, "port2");
 
 }
 
 class BlinkMessageEvent extends BlinkEvent {
   static final instance = new BlinkMessageEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MessageEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MessageEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MessageEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MessageEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MessageEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MessageEvent", [__arg_0, __arg_1]);
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessageEvent */, "data");
 
-  lastEventId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastEventId");
+  lastEventId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessageEvent */, "lastEventId");
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessageEvent */, "origin");
 
-  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ports");
+  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessageEvent */, "ports");
 
-  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
+  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessageEvent */, "source");
 
-  initMessageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  initMessageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* MessageEvent */, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  initMessageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  initMessageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* MessageEvent */, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  initMessageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  initMessageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* MessageEvent */, "initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
 }
 
 class BlinkMessagePort extends BlinkEventTarget {
   static final instance = new BlinkMessagePort();
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MessagePort */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* MessagePort */, "onmessage", __arg_0);
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MessagePort */, "close", []);
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MessagePort */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MessagePort */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* MessagePort */, "postMessage", [__arg_0, __arg_1]);
 
-  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
+  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MessagePort */, "start", []);
 
 }
 
 class BlinkMetadata {
   static final instance = new BlinkMetadata();
 
-  modificationTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "modificationTime");
+  modificationTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Metadata */, "modificationTime");
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Metadata */, "size");
 
 }
 
 class BlinkMetadataCallback {
   static final instance = new BlinkMetadataCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MetadataCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MetadataCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkMimeType {
   static final instance = new BlinkMimeType();
 
-  description_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "description");
+  description_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MimeType */, "description");
 
-  enabledPlugin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "enabledPlugin");
+  enabledPlugin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MimeType */, "enabledPlugin");
 
-  suffixes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "suffixes");
+  suffixes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MimeType */, "suffixes");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MimeType */, "type");
 
 }
 
 class BlinkMimeTypeArray {
   static final instance = new BlinkMimeTypeArray();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MimeTypeArray */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MimeTypeArray */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MimeTypeArray */, "item", [__arg_0]);
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MimeTypeArray */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MimeTypeArray */, "namedItem", [__arg_0]);
 
 }
 
 class BlinkMouseEvent extends BlinkUIEvent {
   static final instance = new BlinkMouseEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MouseEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MouseEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MouseEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MouseEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MouseEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("MouseEvent", [__arg_0, __arg_1]);
 
-  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altKey");
+  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "altKey");
 
-  button_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "button");
+  button_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "button");
 
-  buttons_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buttons");
+  buttons_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "buttons");
 
-  clientX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientX");
+  clientX_Getter_(mthis) native "Blink_Getter_MouseEvent_clientX";
 
-  clientY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientY");
+  clientY_Getter_(mthis) native "Blink_Getter_MouseEvent_clientY";
 
-  ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ctrlKey");
+  ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "ctrlKey");
 
-  dataTransfer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dataTransfer");
+  dataTransfer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "dataTransfer");
 
-  fromElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fromElement");
+  fromElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "fromElement");
 
-  layerX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "layerX");
+  layerX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "layerX");
 
-  layerY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "layerY");
+  layerY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "layerY");
 
-  metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "metaKey");
+  metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "metaKey");
 
-  movementX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "movementX");
+  movementX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "movementX");
 
-  movementY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "movementY");
+  movementY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "movementY");
 
-  offsetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetX");
+  offsetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "offsetX");
 
-  offsetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offsetY");
+  offsetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "offsetY");
 
-  pageX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageX");
+  pageX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "pageX");
 
-  pageY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageY");
+  pageY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "pageY");
 
-  region_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "region");
+  region_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "region");
 
-  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedTarget");
+  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "relatedTarget");
 
-  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenX");
+  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "screenX");
 
-  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenY");
+  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "screenY");
 
-  shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shiftKey");
+  shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "shiftKey");
 
-  toElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "toElement");
+  toElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "toElement");
 
-  webkitMovementX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitMovementX");
+  webkitMovementX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "webkitMovementX");
 
-  webkitMovementY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitMovementY");
+  webkitMovementY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "webkitMovementY");
 
-  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "which");
+  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "which");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MouseEvent */, "y");
 
-  initMouseEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
+  initMouseEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis /* MouseEvent */, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
 
-  initMouseEvent_Callback_14_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13]);
+  initMouseEvent_Callback_14_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) => Blink_JsNative_DomException.callMethod(mthis /* MouseEvent */, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13]);
 
-  initMouseEvent_Callback_15_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) => Blink_JsNative_DomException.callMethod(mthis, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14]);
+  initMouseEvent_Callback_15_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) => Blink_JsNative_DomException.callMethod(mthis /* MouseEvent */, "initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14]);
 
 }
 
 class BlinkMutationCallback {
   static final instance = new BlinkMutationCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MutationCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MutationCallback */, "handleEvent", [__arg_0]);
 
-  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* MutationCallback */, "handleEvent", [__arg_0, __arg_1]);
 
 }
 
 class BlinkMutationEvent extends BlinkEvent {
   static final instance = new BlinkMutationEvent();
 
-  attrChange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attrChange");
+  attrChange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationEvent */, "attrChange");
 
-  attrName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attrName");
+  attrName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationEvent */, "attrName");
 
-  newValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newValue");
+  newValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationEvent */, "newValue");
 
-  prevValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "prevValue");
+  prevValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationEvent */, "prevValue");
 
-  relatedNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedNode");
+  relatedNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationEvent */, "relatedNode");
 
-  initMutationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  initMutationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* MutationEvent */, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  initMutationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  initMutationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* MutationEvent */, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  initMutationEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  initMutationEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* MutationEvent */, "initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
 }
 
 class BlinkMutationObserver {
   static final instance = new BlinkMutationObserver();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MutationObserver"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("MutationObserver");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "MutationObserver"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("MutationObserver", [__arg_0]);
 
-  disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disconnect", []);
+  disconnect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MutationObserver */, "disconnect", []);
 
-  observe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "observe", []);
+  observe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MutationObserver */, "observe", []);
 
-  observe_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "observe", [__arg_0]);
+  observe_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* MutationObserver */, "observe", [__arg_0]);
 
-  observe_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "observe", [__arg_0, __arg_1]);
+  observe_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* MutationObserver */, "observe", [__arg_0, __arg_1]);
 
-  takeRecords_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "takeRecords", []);
+  takeRecords_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* MutationObserver */, "takeRecords", []);
 
 }
 
 class BlinkMutationRecord {
   static final instance = new BlinkMutationRecord();
 
-  addedNodes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "addedNodes");
+  addedNodes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "addedNodes");
 
-  attributeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attributeName");
+  attributeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "attributeName");
 
-  attributeNamespace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "attributeNamespace");
+  attributeNamespace_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "attributeNamespace");
 
-  nextSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextSibling");
+  nextSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "nextSibling");
 
-  oldValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oldValue");
+  oldValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "oldValue");
 
-  previousSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousSibling");
+  previousSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "previousSibling");
 
-  removedNodes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "removedNodes");
+  removedNodes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "removedNodes");
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "target");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* MutationRecord */, "type");
 
 }
 
 class BlinkNamedNodeMap {
   static final instance = new BlinkNamedNodeMap();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NamedNodeMap */, "length");
 
-  getNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItem", []);
+  getNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "getNamedItem", []);
 
-  getNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItem", [__arg_0]);
+  getNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "getNamedItem", [__arg_0]);
 
-  getNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItemNS", []);
+  getNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "getNamedItemNS", []);
 
-  getNamedItemNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItemNS", [__arg_0]);
+  getNamedItemNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "getNamedItemNS", [__arg_0]);
 
-  getNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getNamedItemNS", [__arg_0, __arg_1]);
+  getNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "getNamedItemNS", [__arg_0, __arg_1]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "item", [__arg_0]);
 
-  removeNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItem", []);
+  removeNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "removeNamedItem", []);
 
-  removeNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItem", [__arg_0]);
+  removeNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "removeNamedItem", [__arg_0]);
 
-  removeNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItemNS", []);
+  removeNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "removeNamedItemNS", []);
 
-  removeNamedItemNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItemNS", [__arg_0]);
+  removeNamedItemNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "removeNamedItemNS", [__arg_0]);
 
-  removeNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeNamedItemNS", [__arg_0, __arg_1]);
+  removeNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "removeNamedItemNS", [__arg_0, __arg_1]);
 
-  setNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItem", []);
+  setNamedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "setNamedItem", []);
 
-  setNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItem", [__arg_0]);
+  setNamedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "setNamedItem", [__arg_0]);
 
-  setNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItemNS", []);
+  setNamedItemNS_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "setNamedItemNS", []);
 
-  setNamedItemNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setNamedItemNS", [__arg_0]);
+  setNamedItemNS_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NamedNodeMap */, "setNamedItemNS", [__arg_0]);
 
 }
 
 class BlinkNavigator {
   static final instance = new BlinkNavigator();
 
-  bluetooth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bluetooth");
+  bluetooth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "bluetooth");
 
-  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connection");
+  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "connection");
 
-  credentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "credentials");
+  credentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "credentials");
 
-  doNotTrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "doNotTrack");
+  doNotTrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "doNotTrack");
 
-  geolocation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geolocation");
+  geolocation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "geolocation");
 
-  maxTouchPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxTouchPoints");
+  maxTouchPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "maxTouchPoints");
 
-  mediaDevices_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mediaDevices");
+  mediaDevices_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "mediaDevices");
 
-  mimeTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mimeTypes");
+  mimeTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "mimeTypes");
 
-  permissions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "permissions");
+  permissions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "permissions");
 
-  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "plugins");
+  plugins_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "plugins");
 
-  presentation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "presentation");
+  presentation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "presentation");
 
-  productSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "productSub");
+  productSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "productSub");
 
-  serviceWorker_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "serviceWorker");
+  serviceWorker_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "serviceWorker");
 
-  services_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "services");
+  services_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "services");
 
-  storageQuota_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "storageQuota");
+  storageQuota_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "storageQuota");
 
-  vendor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendor");
+  vendor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "vendor");
 
-  vendorSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vendorSub");
+  vendorSub_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "vendorSub");
 
-  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitPersistentStorage");
+  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "webkitPersistentStorage");
 
-  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitTemporaryStorage");
+  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Navigator */, "webkitTemporaryStorage");
 
-  getBattery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBattery", []);
+  getBattery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "getBattery", []);
 
-  getGamepads_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getGamepads", []);
+  getGamepads_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "getGamepads", []);
 
-  getVRDevices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVRDevices", []);
+  getVRDevices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "getVRDevices", []);
 
-  isProtocolHandlerRegistered_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProtocolHandlerRegistered", []);
+  isProtocolHandlerRegistered_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "isProtocolHandlerRegistered", []);
 
-  isProtocolHandlerRegistered_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProtocolHandlerRegistered", [__arg_0]);
+  isProtocolHandlerRegistered_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "isProtocolHandlerRegistered", [__arg_0]);
 
-  isProtocolHandlerRegistered_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "isProtocolHandlerRegistered", [__arg_0, __arg_1]);
+  isProtocolHandlerRegistered_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "isProtocolHandlerRegistered", [__arg_0, __arg_1]);
 
-  javaEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "javaEnabled", []);
+  javaEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "javaEnabled", []);
 
-  registerProtocolHandler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "registerProtocolHandler", [__arg_0]);
+  registerProtocolHandler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "registerProtocolHandler", [__arg_0]);
 
-  registerProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "registerProtocolHandler", [__arg_0, __arg_1]);
+  registerProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "registerProtocolHandler", [__arg_0, __arg_1]);
 
-  registerProtocolHandler_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "registerProtocolHandler", [__arg_0, __arg_1, __arg_2]);
+  registerProtocolHandler_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "registerProtocolHandler", [__arg_0, __arg_1, __arg_2]);
 
-  requestMIDIAccess_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestMIDIAccess", []);
+  requestMIDIAccess_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "requestMIDIAccess", []);
 
-  requestMIDIAccess_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestMIDIAccess", [__arg_0]);
+  requestMIDIAccess_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "requestMIDIAccess", [__arg_0]);
 
-  requestMediaKeySystemAccess_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestMediaKeySystemAccess", []);
+  requestMediaKeySystemAccess_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "requestMediaKeySystemAccess", []);
 
-  requestMediaKeySystemAccess_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestMediaKeySystemAccess", [__arg_0]);
+  requestMediaKeySystemAccess_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "requestMediaKeySystemAccess", [__arg_0]);
 
-  requestMediaKeySystemAccess_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "requestMediaKeySystemAccess", [__arg_0, __arg_1]);
+  requestMediaKeySystemAccess_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "requestMediaKeySystemAccess", [__arg_0, __arg_1]);
 
-  sendBeacon_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sendBeacon", []);
+  sendBeacon_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "sendBeacon", []);
 
-  sendBeacon_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sendBeacon", [__arg_0]);
+  sendBeacon_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "sendBeacon", [__arg_0]);
 
-  sendBeacon_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sendBeacon", [__arg_0, __arg_1]);
+  sendBeacon_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "sendBeacon", [__arg_0, __arg_1]);
 
-  unregisterProtocolHandler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregisterProtocolHandler", []);
+  unregisterProtocolHandler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "unregisterProtocolHandler", []);
 
-  unregisterProtocolHandler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unregisterProtocolHandler", [__arg_0]);
+  unregisterProtocolHandler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "unregisterProtocolHandler", [__arg_0]);
 
-  unregisterProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "unregisterProtocolHandler", [__arg_0, __arg_1]);
+  unregisterProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "unregisterProtocolHandler", [__arg_0, __arg_1]);
 
-  webkitGetUserMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetUserMedia", [__arg_0]);
+  webkitGetUserMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "webkitGetUserMedia", [__arg_0]);
 
-  webkitGetUserMedia_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetUserMedia", [__arg_0, __arg_1]);
+  webkitGetUserMedia_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "webkitGetUserMedia", [__arg_0, __arg_1]);
 
-  webkitGetUserMedia_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitGetUserMedia", [__arg_0, __arg_1, __arg_2]);
+  webkitGetUserMedia_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Navigator */, "webkitGetUserMedia", [__arg_0, __arg_1, __arg_2]);
 
-  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
+  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorCPU */, "hardwareConcurrency");
 
-  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appCodeName");
+  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appCodeName");
 
-  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appName");
+  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appName");
 
-  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appVersion");
+  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appVersion");
 
-  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dartEnabled");
+  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "dartEnabled");
 
-  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
+  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "platform");
 
-  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "product");
+  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "product");
 
-  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userAgent");
+  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "userAgent");
 
-  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorLanguage */, "language");
 
-  languages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "languages");
+  languages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorLanguage */, "languages");
 
-  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
+  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorOnLine */, "onLine");
 
-  cookieEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cookieEnabled");
+  cookieEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorStorageUtils */, "cookieEnabled");
 
-  getStorageUpdates_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStorageUpdates", []);
+  getStorageUpdates_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NavigatorStorageUtils */, "getStorageUpdates", []);
 
 }
 
 class BlinkNavigatorCPU {
   static final instance = new BlinkNavigatorCPU();
 
-  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
+  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorCPU */, "hardwareConcurrency");
 
 }
 
 class BlinkNavigatorID {
   static final instance = new BlinkNavigatorID();
 
-  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appCodeName");
+  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appCodeName");
 
-  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appName");
+  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appName");
 
-  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appVersion");
+  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appVersion");
 
-  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dartEnabled");
+  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "dartEnabled");
 
-  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
+  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "platform");
 
-  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "product");
+  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "product");
 
-  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userAgent");
+  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "userAgent");
 
 }
 
 class BlinkNavigatorLanguage {
   static final instance = new BlinkNavigatorLanguage();
 
-  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorLanguage */, "language");
 
-  languages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "languages");
+  languages_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorLanguage */, "languages");
 
 }
 
 class BlinkNavigatorOnLine {
   static final instance = new BlinkNavigatorOnLine();
 
-  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
+  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorOnLine */, "onLine");
 
 }
 
 class BlinkNavigatorStorageUtils {
   static final instance = new BlinkNavigatorStorageUtils();
 
-  cookieEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cookieEnabled");
+  cookieEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorStorageUtils */, "cookieEnabled");
 
-  getStorageUpdates_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStorageUpdates", []);
+  getStorageUpdates_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NavigatorStorageUtils */, "getStorageUpdates", []);
 
 }
 
 class BlinkNavigatorUserMediaError {
   static final instance = new BlinkNavigatorUserMediaError();
 
-  constraintName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "constraintName");
+  constraintName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorUserMediaError */, "constraintName");
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorUserMediaError */, "message");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorUserMediaError */, "name");
 
 }
 
 class BlinkNavigatorUserMediaErrorCallback {
   static final instance = new BlinkNavigatorUserMediaErrorCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NavigatorUserMediaErrorCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NavigatorUserMediaErrorCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkNavigatorUserMediaSuccessCallback {
   static final instance = new BlinkNavigatorUserMediaSuccessCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NavigatorUserMediaSuccessCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NavigatorUserMediaSuccessCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkNetworkInformation extends BlinkEventTarget {
   static final instance = new BlinkNetworkInformation();
 
-  ontypechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontypechange");
+  ontypechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NetworkInformation */, "ontypechange");
 
-  ontypechange_Setter_(mthis, __arg_0) => mthis["ontypechange"] = __arg_0;
+  ontypechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* NetworkInformation */, "ontypechange", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NetworkInformation */, "type");
 
 }
 
 class BlinkNode extends BlinkEventTarget {
   static final instance = new BlinkNode();
 
-  baseURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseURI");
+  baseURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Node */, "baseURI");
 
-  childNodes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childNodes");
+  childNodes_Getter_(mthis) native "Blink_Getter_Node_childNodes";
 
-  firstChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstChild");
+  firstChild_Getter_(mthis) native "Blink_Getter_Node_firstChild";
 
-  lastChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastChild");
+  lastChild_Getter_(mthis) native "Blink_Getter_Node_lastChild";
 
-  localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localName");
+  localName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Node */, "localName");
 
-  namespaceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "namespaceURI");
+  namespaceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Node */, "namespaceURI");
 
-  nextSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextSibling");
+  nextSibling_Getter_(mthis) native "Blink_Getter_Node_nextSibling";
 
-  nodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nodeName");
+  nodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Node */, "nodeName");
 
-  nodeType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nodeType");
+  nodeType_Getter_(mthis) native "Blink_Getter_Node_nodeType";
 
-  nodeValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nodeValue");
+  nodeValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Node */, "nodeValue");
 
-  nodeValue_Setter_(mthis, __arg_0) => mthis["nodeValue"] = __arg_0;
+  nodeValue_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Node */, "nodeValue", __arg_0);
 
-  ownerDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerDocument");
+  ownerDocument_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Node */, "ownerDocument");
 
-  parentElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentElement");
+  parentElement_Getter_(mthis) native "Blink_Getter_Node_parentElement";
 
-  parentNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentNode");
+  parentNode_Getter_(mthis) native "Blink_Getter_Node_parentNode";
 
-  previousSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousSibling");
+  previousSibling_Getter_(mthis) native "Blink_Getter_Node_previousSibling";
 
-  textContent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textContent");
+  textContent_Getter_(mthis) native "Blink_Getter_Node_textContent";
 
-  textContent_Setter_(mthis, __arg_0) => mthis["textContent"] = __arg_0;
+  textContent_Setter_(mthis, __arg_0) native "Blink_Setter_Node_textContent";
 
-  appendChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendChild", []);
+  appendChild_Callback_0_(mthis) native "Blink_Operation_0_Node_appendChild";
 
-  appendChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendChild", [__arg_0]);
+  appendChild_Callback_1_(mthis, __arg_0) native "Blink_Operation_Node_appendChild"; /* __arg_0 */
 
-  cloneNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", []);
+  cloneNode_Callback_0_(mthis) native "Blink_Operation_0_Node_cloneNode";
 
-  cloneNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", [__arg_0]);
+  cloneNode_Callback_1_(mthis, __arg_0) native "Blink_Operation_Node_cloneNode"; /* __arg_0 */
 
-  compareDocumentPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compareDocumentPosition", []);
+  compareDocumentPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "compareDocumentPosition", []);
 
-  compareDocumentPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compareDocumentPosition", [__arg_0]);
+  compareDocumentPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "compareDocumentPosition", [__arg_0]);
 
-  contains_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "contains", []);
+  contains_Callback_0_(mthis) native "Blink_Operation_0_Node_contains";
 
-  contains_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "contains", [__arg_0]);
+  contains_Callback_1_(mthis, __arg_0) native "Blink_Operation_Node_contains"; /* __arg_0 */
 
-  hasChildNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasChildNodes", []);
+  hasChildNodes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "hasChildNodes", []);
 
-  insertBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", []);
+  insertBefore_Callback_0_(mthis) native "Blink_Operation_0_Node_insertBefore";
 
-  insertBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", [__arg_0]);
+  insertBefore_Callback_1_(mthis, __arg_0) native "Blink_Operation_Node_insertBefore"; /* __arg_0 */
 
-  insertBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertBefore", [__arg_0, __arg_1]);
+  insertBefore_Callback_2_(mthis, __arg_0, __arg_1) native "Blink_Operation_Node_insertBefore"; /* __arg_0, __arg_1 */
 
-  isDefaultNamespace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isDefaultNamespace", []);
+  isDefaultNamespace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "isDefaultNamespace", []);
 
-  isDefaultNamespace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isDefaultNamespace", [__arg_0]);
+  isDefaultNamespace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "isDefaultNamespace", [__arg_0]);
 
-  isEqualNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEqualNode", []);
+  isEqualNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "isEqualNode", []);
 
-  isEqualNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEqualNode", [__arg_0]);
+  isEqualNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "isEqualNode", [__arg_0]);
 
-  isSameNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSameNode", []);
+  isSameNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "isSameNode", []);
 
-  isSameNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSameNode", [__arg_0]);
+  isSameNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "isSameNode", [__arg_0]);
 
-  lookupNamespaceURI_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lookupNamespaceURI", []);
+  lookupNamespaceURI_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "lookupNamespaceURI", []);
 
-  lookupNamespaceURI_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lookupNamespaceURI", [__arg_0]);
+  lookupNamespaceURI_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "lookupNamespaceURI", [__arg_0]);
 
-  lookupPrefix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lookupPrefix", []);
+  lookupPrefix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "lookupPrefix", []);
 
-  lookupPrefix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lookupPrefix", [__arg_0]);
+  lookupPrefix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "lookupPrefix", [__arg_0]);
 
-  normalize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "normalize", []);
+  normalize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "normalize", []);
 
-  removeChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeChild", []);
+  removeChild_Callback_0_(mthis) native "Blink_Operation_0_Node_removeChild";
 
-  removeChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeChild", [__arg_0]);
+  removeChild_Callback_1_(mthis, __arg_0) native "Blink_Operation_Node_removeChild"; /* __arg_0 */
 
-  replaceChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceChild", []);
+  replaceChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "replaceChild", []);
 
-  replaceChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceChild", [__arg_0]);
+  replaceChild_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "replaceChild", [__arg_0]);
 
-  replaceChild_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceChild", [__arg_0, __arg_1]);
+  replaceChild_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Node */, "replaceChild", [__arg_0, __arg_1]);
 
 }
 
 class BlinkNodeFilter {
   static final instance = new BlinkNodeFilter();
 
-  acceptNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "acceptNode", []);
+  acceptNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NodeFilter */, "acceptNode", []);
 
-  acceptNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "acceptNode", [__arg_0]);
+  acceptNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NodeFilter */, "acceptNode", [__arg_0]);
 
 }
 
 class BlinkNodeIterator {
   static final instance = new BlinkNodeIterator();
 
-  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filter");
+  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NodeIterator */, "filter");
 
-  pointerBeforeReferenceNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerBeforeReferenceNode");
+  pointerBeforeReferenceNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NodeIterator */, "pointerBeforeReferenceNode");
 
-  referenceNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referenceNode");
+  referenceNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NodeIterator */, "referenceNode");
 
-  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "root");
+  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NodeIterator */, "root");
 
-  whatToShow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "whatToShow");
+  whatToShow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NodeIterator */, "whatToShow");
 
-  detach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detach", []);
+  detach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NodeIterator */, "detach", []);
 
-  nextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "nextNode", []);
+  nextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NodeIterator */, "nextNode", []);
 
-  previousNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "previousNode", []);
+  previousNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NodeIterator */, "previousNode", []);
 
 }
 
 class BlinkNodeList {
   static final instance = new BlinkNodeList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) native "Blink_Getter_NodeList_length";
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) native "Blink_Operation_0_NodeList_item";
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) native "Blink_Operation_NodeList_item"; /* __arg_0 */
 
 }
 
 class BlinkNonDocumentTypeChildNode {
   static final instance = new BlinkNonDocumentTypeChildNode();
 
-  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nextElementSibling");
+  nextElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NonDocumentTypeChildNode */, "nextElementSibling");
 
-  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousElementSibling");
+  previousElementSibling_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NonDocumentTypeChildNode */, "previousElementSibling");
 
 }
 
 class BlinkNonElementParentNode {
   static final instance = new BlinkNonElementParentNode();
 
-  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
+  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NonElementParentNode */, "getElementById", []);
 
-  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
+  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NonElementParentNode */, "getElementById", [__arg_0]);
 
 }
 
 class BlinkNotification extends BlinkEventTarget {
   static final instance = new BlinkNotification();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Notification"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Notification");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Notification"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Notification", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Notification"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("Notification", [__arg_0, __arg_1]);
 
-  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "body");
+  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "body");
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "data");
 
-  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dir");
+  dir_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "dir");
 
-  icon_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "icon");
+  icon_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "icon");
 
-  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lang");
+  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "lang");
 
-  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "onclick");
 
-  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+  onclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Notification */, "onclick", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Notification */, "onclose", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Notification */, "onerror", __arg_0);
 
-  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "onshow");
 
-  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+  onshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Notification */, "onshow", __arg_0);
 
-  permission_Getter_() => Blink_JsNative_DomException.getProperty(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "permission");
+  permission_Getter_() => Blink_JsNative_DomException.getProperty(Blink_JsNative_DomException.getProperty(js.context, "Notification") /* Notification */, "permission");
 
-  silent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "silent");
+  silent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "silent");
 
-  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tag");
+  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "tag");
 
-  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
+  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "title");
 
-  vibrate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vibrate");
+  vibrate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Notification */, "vibrate");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Notification */, "close", []);
 
-  requestPermission_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "requestPermission", []);
+  requestPermission_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification") /* Notification */, "requestPermission", []);
 
-  requestPermission_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification"), "requestPermission", [__arg_0]);
+  requestPermission_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Notification") /* Notification */, "requestPermission", [__arg_0]);
 
 }
 
 class BlinkNotificationEvent extends BlinkExtendableEvent {
   static final instance = new BlinkNotificationEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "NotificationEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("NotificationEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "NotificationEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("NotificationEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "NotificationEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("NotificationEvent", [__arg_0, __arg_1]);
 
-  notification_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "notification");
+  notification_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NotificationEvent */, "notification");
 
 }
 
 class BlinkNotificationPermissionCallback {
   static final instance = new BlinkNotificationPermissionCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* NotificationPermissionCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* NotificationPermissionCallback */, "handleEvent", [__arg_0]);
 
 }
 
@@ -11518,391 +11518,391 @@
 class BlinkOESVertexArrayObject {
   static final instance = new BlinkOESVertexArrayObject();
 
-  bindVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArrayOES", []);
+  bindVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OESVertexArrayObject */, "bindVertexArrayOES", []);
 
-  bindVertexArrayOES_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArrayOES", [__arg_0]);
+  bindVertexArrayOES_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* OESVertexArrayObject */, "bindVertexArrayOES", [__arg_0]);
 
-  createVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createVertexArrayOES", []);
+  createVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OESVertexArrayObject */, "createVertexArrayOES", []);
 
-  deleteVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArrayOES", []);
+  deleteVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OESVertexArrayObject */, "deleteVertexArrayOES", []);
 
-  deleteVertexArrayOES_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArrayOES", [__arg_0]);
+  deleteVertexArrayOES_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* OESVertexArrayObject */, "deleteVertexArrayOES", [__arg_0]);
 
-  isVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArrayOES", []);
+  isVertexArrayOES_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OESVertexArrayObject */, "isVertexArrayOES", []);
 
-  isVertexArrayOES_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArrayOES", [__arg_0]);
+  isVertexArrayOES_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* OESVertexArrayObject */, "isVertexArrayOES", [__arg_0]);
 
 }
 
 class BlinkOfflineAudioCompletionEvent extends BlinkEvent {
   static final instance = new BlinkOfflineAudioCompletionEvent();
 
-  renderedBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "renderedBuffer");
+  renderedBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* OfflineAudioCompletionEvent */, "renderedBuffer");
 
 }
 
 class BlinkOfflineAudioContext extends BlinkAudioContext {
   static final instance = new BlinkOfflineAudioContext();
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "OfflineAudioContext"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("OfflineAudioContext", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "OfflineAudioContext"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("OfflineAudioContext", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "OfflineAudioContext"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("OfflineAudioContext", [__arg_0, __arg_1, __arg_2]);
 
-  oncomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncomplete");
+  oncomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* OfflineAudioContext */, "oncomplete");
 
-  oncomplete_Setter_(mthis, __arg_0) => mthis["oncomplete"] = __arg_0;
+  oncomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* OfflineAudioContext */, "oncomplete", __arg_0);
 
-  startRendering_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "startRendering", []);
+  startRendering_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OfflineAudioContext */, "startRendering", []);
 
 }
 
 class BlinkOscillatorNode extends BlinkAudioSourceNode {
   static final instance = new BlinkOscillatorNode();
 
-  detune_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detune");
+  detune_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* OscillatorNode */, "detune");
 
-  frequency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frequency");
+  frequency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* OscillatorNode */, "frequency");
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* OscillatorNode */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* OscillatorNode */, "onended", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* OscillatorNode */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* OscillatorNode */, "type", __arg_0);
 
-  setPeriodicWave_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setPeriodicWave", []);
+  setPeriodicWave_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OscillatorNode */, "setPeriodicWave", []);
 
-  setPeriodicWave_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setPeriodicWave", [__arg_0]);
+  setPeriodicWave_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* OscillatorNode */, "setPeriodicWave", [__arg_0]);
 
-  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
+  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OscillatorNode */, "start", []);
 
-  start_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "start", [__arg_0]);
+  start_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* OscillatorNode */, "start", [__arg_0]);
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* OscillatorNode */, "stop", []);
 
-  stop_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stop", [__arg_0]);
+  stop_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* OscillatorNode */, "stop", [__arg_0]);
 
 }
 
 class BlinkPagePopupController {
   static final instance = new BlinkPagePopupController();
 
-  closePopup_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePopup", []);
+  closePopup_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "closePopup", []);
 
-  formatMonth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "formatMonth", []);
+  formatMonth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatMonth", []);
 
-  formatMonth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "formatMonth", [__arg_0]);
+  formatMonth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatMonth", [__arg_0]);
 
-  formatMonth_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "formatMonth", [__arg_0, __arg_1]);
+  formatMonth_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatMonth", [__arg_0, __arg_1]);
 
-  formatShortMonth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "formatShortMonth", []);
+  formatShortMonth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatShortMonth", []);
 
-  formatShortMonth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "formatShortMonth", [__arg_0]);
+  formatShortMonth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatShortMonth", [__arg_0]);
 
-  formatShortMonth_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "formatShortMonth", [__arg_0, __arg_1]);
+  formatShortMonth_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatShortMonth", [__arg_0, __arg_1]);
 
-  formatWeek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "formatWeek", [__arg_0]);
+  formatWeek_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatWeek", [__arg_0]);
 
-  formatWeek_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "formatWeek", [__arg_0, __arg_1]);
+  formatWeek_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatWeek", [__arg_0, __arg_1]);
 
-  formatWeek_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "formatWeek", [__arg_0, __arg_1, __arg_2]);
+  formatWeek_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "formatWeek", [__arg_0, __arg_1, __arg_2]);
 
-  histogramEnumeration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "histogramEnumeration", [__arg_0]);
+  histogramEnumeration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "histogramEnumeration", [__arg_0]);
 
-  histogramEnumeration_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "histogramEnumeration", [__arg_0, __arg_1]);
+  histogramEnumeration_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "histogramEnumeration", [__arg_0, __arg_1]);
 
-  histogramEnumeration_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "histogramEnumeration", [__arg_0, __arg_1, __arg_2]);
+  histogramEnumeration_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "histogramEnumeration", [__arg_0, __arg_1, __arg_2]);
 
-  localizeNumberString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "localizeNumberString", []);
+  localizeNumberString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "localizeNumberString", []);
 
-  localizeNumberString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "localizeNumberString", [__arg_0]);
+  localizeNumberString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "localizeNumberString", [__arg_0]);
 
-  selectFontsFromOwnerDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectFontsFromOwnerDocument", []);
+  selectFontsFromOwnerDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "selectFontsFromOwnerDocument", []);
 
-  selectFontsFromOwnerDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectFontsFromOwnerDocument", [__arg_0]);
+  selectFontsFromOwnerDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "selectFontsFromOwnerDocument", [__arg_0]);
 
-  setValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setValue", []);
+  setValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setValue", []);
 
-  setValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setValue", [__arg_0]);
+  setValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setValue", [__arg_0]);
 
-  setValueAndClosePopup_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setValueAndClosePopup", []);
+  setValueAndClosePopup_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setValueAndClosePopup", []);
 
-  setValueAndClosePopup_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setValueAndClosePopup", [__arg_0]);
+  setValueAndClosePopup_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setValueAndClosePopup", [__arg_0]);
 
-  setValueAndClosePopup_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setValueAndClosePopup", [__arg_0, __arg_1]);
+  setValueAndClosePopup_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setValueAndClosePopup", [__arg_0, __arg_1]);
 
-  setWindowRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setWindowRect", [__arg_0, __arg_1]);
+  setWindowRect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setWindowRect", [__arg_0, __arg_1]);
 
-  setWindowRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setWindowRect", [__arg_0, __arg_1, __arg_2]);
+  setWindowRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setWindowRect", [__arg_0, __arg_1, __arg_2]);
 
-  setWindowRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setWindowRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  setWindowRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* PagePopupController */, "setWindowRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkPageTransitionEvent extends BlinkEvent {
   static final instance = new BlinkPageTransitionEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PageTransitionEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PageTransitionEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PageTransitionEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PageTransitionEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PageTransitionEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("PageTransitionEvent", [__arg_0, __arg_1]);
 
-  persisted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "persisted");
+  persisted_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PageTransitionEvent */, "persisted");
 
 }
 
 class BlinkPannerNode extends BlinkAudioNode {
   static final instance = new BlinkPannerNode();
 
-  coneInnerAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coneInnerAngle");
+  coneInnerAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "coneInnerAngle");
 
-  coneInnerAngle_Setter_(mthis, __arg_0) => mthis["coneInnerAngle"] = __arg_0;
+  coneInnerAngle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "coneInnerAngle", __arg_0);
 
-  coneOuterAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coneOuterAngle");
+  coneOuterAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "coneOuterAngle");
 
-  coneOuterAngle_Setter_(mthis, __arg_0) => mthis["coneOuterAngle"] = __arg_0;
+  coneOuterAngle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "coneOuterAngle", __arg_0);
 
-  coneOuterGain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "coneOuterGain");
+  coneOuterGain_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "coneOuterGain");
 
-  coneOuterGain_Setter_(mthis, __arg_0) => mthis["coneOuterGain"] = __arg_0;
+  coneOuterGain_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "coneOuterGain", __arg_0);
 
-  distanceModel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "distanceModel");
+  distanceModel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "distanceModel");
 
-  distanceModel_Setter_(mthis, __arg_0) => mthis["distanceModel"] = __arg_0;
+  distanceModel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "distanceModel", __arg_0);
 
-  maxDistance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxDistance");
+  maxDistance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "maxDistance");
 
-  maxDistance_Setter_(mthis, __arg_0) => mthis["maxDistance"] = __arg_0;
+  maxDistance_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "maxDistance", __arg_0);
 
-  panningModel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "panningModel");
+  panningModel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "panningModel");
 
-  panningModel_Setter_(mthis, __arg_0) => mthis["panningModel"] = __arg_0;
+  panningModel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "panningModel", __arg_0);
 
-  refDistance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "refDistance");
+  refDistance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "refDistance");
 
-  refDistance_Setter_(mthis, __arg_0) => mthis["refDistance"] = __arg_0;
+  refDistance_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "refDistance", __arg_0);
 
-  rolloffFactor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rolloffFactor");
+  rolloffFactor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PannerNode */, "rolloffFactor");
 
-  rolloffFactor_Setter_(mthis, __arg_0) => mthis["rolloffFactor"] = __arg_0;
+  rolloffFactor_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PannerNode */, "rolloffFactor", __arg_0);
 
-  setOrientation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0]);
+  setOrientation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setOrientation", [__arg_0]);
 
-  setOrientation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0, __arg_1]);
+  setOrientation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setOrientation", [__arg_0, __arg_1]);
 
-  setOrientation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setOrientation", [__arg_0, __arg_1, __arg_2]);
+  setOrientation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setOrientation", [__arg_0, __arg_1, __arg_2]);
 
-  setPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0]);
+  setPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setPosition", [__arg_0]);
 
-  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0, __arg_1]);
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setPosition", [__arg_0, __arg_1]);
 
-  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0, __arg_1, __arg_2]);
+  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setPosition", [__arg_0, __arg_1, __arg_2]);
 
-  setVelocity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setVelocity", [__arg_0]);
+  setVelocity_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setVelocity", [__arg_0]);
 
-  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setVelocity", [__arg_0, __arg_1]);
+  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setVelocity", [__arg_0, __arg_1]);
 
-  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setVelocity", [__arg_0, __arg_1, __arg_2]);
+  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* PannerNode */, "setVelocity", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkParentNode {
   static final instance = new BlinkParentNode();
 
-  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "childElementCount");
+  childElementCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ParentNode */, "childElementCount");
 
-  children_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "children");
+  children_Getter_(mthis) native "Blink_Getter_ParentNode_children";
 
-  firstElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "firstElementChild");
+  firstElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_firstElementChild";
 
-  lastElementChild_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastElementChild");
+  lastElementChild_Getter_(mthis) native "Blink_Getter_ParentNode_lastElementChild";
 
-  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "append", []);
+  append_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", []);
 
-  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "append", [__arg_0]);
+  append_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "append", [__arg_0]);
 
-  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prepend", []);
+  prepend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", []);
 
-  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prepend", [__arg_0]);
+  prepend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "prepend", [__arg_0]);
 
-  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", []);
+  querySelector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", []);
 
-  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelector", [__arg_0]);
+  querySelector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelector", [__arg_0]);
 
-  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", []);
+  querySelectorAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", []);
 
-  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "querySelectorAll", [__arg_0]);
+  querySelectorAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ParentNode */, "querySelectorAll", [__arg_0]);
 
 }
 
 class BlinkPasswordCredential extends BlinkCredential {
   static final instance = new BlinkPasswordCredential();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PasswordCredential");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PasswordCredential", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("PasswordCredential", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("PasswordCredential", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PasswordCredential"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("PasswordCredential", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  formData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "formData");
+  formData_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PasswordCredential */, "formData");
 
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PasswordCredential */, "password");
 
 }
 
 class BlinkPath2D {
   static final instance = new BlinkPath2D();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Path2D"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Path2D");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Path2D"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Path2D", [__arg_0]);
 
-  addPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addPath", []);
+  addPath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Path2D */, "addPath", []);
 
-  addPath_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addPath", [__arg_0]);
+  addPath_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Path2D */, "addPath", [__arg_0]);
 
-  addPath_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addPath", [__arg_0, __arg_1]);
+  addPath_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Path2D */, "addPath", [__arg_0, __arg_1]);
 
-  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2]);
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2]);
 
-  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "closePath", []);
+  closePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "closePath", []);
 
-  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", []);
+  lineTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", []);
 
-  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0]);
+  lineTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", [__arg_0]);
 
-  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "lineTo", [__arg_0, __arg_1]);
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "lineTo", [__arg_0, __arg_1]);
 
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", []);
 
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", [__arg_0]);
 
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "moveTo", [__arg_0, __arg_1]);
 
-  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1]);
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1]);
 
-  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
 
-  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1]);
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1]);
 
-  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2]);
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1, __arg_2]);
 
-  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* CanvasPathMethods */, "rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkPerformance extends BlinkEventTarget {
   static final instance = new BlinkPerformance();
 
-  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "memory");
+  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Performance */, "memory");
 
-  navigation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigation");
+  navigation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Performance */, "navigation");
 
-  onframetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onframetimingbufferfull");
+  onframetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Performance */, "onframetimingbufferfull");
 
-  onframetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onframetimingbufferfull"] = __arg_0;
+  onframetimingbufferfull_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Performance */, "onframetimingbufferfull", __arg_0);
 
-  onwebkitresourcetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitresourcetimingbufferfull");
+  onwebkitresourcetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Performance */, "onwebkitresourcetimingbufferfull");
 
-  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onwebkitresourcetimingbufferfull"] = __arg_0;
+  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Performance */, "onwebkitresourcetimingbufferfull", __arg_0);
 
-  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timing");
+  timing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Performance */, "timing");
 
-  clearFrameTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearFrameTimings", []);
+  clearFrameTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "clearFrameTimings", []);
 
-  clearMarks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", []);
+  clearMarks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "clearMarks", []);
 
-  clearMarks_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", [__arg_0]);
+  clearMarks_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "clearMarks", [__arg_0]);
 
-  clearMeasures_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearMeasures", []);
+  clearMeasures_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "clearMeasures", []);
 
-  clearMeasures_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMeasures", [__arg_0]);
+  clearMeasures_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "clearMeasures", [__arg_0]);
 
-  getEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntries", []);
+  getEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "getEntries", []);
 
-  getEntriesByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", []);
+  getEntriesByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "getEntriesByName", []);
 
-  getEntriesByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", [__arg_0]);
+  getEntriesByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "getEntriesByName", [__arg_0]);
 
-  getEntriesByName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", [__arg_0, __arg_1]);
+  getEntriesByName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "getEntriesByName", [__arg_0, __arg_1]);
 
-  getEntriesByType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByType", []);
+  getEntriesByType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "getEntriesByType", []);
 
-  getEntriesByType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByType", [__arg_0]);
+  getEntriesByType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "getEntriesByType", [__arg_0]);
 
-  mark_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "mark", []);
+  mark_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "mark", []);
 
-  mark_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "mark", [__arg_0]);
+  mark_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "mark", [__arg_0]);
 
-  measure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0]);
+  measure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "measure", [__arg_0]);
 
-  measure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1]);
+  measure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "measure", [__arg_0, __arg_1]);
 
-  measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1, __arg_2]);
+  measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "measure", [__arg_0, __arg_1, __arg_2]);
 
-  now_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "now", []);
+  now_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "now", []);
 
-  setFrameTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setFrameTimingBufferSize", []);
+  setFrameTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "setFrameTimingBufferSize", []);
 
-  setFrameTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setFrameTimingBufferSize", [__arg_0]);
+  setFrameTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "setFrameTimingBufferSize", [__arg_0]);
 
-  webkitClearResourceTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitClearResourceTimings", []);
+  webkitClearResourceTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "webkitClearResourceTimings", []);
 
-  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitSetResourceTimingBufferSize", []);
+  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "webkitSetResourceTimingBufferSize", []);
 
-  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitSetResourceTimingBufferSize", [__arg_0]);
+  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Performance */, "webkitSetResourceTimingBufferSize", [__arg_0]);
 
 }
 
 class BlinkPerformanceCompositeTiming extends BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceCompositeTiming();
 
-  sourceFrame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceFrame");
+  sourceFrame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceCompositeTiming */, "sourceFrame");
 
 }
 
 class BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceEntry();
 
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceEntry */, "duration");
 
-  entryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "entryType");
+  entryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceEntry */, "entryType");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceEntry */, "name");
 
-  startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startTime");
+  startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceEntry */, "startTime");
 
 }
 
@@ -11919,141 +11919,141 @@
 class BlinkPerformanceNavigation {
   static final instance = new BlinkPerformanceNavigation();
 
-  redirectCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "redirectCount");
+  redirectCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceNavigation */, "redirectCount");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceNavigation */, "type");
 
 }
 
 class BlinkPerformanceRenderTiming extends BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceRenderTiming();
 
-  sourceFrame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceFrame");
+  sourceFrame_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceRenderTiming */, "sourceFrame");
 
 }
 
 class BlinkPerformanceResourceTiming extends BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceResourceTiming();
 
-  connectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connectEnd");
+  connectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "connectEnd");
 
-  connectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connectStart");
+  connectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "connectStart");
 
-  domainLookupEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domainLookupEnd");
+  domainLookupEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "domainLookupEnd");
 
-  domainLookupStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domainLookupStart");
+  domainLookupStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "domainLookupStart");
 
-  fetchStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fetchStart");
+  fetchStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "fetchStart");
 
-  initiatorType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "initiatorType");
+  initiatorType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "initiatorType");
 
-  redirectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "redirectEnd");
+  redirectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "redirectEnd");
 
-  redirectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "redirectStart");
+  redirectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "redirectStart");
 
-  requestStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requestStart");
+  requestStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "requestStart");
 
-  responseEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseEnd");
+  responseEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "responseEnd");
 
-  responseStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseStart");
+  responseStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "responseStart");
 
-  secureConnectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "secureConnectionStart");
+  secureConnectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "secureConnectionStart");
 
-  workerStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "workerStart");
+  workerStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceResourceTiming */, "workerStart");
 
 }
 
 class BlinkPerformanceTiming {
   static final instance = new BlinkPerformanceTiming();
 
-  connectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connectEnd");
+  connectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "connectEnd");
 
-  connectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connectStart");
+  connectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "connectStart");
 
-  domComplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domComplete");
+  domComplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "domComplete");
 
-  domContentLoadedEventEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domContentLoadedEventEnd");
+  domContentLoadedEventEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "domContentLoadedEventEnd");
 
-  domContentLoadedEventStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domContentLoadedEventStart");
+  domContentLoadedEventStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "domContentLoadedEventStart");
 
-  domInteractive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domInteractive");
+  domInteractive_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "domInteractive");
 
-  domLoading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domLoading");
+  domLoading_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "domLoading");
 
-  domainLookupEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domainLookupEnd");
+  domainLookupEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "domainLookupEnd");
 
-  domainLookupStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "domainLookupStart");
+  domainLookupStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "domainLookupStart");
 
-  fetchStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fetchStart");
+  fetchStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "fetchStart");
 
-  loadEventEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loadEventEnd");
+  loadEventEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "loadEventEnd");
 
-  loadEventStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loadEventStart");
+  loadEventStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "loadEventStart");
 
-  navigationStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigationStart");
+  navigationStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "navigationStart");
 
-  redirectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "redirectEnd");
+  redirectEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "redirectEnd");
 
-  redirectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "redirectStart");
+  redirectStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "redirectStart");
 
-  requestStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requestStart");
+  requestStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "requestStart");
 
-  responseEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseEnd");
+  responseEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "responseEnd");
 
-  responseStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseStart");
+  responseStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "responseStart");
 
-  secureConnectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "secureConnectionStart");
+  secureConnectionStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "secureConnectionStart");
 
-  unloadEventEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unloadEventEnd");
+  unloadEventEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "unloadEventEnd");
 
-  unloadEventStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unloadEventStart");
+  unloadEventStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PerformanceTiming */, "unloadEventStart");
 
 }
 
 class BlinkPeriodicSyncEvent extends BlinkExtendableEvent {
   static final instance = new BlinkPeriodicSyncEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PeriodicSyncEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PeriodicSyncEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PeriodicSyncEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PeriodicSyncEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PeriodicSyncEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("PeriodicSyncEvent", [__arg_0, __arg_1]);
 
-  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "registration");
+  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PeriodicSyncEvent */, "registration");
 
 }
 
 class BlinkPeriodicSyncManager {
   static final instance = new BlinkPeriodicSyncManager();
 
-  minPossiblePeriod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minPossiblePeriod");
+  minPossiblePeriod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PeriodicSyncManager */, "minPossiblePeriod");
 
-  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", []);
+  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PeriodicSyncManager */, "getRegistration", []);
 
-  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", [__arg_0]);
+  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PeriodicSyncManager */, "getRegistration", [__arg_0]);
 
-  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistrations", []);
+  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PeriodicSyncManager */, "getRegistrations", []);
 
-  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", []);
+  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PeriodicSyncManager */, "permissionState", []);
 
-  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "register", []);
+  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PeriodicSyncManager */, "register", []);
 
-  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "register", [__arg_0]);
+  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PeriodicSyncManager */, "register", [__arg_0]);
 
 }
 
 class BlinkPeriodicSyncRegistration {
   static final instance = new BlinkPeriodicSyncRegistration();
 
-  minPeriod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minPeriod");
+  minPeriod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PeriodicSyncRegistration */, "minPeriod");
 
-  networkState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "networkState");
+  networkState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PeriodicSyncRegistration */, "networkState");
 
-  powerState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "powerState");
+  powerState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PeriodicSyncRegistration */, "powerState");
 
-  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tag");
+  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PeriodicSyncRegistration */, "tag");
 
-  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregister", []);
+  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PeriodicSyncRegistration */, "unregister", []);
 
 }
 
@@ -12065,1027 +12065,1027 @@
 class BlinkPermissionStatus extends BlinkEventTarget {
   static final instance = new BlinkPermissionStatus();
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PermissionStatus */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PermissionStatus */, "onchange", __arg_0);
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PermissionStatus */, "state");
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PermissionStatus */, "status");
 
 }
 
 class BlinkPermissions {
   static final instance = new BlinkPermissions();
 
-  query_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "query", []);
+  query_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Permissions */, "query", []);
 
-  query_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "query", [__arg_0]);
+  query_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Permissions */, "query", [__arg_0]);
 
 }
 
 class BlinkPlugin {
   static final instance = new BlinkPlugin();
 
-  description_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "description");
+  description_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Plugin */, "description");
 
-  filename_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filename");
+  filename_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Plugin */, "filename");
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Plugin */, "length");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Plugin */, "name");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Plugin */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Plugin */, "item", [__arg_0]);
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Plugin */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Plugin */, "namedItem", [__arg_0]);
 
 }
 
 class BlinkPluginArray {
   static final instance = new BlinkPluginArray();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PluginArray */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PluginArray */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PluginArray */, "item", [__arg_0]);
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PluginArray */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PluginArray */, "namedItem", [__arg_0]);
 
-  refresh_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "refresh", []);
+  refresh_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PluginArray */, "refresh", []);
 
-  refresh_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "refresh", [__arg_0]);
+  refresh_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PluginArray */, "refresh", [__arg_0]);
 
 }
 
 class BlinkPluginPlaceholderElement extends BlinkHTMLDivElement {
   static final instance = new BlinkPluginPlaceholderElement();
 
-  closeable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closeable");
+  closeable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PluginPlaceholderElement */, "closeable");
 
-  closeable_Setter_(mthis, __arg_0) => mthis["closeable"] = __arg_0;
+  closeable_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PluginPlaceholderElement */, "closeable", __arg_0);
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PluginPlaceholderElement */, "message");
 
-  message_Setter_(mthis, __arg_0) => mthis["message"] = __arg_0;
+  message_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PluginPlaceholderElement */, "message", __arg_0);
 
-  createdCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createdCallback", []);
+  createdCallback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PluginPlaceholderElement */, "createdCallback", []);
 
 }
 
 class BlinkPointerEvent extends BlinkMouseEvent {
   static final instance = new BlinkPointerEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PointerEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PointerEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PointerEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PointerEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PointerEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("PointerEvent", [__arg_0, __arg_1]);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "height");
 
-  isPrimary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isPrimary");
+  isPrimary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "isPrimary");
 
-  pointerId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerId");
+  pointerId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "pointerId");
 
-  pointerType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointerType");
+  pointerType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "pointerType");
 
-  pressure_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pressure");
+  pressure_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "pressure");
 
-  tiltX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tiltX");
+  tiltX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "tiltX");
 
-  tiltY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tiltY");
+  tiltY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "tiltY");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PointerEvent */, "width");
 
 }
 
 class BlinkPopStateEvent extends BlinkEvent {
   static final instance = new BlinkPopStateEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PopStateEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PopStateEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PopStateEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PopStateEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PopStateEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("PopStateEvent", [__arg_0, __arg_1]);
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PopStateEvent */, "state");
 
 }
 
 class BlinkPositionCallback {
   static final instance = new BlinkPositionCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PositionCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PositionCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkPositionError {
   static final instance = new BlinkPositionError();
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PositionError */, "code");
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PositionError */, "message");
 
 }
 
 class BlinkPositionErrorCallback {
   static final instance = new BlinkPositionErrorCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PositionErrorCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PositionErrorCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkPositionSensorVRDevice extends BlinkVRDevice {
   static final instance = new BlinkPositionSensorVRDevice();
 
-  getImmediateState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getImmediateState", []);
+  getImmediateState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PositionSensorVRDevice */, "getImmediateState", []);
 
-  getState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getState", []);
+  getState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PositionSensorVRDevice */, "getState", []);
 
-  resetSensor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resetSensor", []);
+  resetSensor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PositionSensorVRDevice */, "resetSensor", []);
 
 }
 
 class BlinkPresentation extends BlinkEventTarget {
   static final instance = new BlinkPresentation();
 
-  ondefaultsessionstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondefaultsessionstart");
+  ondefaultsessionstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Presentation */, "ondefaultsessionstart");
 
-  ondefaultsessionstart_Setter_(mthis, __arg_0) => mthis["ondefaultsessionstart"] = __arg_0;
+  ondefaultsessionstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Presentation */, "ondefaultsessionstart", __arg_0);
 
-  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "session");
+  session_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Presentation */, "session");
 
-  getAvailability_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAvailability", []);
+  getAvailability_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Presentation */, "getAvailability", []);
 
-  getAvailability_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAvailability", [__arg_0]);
+  getAvailability_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Presentation */, "getAvailability", [__arg_0]);
 
-  joinSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "joinSession", []);
+  joinSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Presentation */, "joinSession", []);
 
-  joinSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "joinSession", [__arg_0]);
+  joinSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Presentation */, "joinSession", [__arg_0]);
 
-  joinSession_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "joinSession", [__arg_0, __arg_1]);
+  joinSession_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Presentation */, "joinSession", [__arg_0, __arg_1]);
 
-  startSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "startSession", []);
+  startSession_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Presentation */, "startSession", []);
 
-  startSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "startSession", [__arg_0]);
+  startSession_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Presentation */, "startSession", [__arg_0]);
 
 }
 
 class BlinkPresentationAvailability extends BlinkEventTarget {
   static final instance = new BlinkPresentationAvailability();
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PresentationAvailability */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PresentationAvailability */, "onchange", __arg_0);
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PresentationAvailability */, "value");
 
 }
 
 class BlinkPresentationSession extends BlinkEventTarget {
   static final instance = new BlinkPresentationSession();
 
-  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "binaryType");
+  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PresentationSession */, "binaryType");
 
-  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
+  binaryType_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PresentationSession */, "binaryType", __arg_0);
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PresentationSession */, "id");
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PresentationSession */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PresentationSession */, "onmessage", __arg_0);
 
-  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PresentationSession */, "onstatechange");
 
-  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+  onstatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* PresentationSession */, "onstatechange", __arg_0);
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PresentationSession */, "state");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PresentationSession */, "close", []);
 
-  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
+  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PresentationSession */, "send", []);
 
-  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
+  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PresentationSession */, "send", [__arg_0]);
 
 }
 
 class BlinkProcessingInstruction extends BlinkCharacterData {
   static final instance = new BlinkProcessingInstruction();
 
-  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sheet");
+  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ProcessingInstruction */, "sheet");
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ProcessingInstruction */, "target");
 
 }
 
 class BlinkProgressEvent extends BlinkEvent {
   static final instance = new BlinkProgressEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ProgressEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ProgressEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ProgressEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ProgressEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ProgressEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ProgressEvent", [__arg_0, __arg_1]);
 
-  lengthComputable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lengthComputable");
+  lengthComputable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ProgressEvent */, "lengthComputable");
 
-  loaded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "loaded");
+  loaded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ProgressEvent */, "loaded");
 
-  total_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "total");
+  total_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ProgressEvent */, "total");
 
 }
 
 class BlinkPromiseRejectionEvent extends BlinkEvent {
   static final instance = new BlinkPromiseRejectionEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PromiseRejectionEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PromiseRejectionEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PromiseRejectionEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PromiseRejectionEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PromiseRejectionEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("PromiseRejectionEvent", [__arg_0, __arg_1]);
 
-  promise_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "promise");
+  promise_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PromiseRejectionEvent */, "promise");
 
-  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reason");
+  reason_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PromiseRejectionEvent */, "reason");
 
 }
 
 class BlinkPushEvent extends BlinkExtendableEvent {
   static final instance = new BlinkPushEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PushEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PushEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("PushEvent", [__arg_0, __arg_1]);
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PushEvent */, "data");
 
 }
 
 class BlinkPushManager {
   static final instance = new BlinkPushManager();
 
-  getSubscription_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSubscription", []);
+  getSubscription_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushManager */, "getSubscription", []);
 
-  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", []);
+  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushManager */, "permissionState", []);
 
-  permissionState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", [__arg_0]);
+  permissionState_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PushManager */, "permissionState", [__arg_0]);
 
-  subscribe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "subscribe", []);
+  subscribe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushManager */, "subscribe", []);
 
-  subscribe_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "subscribe", [__arg_0]);
+  subscribe_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* PushManager */, "subscribe", [__arg_0]);
 
 }
 
 class BlinkPushMessageData {
   static final instance = new BlinkPushMessageData();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushMessageData"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("PushMessageData");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "PushMessageData"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("PushMessageData", [__arg_0]);
 
-  arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "arrayBuffer", []);
+  arrayBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushMessageData */, "arrayBuffer", []);
 
-  blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blob", []);
+  blob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushMessageData */, "blob", []);
 
-  json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "json", []);
+  json_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushMessageData */, "json", []);
 
-  text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "text", []);
+  text_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushMessageData */, "text", []);
 
 }
 
 class BlinkPushSubscription {
   static final instance = new BlinkPushSubscription();
 
-  endpoint_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endpoint");
+  endpoint_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* PushSubscription */, "endpoint");
 
-  unsubscribe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unsubscribe", []);
+  unsubscribe_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* PushSubscription */, "unsubscribe", []);
 
 }
 
 class BlinkRTCDTMFSender extends BlinkEventTarget {
   static final instance = new BlinkRTCDTMFSender();
 
-  canInsertDTMF_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canInsertDTMF");
+  canInsertDTMF_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDTMFSender */, "canInsertDTMF");
 
-  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "duration");
+  duration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDTMFSender */, "duration");
 
-  interToneGap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "interToneGap");
+  interToneGap_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDTMFSender */, "interToneGap");
 
-  ontonechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontonechange");
+  ontonechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDTMFSender */, "ontonechange");
 
-  ontonechange_Setter_(mthis, __arg_0) => mthis["ontonechange"] = __arg_0;
+  ontonechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCDTMFSender */, "ontonechange", __arg_0);
 
-  toneBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "toneBuffer");
+  toneBuffer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDTMFSender */, "toneBuffer");
 
-  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
+  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDTMFSender */, "track");
 
-  insertDTMF_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", []);
+  insertDTMF_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCDTMFSender */, "insertDTMF", []);
 
-  insertDTMF_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0]);
+  insertDTMF_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCDTMFSender */, "insertDTMF", [__arg_0]);
 
-  insertDTMF_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0, __arg_1]);
+  insertDTMF_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCDTMFSender */, "insertDTMF", [__arg_0, __arg_1]);
 
-  insertDTMF_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "insertDTMF", [__arg_0, __arg_1, __arg_2]);
+  insertDTMF_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* RTCDTMFSender */, "insertDTMF", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkRTCDTMFToneChangeEvent extends BlinkEvent {
   static final instance = new BlinkRTCDTMFToneChangeEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCDTMFToneChangeEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("RTCDTMFToneChangeEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCDTMFToneChangeEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("RTCDTMFToneChangeEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCDTMFToneChangeEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("RTCDTMFToneChangeEvent", [__arg_0, __arg_1]);
 
-  tone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tone");
+  tone_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDTMFToneChangeEvent */, "tone");
 
 }
 
 class BlinkRTCDataChannel extends BlinkEventTarget {
   static final instance = new BlinkRTCDataChannel();
 
-  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "binaryType");
+  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "binaryType");
 
-  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
+  binaryType_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCDataChannel */, "binaryType", __arg_0);
 
-  bufferedAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bufferedAmount");
+  bufferedAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "bufferedAmount");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "id");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "label");
 
-  maxRetransmitTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxRetransmitTime");
+  maxRetransmitTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "maxRetransmitTime");
 
-  maxRetransmits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxRetransmits");
+  maxRetransmits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "maxRetransmits");
 
-  negotiated_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "negotiated");
+  negotiated_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "negotiated");
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCDataChannel */, "onclose", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCDataChannel */, "onerror", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCDataChannel */, "onmessage", __arg_0);
 
-  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onopen");
+  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "onopen");
 
-  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
+  onopen_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCDataChannel */, "onopen", __arg_0);
 
-  ordered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ordered");
+  ordered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "ordered");
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "protocol");
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "readyState");
 
-  reliable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "reliable");
+  reliable_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannel */, "reliable");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCDataChannel */, "close", []);
 
-  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
+  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCDataChannel */, "send", []);
 
-  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
+  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCDataChannel */, "send", [__arg_0]);
 
 }
 
 class BlinkRTCDataChannelEvent extends BlinkEvent {
   static final instance = new BlinkRTCDataChannelEvent();
 
-  channel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "channel");
+  channel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCDataChannelEvent */, "channel");
 
 }
 
 class BlinkRTCErrorCallback {
   static final instance = new BlinkRTCErrorCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCErrorCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCErrorCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkRTCIceCandidate {
   static final instance = new BlinkRTCIceCandidate();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCIceCandidate"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("RTCIceCandidate");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCIceCandidate"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("RTCIceCandidate", [__arg_0]);
 
-  candidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "candidate");
+  candidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCIceCandidate */, "candidate");
 
-  candidate_Setter_(mthis, __arg_0) => mthis["candidate"] = __arg_0;
+  candidate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCIceCandidate */, "candidate", __arg_0);
 
-  sdpMLineIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sdpMLineIndex");
+  sdpMLineIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCIceCandidate */, "sdpMLineIndex");
 
-  sdpMLineIndex_Setter_(mthis, __arg_0) => mthis["sdpMLineIndex"] = __arg_0;
+  sdpMLineIndex_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCIceCandidate */, "sdpMLineIndex", __arg_0);
 
-  sdpMid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sdpMid");
+  sdpMid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCIceCandidate */, "sdpMid");
 
-  sdpMid_Setter_(mthis, __arg_0) => mthis["sdpMid"] = __arg_0;
+  sdpMid_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCIceCandidate */, "sdpMid", __arg_0);
 
 }
 
 class BlinkRTCIceCandidateEvent extends BlinkEvent {
   static final instance = new BlinkRTCIceCandidateEvent();
 
-  candidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "candidate");
+  candidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCIceCandidateEvent */, "candidate");
 
 }
 
 class BlinkRTCPeerConnection extends BlinkEventTarget {
   static final instance = new BlinkRTCPeerConnection();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("webkitRTCPeerConnection");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("webkitRTCPeerConnection", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitRTCPeerConnection"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("webkitRTCPeerConnection", [__arg_0, __arg_1]);
 
-  iceConnectionState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iceConnectionState");
+  iceConnectionState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "iceConnectionState");
 
-  iceGatheringState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "iceGatheringState");
+  iceGatheringState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "iceGatheringState");
 
-  localDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localDescription");
+  localDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "localDescription");
 
-  onaddstream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddstream");
+  onaddstream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "onaddstream");
 
-  onaddstream_Setter_(mthis, __arg_0) => mthis["onaddstream"] = __arg_0;
+  onaddstream_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCPeerConnection */, "onaddstream", __arg_0);
 
-  ondatachannel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondatachannel");
+  ondatachannel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "ondatachannel");
 
-  ondatachannel_Setter_(mthis, __arg_0) => mthis["ondatachannel"] = __arg_0;
+  ondatachannel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCPeerConnection */, "ondatachannel", __arg_0);
 
-  onicecandidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onicecandidate");
+  onicecandidate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "onicecandidate");
 
-  onicecandidate_Setter_(mthis, __arg_0) => mthis["onicecandidate"] = __arg_0;
+  onicecandidate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCPeerConnection */, "onicecandidate", __arg_0);
 
-  oniceconnectionstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oniceconnectionstatechange");
+  oniceconnectionstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "oniceconnectionstatechange");
 
-  oniceconnectionstatechange_Setter_(mthis, __arg_0) => mthis["oniceconnectionstatechange"] = __arg_0;
+  oniceconnectionstatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCPeerConnection */, "oniceconnectionstatechange", __arg_0);
 
-  onnegotiationneeded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnegotiationneeded");
+  onnegotiationneeded_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "onnegotiationneeded");
 
-  onnegotiationneeded_Setter_(mthis, __arg_0) => mthis["onnegotiationneeded"] = __arg_0;
+  onnegotiationneeded_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCPeerConnection */, "onnegotiationneeded", __arg_0);
 
-  onremovestream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovestream");
+  onremovestream_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "onremovestream");
 
-  onremovestream_Setter_(mthis, __arg_0) => mthis["onremovestream"] = __arg_0;
+  onremovestream_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCPeerConnection */, "onremovestream", __arg_0);
 
-  onsignalingstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsignalingstatechange");
+  onsignalingstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "onsignalingstatechange");
 
-  onsignalingstatechange_Setter_(mthis, __arg_0) => mthis["onsignalingstatechange"] = __arg_0;
+  onsignalingstatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCPeerConnection */, "onsignalingstatechange", __arg_0);
 
-  remoteDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "remoteDescription");
+  remoteDescription_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "remoteDescription");
 
-  signalingState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "signalingState");
+  signalingState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCPeerConnection */, "signalingState");
 
-  addIceCandidate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addIceCandidate", [__arg_0]);
+  addIceCandidate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "addIceCandidate", [__arg_0]);
 
-  addIceCandidate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addIceCandidate", [__arg_0, __arg_1]);
+  addIceCandidate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "addIceCandidate", [__arg_0, __arg_1]);
 
-  addIceCandidate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "addIceCandidate", [__arg_0, __arg_1, __arg_2]);
+  addIceCandidate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "addIceCandidate", [__arg_0, __arg_1, __arg_2]);
 
-  addStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addStream", []);
+  addStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "addStream", []);
 
-  addStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addStream", [__arg_0]);
+  addStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "addStream", [__arg_0]);
 
-  addStream_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addStream", [__arg_0, __arg_1]);
+  addStream_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "addStream", [__arg_0, __arg_1]);
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "close", []);
 
-  createAnswer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createAnswer", []);
+  createAnswer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createAnswer", []);
 
-  createAnswer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createAnswer", [__arg_0]);
+  createAnswer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createAnswer", [__arg_0]);
 
-  createAnswer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createAnswer", [__arg_0, __arg_1]);
+  createAnswer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createAnswer", [__arg_0, __arg_1]);
 
-  createAnswer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createAnswer", [__arg_0, __arg_1, __arg_2]);
+  createAnswer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createAnswer", [__arg_0, __arg_1, __arg_2]);
 
-  createDTMFSender_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDTMFSender", []);
+  createDTMFSender_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createDTMFSender", []);
 
-  createDTMFSender_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDTMFSender", [__arg_0]);
+  createDTMFSender_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createDTMFSender", [__arg_0]);
 
-  createDataChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createDataChannel", []);
+  createDataChannel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createDataChannel", []);
 
-  createDataChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createDataChannel", [__arg_0]);
+  createDataChannel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createDataChannel", [__arg_0]);
 
-  createDataChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createDataChannel", [__arg_0, __arg_1]);
+  createDataChannel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createDataChannel", [__arg_0, __arg_1]);
 
-  createOffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createOffer", []);
+  createOffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createOffer", []);
 
-  createOffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createOffer", [__arg_0]);
+  createOffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createOffer", [__arg_0]);
 
-  createOffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createOffer", [__arg_0, __arg_1]);
+  createOffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createOffer", [__arg_0, __arg_1]);
 
-  createOffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createOffer", [__arg_0, __arg_1, __arg_2]);
+  createOffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "createOffer", [__arg_0, __arg_1, __arg_2]);
 
-  getLocalStreams_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getLocalStreams", []);
+  getLocalStreams_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "getLocalStreams", []);
 
-  getRemoteStreams_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRemoteStreams", []);
+  getRemoteStreams_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "getRemoteStreams", []);
 
-  getStats_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStats", []);
+  getStats_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "getStats", []);
 
-  getStats_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getStats", [__arg_0]);
+  getStats_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "getStats", [__arg_0]);
 
-  getStats_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getStats", [__arg_0, __arg_1]);
+  getStats_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "getStats", [__arg_0, __arg_1]);
 
-  getStreamById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStreamById", []);
+  getStreamById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "getStreamById", []);
 
-  getStreamById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getStreamById", [__arg_0]);
+  getStreamById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "getStreamById", [__arg_0]);
 
-  removeStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeStream", []);
+  removeStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "removeStream", []);
 
-  removeStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeStream", [__arg_0]);
+  removeStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "removeStream", [__arg_0]);
 
-  setLocalDescription_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setLocalDescription", []);
+  setLocalDescription_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setLocalDescription", []);
 
-  setLocalDescription_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setLocalDescription", [__arg_0]);
+  setLocalDescription_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setLocalDescription", [__arg_0]);
 
-  setLocalDescription_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setLocalDescription", [__arg_0, __arg_1]);
+  setLocalDescription_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setLocalDescription", [__arg_0, __arg_1]);
 
-  setLocalDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setLocalDescription", [__arg_0, __arg_1, __arg_2]);
+  setLocalDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setLocalDescription", [__arg_0, __arg_1, __arg_2]);
 
-  setRemoteDescription_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setRemoteDescription", []);
+  setRemoteDescription_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setRemoteDescription", []);
 
-  setRemoteDescription_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setRemoteDescription", [__arg_0]);
+  setRemoteDescription_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setRemoteDescription", [__arg_0]);
 
-  setRemoteDescription_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setRemoteDescription", [__arg_0, __arg_1]);
+  setRemoteDescription_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setRemoteDescription", [__arg_0, __arg_1]);
 
-  setRemoteDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setRemoteDescription", [__arg_0, __arg_1, __arg_2]);
+  setRemoteDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "setRemoteDescription", [__arg_0, __arg_1, __arg_2]);
 
-  updateIce_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "updateIce", []);
+  updateIce_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "updateIce", []);
 
-  updateIce_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "updateIce", [__arg_0]);
+  updateIce_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "updateIce", [__arg_0]);
 
-  updateIce_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "updateIce", [__arg_0, __arg_1]);
+  updateIce_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* RTCPeerConnection */, "updateIce", [__arg_0, __arg_1]);
 
 }
 
 class BlinkRTCSessionDescription {
   static final instance = new BlinkRTCSessionDescription();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCSessionDescription"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("RTCSessionDescription");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RTCSessionDescription"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("RTCSessionDescription", [__arg_0]);
 
-  sdp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sdp");
+  sdp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCSessionDescription */, "sdp");
 
-  sdp_Setter_(mthis, __arg_0) => mthis["sdp"] = __arg_0;
+  sdp_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCSessionDescription */, "sdp", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCSessionDescription */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RTCSessionDescription */, "type", __arg_0);
 
 }
 
 class BlinkRTCSessionDescriptionCallback {
   static final instance = new BlinkRTCSessionDescriptionCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCSessionDescriptionCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCSessionDescriptionCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkRTCStatsCallback {
   static final instance = new BlinkRTCStatsCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkRTCStatsReport {
   static final instance = new BlinkRTCStatsReport();
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCStatsReport */, "id");
 
-  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestamp");
+  timestamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCStatsReport */, "timestamp");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RTCStatsReport */, "type");
 
-  names_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "names", []);
+  names_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsReport */, "names", []);
 
-  stat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stat", []);
+  stat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsReport */, "stat", []);
 
-  stat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stat", [__arg_0]);
+  stat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsReport */, "stat", [__arg_0]);
 
 }
 
 class BlinkRTCStatsResponse {
   static final instance = new BlinkRTCStatsResponse();
 
-  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", []);
+  namedItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsResponse */, "namedItem", []);
 
-  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "namedItem", [__arg_0]);
+  namedItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsResponse */, "namedItem", [__arg_0]);
 
-  result_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "result", []);
+  result_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RTCStatsResponse */, "result", []);
 
 }
 
 class BlinkRadioNodeList extends BlinkNodeList {
   static final instance = new BlinkRadioNodeList();
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RadioNodeList */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* RadioNodeList */, "value", __arg_0);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RadioNodeList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RadioNodeList */, "item", [__arg_0]);
 
 }
 
 class BlinkRange {
   static final instance = new BlinkRange();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Range"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Range");
 
-  collapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "collapsed");
+  collapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Range */, "collapsed");
 
-  commonAncestorContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "commonAncestorContainer");
+  commonAncestorContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Range */, "commonAncestorContainer");
 
-  endContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endContainer");
+  endContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Range */, "endContainer");
 
-  endOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endOffset");
+  endOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Range */, "endOffset");
 
-  startContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startContainer");
+  startContainer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Range */, "startContainer");
 
-  startOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startOffset");
+  startOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Range */, "startOffset");
 
-  cloneContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneContents", []);
+  cloneContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "cloneContents", []);
 
-  cloneRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneRange", []);
+  cloneRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "cloneRange", []);
 
-  collapse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapse", []);
+  collapse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "collapse", []);
 
-  collapse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "collapse", [__arg_0]);
+  collapse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "collapse", [__arg_0]);
 
-  compareBoundaryPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compareBoundaryPoints", []);
+  compareBoundaryPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "compareBoundaryPoints", []);
 
-  compareBoundaryPoints_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compareBoundaryPoints", [__arg_0]);
+  compareBoundaryPoints_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "compareBoundaryPoints", [__arg_0]);
 
-  compareBoundaryPoints_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "compareBoundaryPoints", [__arg_0, __arg_1]);
+  compareBoundaryPoints_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "compareBoundaryPoints", [__arg_0, __arg_1]);
 
-  comparePoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "comparePoint", []);
+  comparePoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "comparePoint", []);
 
-  comparePoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "comparePoint", [__arg_0]);
+  comparePoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "comparePoint", [__arg_0]);
 
-  comparePoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "comparePoint", [__arg_0, __arg_1]);
+  comparePoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "comparePoint", [__arg_0, __arg_1]);
 
-  createContextualFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createContextualFragment", []);
+  createContextualFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "createContextualFragment", []);
 
-  createContextualFragment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createContextualFragment", [__arg_0]);
+  createContextualFragment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "createContextualFragment", [__arg_0]);
 
-  deleteContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteContents", []);
+  deleteContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "deleteContents", []);
 
-  detach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detach", []);
+  detach_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "detach", []);
 
-  expand_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "expand", []);
+  expand_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "expand", []);
 
-  expand_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "expand", [__arg_0]);
+  expand_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "expand", [__arg_0]);
 
-  extractContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "extractContents", []);
+  extractContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "extractContents", []);
 
-  getBoundingClientRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBoundingClientRect", []);
+  getBoundingClientRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "getBoundingClientRect", []);
 
-  getClientRects_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getClientRects", []);
+  getClientRects_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "getClientRects", []);
 
-  insertNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertNode", []);
+  insertNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "insertNode", []);
 
-  insertNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertNode", [__arg_0]);
+  insertNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "insertNode", [__arg_0]);
 
-  intersectsNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "intersectsNode", []);
+  intersectsNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "intersectsNode", []);
 
-  intersectsNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "intersectsNode", [__arg_0]);
+  intersectsNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "intersectsNode", [__arg_0]);
 
-  isPointInRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isPointInRange", []);
+  isPointInRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "isPointInRange", []);
 
-  isPointInRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isPointInRange", [__arg_0]);
+  isPointInRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "isPointInRange", [__arg_0]);
 
-  isPointInRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "isPointInRange", [__arg_0, __arg_1]);
+  isPointInRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "isPointInRange", [__arg_0, __arg_1]);
 
-  selectNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectNode", []);
+  selectNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "selectNode", []);
 
-  selectNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectNode", [__arg_0]);
+  selectNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "selectNode", [__arg_0]);
 
-  selectNodeContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectNodeContents", []);
+  selectNodeContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "selectNodeContents", []);
 
-  selectNodeContents_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectNodeContents", [__arg_0]);
+  selectNodeContents_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "selectNodeContents", [__arg_0]);
 
-  setEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", []);
+  setEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setEnd", []);
 
-  setEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", [__arg_0]);
+  setEnd_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setEnd", [__arg_0]);
 
-  setEnd_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setEnd", [__arg_0, __arg_1]);
+  setEnd_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setEnd", [__arg_0, __arg_1]);
 
-  setEndAfter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setEndAfter", []);
+  setEndAfter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setEndAfter", []);
 
-  setEndAfter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setEndAfter", [__arg_0]);
+  setEndAfter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setEndAfter", [__arg_0]);
 
-  setEndBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setEndBefore", []);
+  setEndBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setEndBefore", []);
 
-  setEndBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setEndBefore", [__arg_0]);
+  setEndBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setEndBefore", [__arg_0]);
 
-  setStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStart", []);
+  setStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setStart", []);
 
-  setStart_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStart", [__arg_0]);
+  setStart_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setStart", [__arg_0]);
 
-  setStart_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStart", [__arg_0, __arg_1]);
+  setStart_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setStart", [__arg_0, __arg_1]);
 
-  setStartAfter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStartAfter", []);
+  setStartAfter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setStartAfter", []);
 
-  setStartAfter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStartAfter", [__arg_0]);
+  setStartAfter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setStartAfter", [__arg_0]);
 
-  setStartBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStartBefore", []);
+  setStartBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setStartBefore", []);
 
-  setStartBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStartBefore", [__arg_0]);
+  setStartBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "setStartBefore", [__arg_0]);
 
-  surroundContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "surroundContents", []);
+  surroundContents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "surroundContents", []);
 
-  surroundContents_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "surroundContents", [__arg_0]);
+  surroundContents_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Range */, "surroundContents", [__arg_0]);
 
 }
 
 class BlinkReadableByteStream {
   static final instance = new BlinkReadableByteStream();
 
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableByteStream */, "cancel", []);
 
-  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
+  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ReadableByteStream */, "cancel", [__arg_0]);
 
-  getReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getReader", []);
+  getReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableByteStream */, "getReader", []);
 
 }
 
 class BlinkReadableByteStreamReader {
   static final instance = new BlinkReadableByteStreamReader();
 
-  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
+  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ReadableByteStreamReader */, "closed");
 
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableByteStreamReader */, "cancel", []);
 
-  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
+  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ReadableByteStreamReader */, "cancel", [__arg_0]);
 
-  read_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "read", []);
+  read_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableByteStreamReader */, "read", []);
 
-  releaseLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseLock", []);
+  releaseLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableByteStreamReader */, "releaseLock", []);
 
 }
 
 class BlinkReadableStream {
   static final instance = new BlinkReadableStream();
 
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableStream */, "cancel", []);
 
-  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
+  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ReadableStream */, "cancel", [__arg_0]);
 
-  getReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getReader", []);
+  getReader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableStream */, "getReader", []);
 
 }
 
 class BlinkReadableStreamReader {
   static final instance = new BlinkReadableStreamReader();
 
-  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
+  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ReadableStreamReader */, "closed");
 
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableStreamReader */, "cancel", []);
 
-  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancel", [__arg_0]);
+  cancel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ReadableStreamReader */, "cancel", [__arg_0]);
 
-  read_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "read", []);
+  read_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableStreamReader */, "read", []);
 
-  releaseLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseLock", []);
+  releaseLock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ReadableStreamReader */, "releaseLock", []);
 
 }
 
 class BlinkRelatedEvent extends BlinkEvent {
   static final instance = new BlinkRelatedEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RelatedEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("RelatedEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RelatedEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("RelatedEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "RelatedEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("RelatedEvent", [__arg_0, __arg_1]);
 
-  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "relatedTarget");
+  relatedTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* RelatedEvent */, "relatedTarget");
 
 }
 
 class BlinkRequest {
   static final instance = new BlinkRequest();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Request"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Request");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Request"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Request", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Request"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("Request", [__arg_0, __arg_1]);
 
-  context_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "context");
+  context_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Request */, "context");
 
-  credentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "credentials");
+  credentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Request */, "credentials");
 
-  headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "headers");
+  headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Request */, "headers");
 
-  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
+  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Request */, "mode");
 
-  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referrer");
+  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Request */, "referrer");
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Request */, "url");
 
-  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
+  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Request */, "clone", []);
 
 }
 
 class BlinkRequestAnimationFrameCallback {
   static final instance = new BlinkRequestAnimationFrameCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* RequestAnimationFrameCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* RequestAnimationFrameCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkResourceProgressEvent extends BlinkProgressEvent {
   static final instance = new BlinkResourceProgressEvent();
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ResourceProgressEvent */, "url");
 
 }
 
 class BlinkResponse {
   static final instance = new BlinkResponse();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Response"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Response");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Response"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Response", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Response"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("Response", [__arg_0, __arg_1]);
 
-  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "body");
+  body_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Response */, "body");
 
-  headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "headers");
+  headers_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Response */, "headers");
 
-  ok_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ok");
+  ok_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Response */, "ok");
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Response */, "status");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Response */, "type");
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Response */, "url");
 
-  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clone", []);
+  clone_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Response */, "clone", []);
 
-  error_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "error", []);
+  error_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response") /* Response */, "error", []);
 
-  redirect_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "redirect", []);
+  redirect_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response") /* Response */, "redirect", []);
 
-  redirect_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "redirect", [__arg_0]);
+  redirect_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response") /* Response */, "redirect", [__arg_0]);
 
-  redirect_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response"), "redirect", [__arg_0, __arg_1]);
+  redirect_Callback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "Response") /* Response */, "redirect", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSQLError {
   static final instance = new BlinkSQLError();
 
-  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "code");
+  code_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SQLError */, "code");
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SQLError */, "message");
 
 }
 
 class BlinkSQLResultSet {
   static final instance = new BlinkSQLResultSet();
 
-  insertId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "insertId");
+  insertId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SQLResultSet */, "insertId");
 
-  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rows");
+  rows_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SQLResultSet */, "rows");
 
-  rowsAffected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rowsAffected");
+  rowsAffected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SQLResultSet */, "rowsAffected");
 
 }
 
 class BlinkSQLResultSetRowList {
   static final instance = new BlinkSQLResultSetRowList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SQLResultSetRowList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SQLResultSetRowList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SQLResultSetRowList */, "item", [__arg_0]);
 
 }
 
 class BlinkSQLStatementCallback {
   static final instance = new BlinkSQLStatementCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SQLStatementCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SQLStatementCallback */, "handleEvent", [__arg_0]);
 
-  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SQLStatementCallback */, "handleEvent", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSQLStatementErrorCallback {
   static final instance = new BlinkSQLStatementErrorCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SQLStatementErrorCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SQLStatementErrorCallback */, "handleEvent", [__arg_0]);
 
-  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SQLStatementErrorCallback */, "handleEvent", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSQLTransaction {
   static final instance = new BlinkSQLTransaction();
 
-  executeSql_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "executeSql", []);
+  executeSql_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransaction */, "executeSql", []);
 
-  executeSql_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "executeSql", [__arg_0]);
+  executeSql_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransaction */, "executeSql", [__arg_0]);
 
-  executeSql_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "executeSql", [__arg_0, __arg_1]);
+  executeSql_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransaction */, "executeSql", [__arg_0, __arg_1]);
 
-  executeSql_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "executeSql", [__arg_0, __arg_1, __arg_2]);
+  executeSql_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransaction */, "executeSql", [__arg_0, __arg_1, __arg_2]);
 
-  executeSql_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "executeSql", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  executeSql_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransaction */, "executeSql", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkSQLTransactionCallback {
   static final instance = new BlinkSQLTransactionCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransactionCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransactionCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkSQLTransactionErrorCallback {
   static final instance = new BlinkSQLTransactionErrorCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransactionErrorCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SQLTransactionErrorCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkSVGAElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGAElement();
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAElement */, "target");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGAngle {
   static final instance = new BlinkSVGAngle();
 
-  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unitType");
+  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAngle */, "unitType");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAngle */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAngle */, "value", __arg_0);
 
-  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsString");
+  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAngle */, "valueAsString");
 
-  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
+  valueAsString_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAngle */, "valueAsString", __arg_0);
 
-  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueInSpecifiedUnits");
+  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAngle */, "valueInSpecifiedUnits");
 
-  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAngle */, "valueInSpecifiedUnits", __arg_0);
 
-  convertToSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", []);
+  convertToSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAngle */, "convertToSpecifiedUnits", []);
 
-  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", [__arg_0]);
+  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGAngle */, "convertToSpecifiedUnits", [__arg_0]);
 
-  newValueSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", []);
+  newValueSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAngle */, "newValueSpecifiedUnits", []);
 
-  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", [__arg_0]);
+  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGAngle */, "newValueSpecifiedUnits", [__arg_0]);
 
-  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", [__arg_0, __arg_1]);
+  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGAngle */, "newValueSpecifiedUnits", [__arg_0, __arg_1]);
 
 }
 
@@ -13107,223 +13107,223 @@
 class BlinkSVGAnimatedAngle {
   static final instance = new BlinkSVGAnimatedAngle();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedAngle */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedAngle */, "baseVal");
 
 }
 
 class BlinkSVGAnimatedBoolean {
   static final instance = new BlinkSVGAnimatedBoolean();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedBoolean */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedBoolean */, "baseVal");
 
-  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
+  baseVal_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimatedBoolean */, "baseVal", __arg_0);
 
 }
 
 class BlinkSVGAnimatedEnumeration {
   static final instance = new BlinkSVGAnimatedEnumeration();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedEnumeration */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedEnumeration */, "baseVal");
 
-  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
+  baseVal_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimatedEnumeration */, "baseVal", __arg_0);
 
 }
 
 class BlinkSVGAnimatedInteger {
   static final instance = new BlinkSVGAnimatedInteger();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedInteger */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedInteger */, "baseVal");
 
-  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
+  baseVal_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimatedInteger */, "baseVal", __arg_0);
 
 }
 
 class BlinkSVGAnimatedLength {
   static final instance = new BlinkSVGAnimatedLength();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedLength */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedLength */, "baseVal");
 
 }
 
 class BlinkSVGAnimatedLengthList {
   static final instance = new BlinkSVGAnimatedLengthList();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedLengthList */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedLengthList */, "baseVal");
 
 }
 
 class BlinkSVGAnimatedNumber {
   static final instance = new BlinkSVGAnimatedNumber();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedNumber */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedNumber */, "baseVal");
 
-  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
+  baseVal_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimatedNumber */, "baseVal", __arg_0);
 
 }
 
 class BlinkSVGAnimatedNumberList {
   static final instance = new BlinkSVGAnimatedNumberList();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedNumberList */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedNumberList */, "baseVal");
 
 }
 
 class BlinkSVGAnimatedPreserveAspectRatio {
   static final instance = new BlinkSVGAnimatedPreserveAspectRatio();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedPreserveAspectRatio */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedPreserveAspectRatio */, "baseVal");
 
 }
 
 class BlinkSVGAnimatedRect {
   static final instance = new BlinkSVGAnimatedRect();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedRect */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedRect */, "baseVal");
 
 }
 
 class BlinkSVGAnimatedString {
   static final instance = new BlinkSVGAnimatedString();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedString */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedString */, "baseVal");
 
-  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
+  baseVal_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimatedString */, "baseVal", __arg_0);
 
 }
 
 class BlinkSVGAnimatedTransformList {
   static final instance = new BlinkSVGAnimatedTransformList();
 
-  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animVal");
+  animVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedTransformList */, "animVal");
 
-  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseVal");
+  baseVal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimatedTransformList */, "baseVal");
 
 }
 
 class BlinkSVGAnimationElement extends BlinkSVGElement {
   static final instance = new BlinkSVGAnimationElement();
 
-  onbegin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbegin");
+  onbegin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimationElement */, "onbegin");
 
-  onbegin_Setter_(mthis, __arg_0) => mthis["onbegin"] = __arg_0;
+  onbegin_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimationElement */, "onbegin", __arg_0);
 
-  onend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onend");
+  onend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimationElement */, "onend");
 
-  onend_Setter_(mthis, __arg_0) => mthis["onend"] = __arg_0;
+  onend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimationElement */, "onend", __arg_0);
 
-  onrepeat_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrepeat");
+  onrepeat_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimationElement */, "onrepeat");
 
-  onrepeat_Setter_(mthis, __arg_0) => mthis["onrepeat"] = __arg_0;
+  onrepeat_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGAnimationElement */, "onrepeat", __arg_0);
 
-  targetElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetElement");
+  targetElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGAnimationElement */, "targetElement");
 
-  beginElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginElement", []);
+  beginElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "beginElement", []);
 
-  beginElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginElementAt", []);
+  beginElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "beginElementAt", []);
 
-  beginElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginElementAt", [__arg_0]);
+  beginElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "beginElementAt", [__arg_0]);
 
-  endElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endElement", []);
+  endElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "endElement", []);
 
-  endElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endElementAt", []);
+  endElementAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "endElementAt", []);
 
-  endElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endElementAt", [__arg_0]);
+  endElementAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "endElementAt", [__arg_0]);
 
-  getCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentTime", []);
+  getCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "getCurrentTime", []);
 
-  getSimpleDuration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSimpleDuration", []);
+  getSimpleDuration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "getSimpleDuration", []);
 
-  getStartTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStartTime", []);
+  getStartTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGAnimationElement */, "getStartTime", []);
 
-  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
+  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredExtensions");
 
-  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
+  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredFeatures");
 
-  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
+  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "systemLanguage");
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", []);
 
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", [__arg_0]);
 
 }
 
 class BlinkSVGCircleElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGCircleElement();
 
-  cx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cx");
+  cx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGCircleElement */, "cx");
 
-  cy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cy");
+  cy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGCircleElement */, "cy");
 
-  r_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "r");
+  r_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGCircleElement */, "r");
 
 }
 
 class BlinkSVGClipPathElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGClipPathElement();
 
-  clipPathUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clipPathUnits");
+  clipPathUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGClipPathElement */, "clipPathUnits");
 
 }
 
 class BlinkSVGComponentTransferFunctionElement extends BlinkSVGElement {
   static final instance = new BlinkSVGComponentTransferFunctionElement();
 
-  amplitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "amplitude");
+  amplitude_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGComponentTransferFunctionElement */, "amplitude");
 
-  exponent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "exponent");
+  exponent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGComponentTransferFunctionElement */, "exponent");
 
-  intercept_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "intercept");
+  intercept_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGComponentTransferFunctionElement */, "intercept");
 
-  offset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offset");
+  offset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGComponentTransferFunctionElement */, "offset");
 
-  slope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "slope");
+  slope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGComponentTransferFunctionElement */, "slope");
 
-  tableValues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tableValues");
+  tableValues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGComponentTransferFunctionElement */, "tableValues");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGComponentTransferFunctionElement */, "type");
 
 }
 
 class BlinkSVGCursorElement extends BlinkSVGElement {
   static final instance = new BlinkSVGCursorElement();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGCursorElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGCursorElement */, "y");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
-  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
+  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredExtensions");
 
-  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
+  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredFeatures");
 
-  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
+  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "systemLanguage");
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", []);
 
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", [__arg_0]);
 
 }
 
@@ -13345,542 +13345,542 @@
 class BlinkSVGElement extends BlinkElement {
   static final instance = new BlinkSVGElement();
 
-  className_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "className");
+  className_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGElement */, "className");
 
-  ownerSVGElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerSVGElement");
+  ownerSVGElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGElement */, "ownerSVGElement");
 
-  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "style");
+  style_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGElement */, "style");
 
-  tabIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tabIndex");
+  tabIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGElement */, "tabIndex");
 
-  tabIndex_Setter_(mthis, __arg_0) => mthis["tabIndex"] = __arg_0;
+  tabIndex_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGElement */, "tabIndex", __arg_0);
 
-  viewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewportElement");
+  viewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGElement */, "viewportElement");
 
-  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
+  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGElement */, "blur", []);
 
-  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGElement */, "focus", []);
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onabort", __arg_0);
 
-  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocomplete");
 
-  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+  onautocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocomplete", __arg_0);
 
-  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror");
 
-  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+  onautocompleteerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onblur", __arg_0);
 
-  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncancel");
 
-  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+  oncancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncancel", __arg_0);
 
-  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplay");
 
-  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+  oncanplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplay", __arg_0);
 
-  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough");
 
-  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+  oncanplaythrough_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onchange", __arg_0);
 
-  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclick");
 
-  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+  onclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclick", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclose", __arg_0);
 
-  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncontextmenu");
 
-  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+  oncontextmenu_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncontextmenu", __arg_0);
 
-  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncuechange");
 
-  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+  oncuechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncuechange", __arg_0);
 
-  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondblclick");
 
-  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+  ondblclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondblclick", __arg_0);
 
-  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrag");
 
-  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+  ondrag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrag", __arg_0);
 
-  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragend");
 
-  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+  ondragend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragend", __arg_0);
 
-  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragenter");
 
-  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+  ondragenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragenter", __arg_0);
 
-  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragleave");
 
-  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+  ondragleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragleave", __arg_0);
 
-  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragover");
 
-  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+  ondragover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragover", __arg_0);
 
-  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragstart");
 
-  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+  ondragstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragstart", __arg_0);
 
-  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrop");
 
-  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+  ondrop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrop", __arg_0);
 
-  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondurationchange");
 
-  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+  ondurationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondurationchange", __arg_0);
 
-  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onemptied");
 
-  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+  onemptied_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onemptied", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onended", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onfocus", __arg_0);
 
-  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninput");
 
-  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+  oninput_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninput", __arg_0);
 
-  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninvalid");
 
-  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+  oninvalid_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninvalid", __arg_0);
 
-  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeydown");
 
-  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+  onkeydown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeydown", __arg_0);
 
-  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeypress");
 
-  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+  onkeypress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeypress", __arg_0);
 
-  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeyup");
 
-  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+  onkeyup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeyup", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onload", __arg_0);
 
-  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadeddata");
 
-  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+  onloadeddata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadeddata", __arg_0);
 
-  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata");
 
-  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+  onloadedmetadata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadstart", __arg_0);
 
-  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousedown");
 
-  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+  onmousedown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousedown", __arg_0);
 
-  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseenter");
 
-  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+  onmouseenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseenter", __arg_0);
 
-  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseleave");
 
-  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+  onmouseleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseleave", __arg_0);
 
-  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousemove");
 
-  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+  onmousemove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousemove", __arg_0);
 
-  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseout");
 
-  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+  onmouseout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseout", __arg_0);
 
-  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseover");
 
-  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+  onmouseover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseover", __arg_0);
 
-  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseup");
 
-  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+  onmouseup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseup", __arg_0);
 
-  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousewheel");
 
-  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+  onmousewheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousewheel", __arg_0);
 
-  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpause");
 
-  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+  onpause_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpause", __arg_0);
 
-  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplay");
 
-  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+  onplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplay", __arg_0);
 
-  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplaying");
 
-  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+  onplaying_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplaying", __arg_0);
 
-  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointercancel");
 
-  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointercancel", __arg_0);
 
-  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerdown");
 
-  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+  onpointerdown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerdown", __arg_0);
 
-  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerenter");
 
-  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+  onpointerenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerenter", __arg_0);
 
-  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerleave");
 
-  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+  onpointerleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerleave", __arg_0);
 
-  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointermove");
 
-  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+  onpointermove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointermove", __arg_0);
 
-  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerout");
 
-  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+  onpointerout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerout", __arg_0);
 
-  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerover");
 
-  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+  onpointerover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerover", __arg_0);
 
-  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerup");
 
-  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+  onpointerup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerup", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onprogress", __arg_0);
 
-  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onratechange");
 
-  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+  onratechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onratechange", __arg_0);
 
-  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onreset");
 
-  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+  onreset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onreset", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onscroll", __arg_0);
 
-  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeked");
 
-  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+  onseeked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeked", __arg_0);
 
-  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeking");
 
-  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+  onseeking_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeking", __arg_0);
 
-  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onselect");
 
-  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+  onselect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onselect", __arg_0);
 
-  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onshow");
 
-  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+  onshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onshow", __arg_0);
 
-  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onstalled");
 
-  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+  onstalled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onstalled", __arg_0);
 
-  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsubmit");
 
-  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+  onsubmit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsubmit", __arg_0);
 
-  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsuspend");
 
-  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+  onsuspend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsuspend", __arg_0);
 
-  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontimeupdate");
 
-  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+  ontimeupdate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontimeupdate", __arg_0);
 
-  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontoggle");
 
-  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+  ontoggle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontoggle", __arg_0);
 
-  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onvolumechange");
 
-  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+  onvolumechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onvolumechange", __arg_0);
 
-  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onwaiting");
 
-  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+  onwaiting_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onwaiting", __arg_0);
 
 }
 
 class BlinkSVGEllipseElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGEllipseElement();
 
-  cx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cx");
+  cx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGEllipseElement */, "cx");
 
-  cy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cy");
+  cy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGEllipseElement */, "cy");
 
-  rx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rx");
+  rx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGEllipseElement */, "rx");
 
-  ry_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ry");
+  ry_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGEllipseElement */, "ry");
 
 }
 
 class BlinkSVGFEBlendElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEBlendElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEBlendElement */, "in1");
 
-  in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in2");
+  in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEBlendElement */, "in2");
 
-  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
+  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEBlendElement */, "mode");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEColorMatrixElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEColorMatrixElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEColorMatrixElement */, "in1");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEColorMatrixElement */, "type");
 
-  values_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "values");
+  values_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEColorMatrixElement */, "values");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEComponentTransferElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEComponentTransferElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEComponentTransferElement */, "in1");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFECompositeElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFECompositeElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFECompositeElement */, "in1");
 
-  in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in2");
+  in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFECompositeElement */, "in2");
 
-  k1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "k1");
+  k1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFECompositeElement */, "k1");
 
-  k2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "k2");
+  k2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFECompositeElement */, "k2");
 
-  k3_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "k3");
+  k3_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFECompositeElement */, "k3");
 
-  k4_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "k4");
+  k4_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFECompositeElement */, "k4");
 
-  operator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "operator");
+  operator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFECompositeElement */, "operator");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEConvolveMatrixElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEConvolveMatrixElement();
 
-  bias_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bias");
+  bias_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "bias");
 
-  divisor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "divisor");
+  divisor_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "divisor");
 
-  edgeMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "edgeMode");
+  edgeMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "edgeMode");
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "in1");
 
-  kernelMatrix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelMatrix");
+  kernelMatrix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "kernelMatrix");
 
-  kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthX");
+  kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "kernelUnitLengthX");
 
-  kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthY");
+  kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "kernelUnitLengthY");
 
-  orderX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orderX");
+  orderX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "orderX");
 
-  orderY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orderY");
+  orderY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "orderY");
 
-  preserveAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAlpha");
+  preserveAlpha_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "preserveAlpha");
 
-  targetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetX");
+  targetX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "targetX");
 
-  targetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetY");
+  targetY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEConvolveMatrixElement */, "targetY");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEDiffuseLightingElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDiffuseLightingElement();
 
-  diffuseConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "diffuseConstant");
+  diffuseConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDiffuseLightingElement */, "diffuseConstant");
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDiffuseLightingElement */, "in1");
 
-  kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthX");
+  kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDiffuseLightingElement */, "kernelUnitLengthX");
 
-  kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthY");
+  kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDiffuseLightingElement */, "kernelUnitLengthY");
 
-  surfaceScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "surfaceScale");
+  surfaceScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDiffuseLightingElement */, "surfaceScale");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEDisplacementMapElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDisplacementMapElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDisplacementMapElement */, "in1");
 
-  in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in2");
+  in2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDisplacementMapElement */, "in2");
 
-  scale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scale");
+  scale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDisplacementMapElement */, "scale");
 
-  xChannelSelector_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "xChannelSelector");
+  xChannelSelector_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDisplacementMapElement */, "xChannelSelector");
 
-  yChannelSelector_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "yChannelSelector");
+  yChannelSelector_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDisplacementMapElement */, "yChannelSelector");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEDistantLightElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDistantLightElement();
 
-  azimuth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "azimuth");
+  azimuth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDistantLightElement */, "azimuth");
 
-  elevation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elevation");
+  elevation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDistantLightElement */, "elevation");
 
 }
 
 class BlinkSVGFEDropShadowElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDropShadowElement();
 
-  dx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dx");
+  dx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDropShadowElement */, "dx");
 
-  dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dy");
+  dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDropShadowElement */, "dy");
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDropShadowElement */, "in1");
 
-  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationX");
+  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDropShadowElement */, "stdDeviationX");
 
-  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationY");
+  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEDropShadowElement */, "stdDeviationY");
 
-  setStdDeviation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", []);
+  setStdDeviation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGFEDropShadowElement */, "setStdDeviation", []);
 
-  setStdDeviation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", [__arg_0]);
+  setStdDeviation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGFEDropShadowElement */, "setStdDeviation", [__arg_0]);
 
-  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", [__arg_0, __arg_1]);
+  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGFEDropShadowElement */, "setStdDeviation", [__arg_0, __arg_1]);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEFloodElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEFloodElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
@@ -13907,271 +13907,271 @@
 class BlinkSVGFEGaussianBlurElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEGaussianBlurElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEGaussianBlurElement */, "in1");
 
-  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationX");
+  stdDeviationX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEGaussianBlurElement */, "stdDeviationX");
 
-  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stdDeviationY");
+  stdDeviationY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEGaussianBlurElement */, "stdDeviationY");
 
-  setStdDeviation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", []);
+  setStdDeviation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGFEGaussianBlurElement */, "setStdDeviation", []);
 
-  setStdDeviation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", [__arg_0]);
+  setStdDeviation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGFEGaussianBlurElement */, "setStdDeviation", [__arg_0]);
 
-  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setStdDeviation", [__arg_0, __arg_1]);
+  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGFEGaussianBlurElement */, "setStdDeviation", [__arg_0, __arg_1]);
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEImageElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEImageElement();
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEImageElement */, "preserveAspectRatio");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGFEMergeElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEMergeElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEMergeNodeElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEMergeNodeElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEMergeNodeElement */, "in1");
 
 }
 
 class BlinkSVGFEMorphologyElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEMorphologyElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEMorphologyElement */, "in1");
 
-  operator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "operator");
+  operator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEMorphologyElement */, "operator");
 
-  radiusX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiusX");
+  radiusX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEMorphologyElement */, "radiusX");
 
-  radiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiusY");
+  radiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEMorphologyElement */, "radiusY");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEOffsetElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEOffsetElement();
 
-  dx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dx");
+  dx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEOffsetElement */, "dx");
 
-  dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dy");
+  dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEOffsetElement */, "dy");
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEOffsetElement */, "in1");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFEPointLightElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEPointLightElement();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEPointLightElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEPointLightElement */, "y");
 
-  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "z");
+  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFEPointLightElement */, "z");
 
 }
 
 class BlinkSVGFESpecularLightingElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFESpecularLightingElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpecularLightingElement */, "in1");
 
-  kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthX");
+  kernelUnitLengthX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpecularLightingElement */, "kernelUnitLengthX");
 
-  kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kernelUnitLengthY");
+  kernelUnitLengthY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpecularLightingElement */, "kernelUnitLengthY");
 
-  specularConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "specularConstant");
+  specularConstant_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpecularLightingElement */, "specularConstant");
 
-  specularExponent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "specularExponent");
+  specularExponent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpecularLightingElement */, "specularExponent");
 
-  surfaceScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "surfaceScale");
+  surfaceScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpecularLightingElement */, "surfaceScale");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFESpotLightElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFESpotLightElement();
 
-  limitingConeAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "limitingConeAngle");
+  limitingConeAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "limitingConeAngle");
 
-  pointsAtX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointsAtX");
+  pointsAtX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "pointsAtX");
 
-  pointsAtY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointsAtY");
+  pointsAtY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "pointsAtY");
 
-  pointsAtZ_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pointsAtZ");
+  pointsAtZ_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "pointsAtZ");
 
-  specularExponent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "specularExponent");
+  specularExponent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "specularExponent");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "y");
 
-  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "z");
+  z_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFESpotLightElement */, "z");
 
 }
 
 class BlinkSVGFETileElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFETileElement();
 
-  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "in1");
+  in1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFETileElement */, "in1");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFETurbulenceElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFETurbulenceElement();
 
-  baseFrequencyX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseFrequencyX");
+  baseFrequencyX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFETurbulenceElement */, "baseFrequencyX");
 
-  baseFrequencyY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseFrequencyY");
+  baseFrequencyY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFETurbulenceElement */, "baseFrequencyY");
 
-  numOctaves_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numOctaves");
+  numOctaves_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFETurbulenceElement */, "numOctaves");
 
-  seed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "seed");
+  seed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFETurbulenceElement */, "seed");
 
-  stitchTiles_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stitchTiles");
+  stitchTiles_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFETurbulenceElement */, "stitchTiles");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFETurbulenceElement */, "type");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFilterElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFilterElement();
 
-  filterUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filterUnits");
+  filterUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterElement */, "filterUnits");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterElement */, "height");
 
-  primitiveUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "primitiveUnits");
+  primitiveUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterElement */, "primitiveUnits");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterElement */, "y");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGFilterPrimitiveStandardAttributes {
   static final instance = new BlinkSVGFilterPrimitiveStandardAttributes();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "height");
 
-  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "result");
+  result_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "result");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFilterPrimitiveStandardAttributes */, "y");
 
 }
 
 class BlinkSVGFitToViewBox {
   static final instance = new BlinkSVGFitToViewBox();
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "preserveAspectRatio");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "viewBox");
 
 }
 
 class BlinkSVGForeignObjectElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGForeignObjectElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGForeignObjectElement */, "height");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGForeignObjectElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGForeignObjectElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGForeignObjectElement */, "y");
 
 }
 
@@ -14183,306 +14183,306 @@
 class BlinkSVGGeometryElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGGeometryElement();
 
-  isPointInFill_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isPointInFill", []);
+  isPointInFill_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGGeometryElement */, "isPointInFill", []);
 
-  isPointInFill_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isPointInFill", [__arg_0]);
+  isPointInFill_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGGeometryElement */, "isPointInFill", [__arg_0]);
 
-  isPointInStroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isPointInStroke", []);
+  isPointInStroke_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGGeometryElement */, "isPointInStroke", []);
 
-  isPointInStroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isPointInStroke", [__arg_0]);
+  isPointInStroke_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGGeometryElement */, "isPointInStroke", [__arg_0]);
 
 }
 
 class BlinkSVGGradientElement extends BlinkSVGElement {
   static final instance = new BlinkSVGGradientElement();
 
-  gradientTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gradientTransform");
+  gradientTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGGradientElement */, "gradientTransform");
 
-  gradientUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "gradientUnits");
+  gradientUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGGradientElement */, "gradientUnits");
 
-  spreadMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "spreadMethod");
+  spreadMethod_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGGradientElement */, "spreadMethod");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGGraphicsElement extends BlinkSVGElement {
   static final instance = new BlinkSVGGraphicsElement();
 
-  farthestViewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "farthestViewportElement");
+  farthestViewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGGraphicsElement */, "farthestViewportElement");
 
-  nearestViewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "nearestViewportElement");
+  nearestViewportElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGGraphicsElement */, "nearestViewportElement");
 
-  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
+  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGGraphicsElement */, "transform");
 
-  getBBox_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBBox", []);
+  getBBox_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGGraphicsElement */, "getBBox", []);
 
-  getCTM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCTM", []);
+  getCTM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGGraphicsElement */, "getCTM", []);
 
-  getScreenCTM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getScreenCTM", []);
+  getScreenCTM_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGGraphicsElement */, "getScreenCTM", []);
 
-  getTransformToElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTransformToElement", []);
+  getTransformToElement_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGGraphicsElement */, "getTransformToElement", []);
 
-  getTransformToElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTransformToElement", [__arg_0]);
+  getTransformToElement_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGGraphicsElement */, "getTransformToElement", [__arg_0]);
 
-  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
+  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredExtensions");
 
-  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
+  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredFeatures");
 
-  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
+  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "systemLanguage");
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", []);
 
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", [__arg_0]);
 
 }
 
 class BlinkSVGImageElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGImageElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGImageElement */, "height");
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGImageElement */, "preserveAspectRatio");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGImageElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGImageElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGImageElement */, "y");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGLength {
   static final instance = new BlinkSVGLength();
 
-  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "unitType");
+  unitType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLength */, "unitType");
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLength */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGLength */, "value", __arg_0);
 
-  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueAsString");
+  valueAsString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLength */, "valueAsString");
 
-  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
+  valueAsString_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGLength */, "valueAsString", __arg_0);
 
-  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueInSpecifiedUnits");
+  valueInSpecifiedUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLength */, "valueInSpecifiedUnits");
 
-  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGLength */, "valueInSpecifiedUnits", __arg_0);
 
-  convertToSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", []);
+  convertToSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLength */, "convertToSpecifiedUnits", []);
 
-  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "convertToSpecifiedUnits", [__arg_0]);
+  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLength */, "convertToSpecifiedUnits", [__arg_0]);
 
-  newValueSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", []);
+  newValueSpecifiedUnits_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLength */, "newValueSpecifiedUnits", []);
 
-  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", [__arg_0]);
+  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLength */, "newValueSpecifiedUnits", [__arg_0]);
 
-  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "newValueSpecifiedUnits", [__arg_0, __arg_1]);
+  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGLength */, "newValueSpecifiedUnits", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGLengthList {
   static final instance = new BlinkSVGLengthList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLengthList */, "length");
 
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLengthList */, "numberOfItems");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "__setter__", [__arg_0, __arg_1]);
 
-  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", []);
+  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "appendItem", []);
 
-  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", [__arg_0]);
+  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "appendItem", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "clear", []);
 
-  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getItem", []);
+  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "getItem", []);
 
-  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getItem", [__arg_0]);
+  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "getItem", [__arg_0]);
 
-  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initialize", []);
+  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "initialize", []);
 
-  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initialize", [__arg_0]);
+  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "initialize", [__arg_0]);
 
-  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", []);
+  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "insertItemBefore", []);
 
-  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0]);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "insertItemBefore", [__arg_0]);
 
-  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "insertItemBefore", [__arg_0, __arg_1]);
 
-  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
+  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "removeItem", []);
 
-  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
+  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "removeItem", [__arg_0]);
 
-  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", []);
+  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "replaceItem", []);
 
-  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0]);
+  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "replaceItem", [__arg_0]);
 
-  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0, __arg_1]);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGLengthList */, "replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGLineElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGLineElement();
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLineElement */, "x1");
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLineElement */, "x2");
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLineElement */, "y1");
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLineElement */, "y2");
 
 }
 
 class BlinkSVGLinearGradientElement extends BlinkSVGGradientElement {
   static final instance = new BlinkSVGLinearGradientElement();
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLinearGradientElement */, "x1");
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLinearGradientElement */, "x2");
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLinearGradientElement */, "y1");
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGLinearGradientElement */, "y2");
 
 }
 
 class BlinkSVGMPathElement extends BlinkSVGElement {
   static final instance = new BlinkSVGMPathElement();
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGMarkerElement extends BlinkSVGElement {
   static final instance = new BlinkSVGMarkerElement();
 
-  markerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "markerHeight");
+  markerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMarkerElement */, "markerHeight");
 
-  markerUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "markerUnits");
+  markerUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMarkerElement */, "markerUnits");
 
-  markerWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "markerWidth");
+  markerWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMarkerElement */, "markerWidth");
 
-  orientAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientAngle");
+  orientAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMarkerElement */, "orientAngle");
 
-  orientType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientType");
+  orientType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMarkerElement */, "orientType");
 
-  refX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "refX");
+  refX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMarkerElement */, "refX");
 
-  refY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "refY");
+  refY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMarkerElement */, "refY");
 
-  setOrientToAngle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setOrientToAngle", []);
+  setOrientToAngle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMarkerElement */, "setOrientToAngle", []);
 
-  setOrientToAngle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setOrientToAngle", [__arg_0]);
+  setOrientToAngle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMarkerElement */, "setOrientToAngle", [__arg_0]);
 
-  setOrientToAuto_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setOrientToAuto", []);
+  setOrientToAuto_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMarkerElement */, "setOrientToAuto", []);
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "preserveAspectRatio");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "viewBox");
 
 }
 
 class BlinkSVGMaskElement extends BlinkSVGElement {
   static final instance = new BlinkSVGMaskElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMaskElement */, "height");
 
-  maskContentUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maskContentUnits");
+  maskContentUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMaskElement */, "maskContentUnits");
 
-  maskUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maskUnits");
+  maskUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMaskElement */, "maskUnits");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMaskElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMaskElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMaskElement */, "y");
 
-  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
+  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredExtensions");
 
-  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
+  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredFeatures");
 
-  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
+  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "systemLanguage");
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", []);
 
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", [__arg_0]);
 
 }
 
 class BlinkSVGMatrix {
   static final instance = new BlinkSVGMatrix();
 
-  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "a");
+  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMatrix */, "a");
 
-  a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
+  a_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGMatrix */, "a", __arg_0);
 
-  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "b");
+  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMatrix */, "b");
 
-  b_Setter_(mthis, __arg_0) => mthis["b"] = __arg_0;
+  b_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGMatrix */, "b", __arg_0);
 
-  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "c");
+  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMatrix */, "c");
 
-  c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
+  c_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGMatrix */, "c", __arg_0);
 
-  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "d");
+  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMatrix */, "d");
 
-  d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
+  d_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGMatrix */, "d", __arg_0);
 
-  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "e");
+  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMatrix */, "e");
 
-  e_Setter_(mthis, __arg_0) => mthis["e"] = __arg_0;
+  e_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGMatrix */, "e", __arg_0);
 
-  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "f");
+  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGMatrix */, "f");
 
-  f_Setter_(mthis, __arg_0) => mthis["f"] = __arg_0;
+  f_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGMatrix */, "f", __arg_0);
 
-  flipX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flipX", []);
+  flipX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "flipX", []);
 
-  flipY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flipY", []);
+  flipY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "flipY", []);
 
-  inverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "inverse", []);
+  inverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "inverse", []);
 
-  multiply_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "multiply", []);
+  multiply_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "multiply", []);
 
-  multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "multiply", [__arg_0]);
+  multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "multiply", [__arg_0]);
 
-  rotate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotate", []);
+  rotate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "rotate", []);
 
-  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0]);
+  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "rotate", [__arg_0]);
 
-  rotateFromVector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "rotateFromVector", []);
+  rotateFromVector_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "rotateFromVector", []);
 
-  rotateFromVector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotateFromVector", [__arg_0]);
+  rotateFromVector_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "rotateFromVector", [__arg_0]);
 
-  rotateFromVector_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rotateFromVector", [__arg_0, __arg_1]);
+  rotateFromVector_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "rotateFromVector", [__arg_0, __arg_1]);
 
-  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scale", []);
+  scale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "scale", []);
 
-  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
+  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "scale", [__arg_0]);
 
-  scaleNonUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", []);
+  scaleNonUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "scaleNonUniform", []);
 
-  scaleNonUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0]);
+  scaleNonUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "scaleNonUniform", [__arg_0]);
 
-  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scaleNonUniform", [__arg_0, __arg_1]);
+  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "scaleNonUniform", [__arg_0, __arg_1]);
 
-  skewX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "skewX", []);
+  skewX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "skewX", []);
 
-  skewX_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "skewX", [__arg_0]);
+  skewX_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "skewX", [__arg_0]);
 
-  skewY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "skewY", []);
+  skewY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "skewY", []);
 
-  skewY_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "skewY", [__arg_0]);
+  skewY_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "skewY", [__arg_0]);
 
-  translate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "translate", []);
+  translate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "translate", []);
 
-  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0]);
+  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "translate", [__arg_0]);
 
-  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1]);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGMatrix */, "translate", [__arg_0, __arg_1]);
 
 }
 
@@ -14494,252 +14494,252 @@
 class BlinkSVGNumber {
   static final instance = new BlinkSVGNumber();
 
-  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "value");
+  value_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGNumber */, "value");
 
-  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
+  value_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGNumber */, "value", __arg_0);
 
 }
 
 class BlinkSVGNumberList {
   static final instance = new BlinkSVGNumberList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGNumberList */, "length");
 
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGNumberList */, "numberOfItems");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "__setter__", [__arg_0, __arg_1]);
 
-  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", []);
+  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "appendItem", []);
 
-  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", [__arg_0]);
+  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "appendItem", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "clear", []);
 
-  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getItem", []);
+  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "getItem", []);
 
-  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getItem", [__arg_0]);
+  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "getItem", [__arg_0]);
 
-  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initialize", []);
+  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "initialize", []);
 
-  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initialize", [__arg_0]);
+  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "initialize", [__arg_0]);
 
-  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", []);
+  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "insertItemBefore", []);
 
-  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0]);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "insertItemBefore", [__arg_0]);
 
-  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "insertItemBefore", [__arg_0, __arg_1]);
 
-  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
+  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "removeItem", []);
 
-  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
+  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "removeItem", [__arg_0]);
 
-  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", []);
+  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "replaceItem", []);
 
-  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0]);
+  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "replaceItem", [__arg_0]);
 
-  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0, __arg_1]);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGNumberList */, "replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGPathElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGPathElement();
 
-  animatedNormalizedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animatedNormalizedPathSegList");
+  animatedNormalizedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathElement */, "animatedNormalizedPathSegList");
 
-  animatedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animatedPathSegList");
+  animatedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathElement */, "animatedPathSegList");
 
-  normalizedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "normalizedPathSegList");
+  normalizedPathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathElement */, "normalizedPathSegList");
 
-  pathLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathLength");
+  pathLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathElement */, "pathLength");
 
-  pathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegList");
+  pathSegList_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathElement */, "pathSegList");
 
-  createSVGPathSegArcAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  createSVGPathSegArcAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  createSVGPathSegArcAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  createSVGPathSegArcAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  createSVGPathSegArcAbs_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  createSVGPathSegArcAbs_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegArcAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  createSVGPathSegArcRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  createSVGPathSegArcRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  createSVGPathSegArcRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  createSVGPathSegArcRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  createSVGPathSegArcRel_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  createSVGPathSegArcRel_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  createSVGPathSegClosePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegClosePath", []);
+  createSVGPathSegClosePath_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegClosePath", []);
 
-  createSVGPathSegCurvetoCubicAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createSVGPathSegCurvetoCubicAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createSVGPathSegCurvetoCubicAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  createSVGPathSegCurvetoCubicAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  createSVGPathSegCurvetoCubicAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  createSVGPathSegCurvetoCubicAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  createSVGPathSegCurvetoCubicRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createSVGPathSegCurvetoCubicRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createSVGPathSegCurvetoCubicRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  createSVGPathSegCurvetoCubicRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  createSVGPathSegCurvetoCubicRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  createSVGPathSegCurvetoCubicRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  createSVGPathSegCurvetoCubicSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1]);
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1]);
 
-  createSVGPathSegCurvetoCubicSmoothAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1, __arg_2]);
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1, __arg_2]);
 
-  createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createSVGPathSegCurvetoCubicSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1]);
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1]);
 
-  createSVGPathSegCurvetoCubicSmoothRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1, __arg_2]);
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1, __arg_2]);
 
-  createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createSVGPathSegCurvetoQuadraticAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1]);
+  createSVGPathSegCurvetoQuadraticAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1]);
 
-  createSVGPathSegCurvetoQuadraticAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1, __arg_2]);
+  createSVGPathSegCurvetoQuadraticAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1, __arg_2]);
 
-  createSVGPathSegCurvetoQuadraticAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createSVGPathSegCurvetoQuadraticAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createSVGPathSegCurvetoQuadraticRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1]);
+  createSVGPathSegCurvetoQuadraticRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1]);
 
-  createSVGPathSegCurvetoQuadraticRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1, __arg_2]);
+  createSVGPathSegCurvetoQuadraticRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1, __arg_2]);
 
-  createSVGPathSegCurvetoQuadraticRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createSVGPathSegCurvetoQuadraticRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticSmoothAbs", []);
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticSmoothAbs", []);
 
-  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticSmoothAbs", [__arg_0]);
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticSmoothAbs", [__arg_0]);
 
-  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticSmoothAbs", [__arg_0, __arg_1]);
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticSmoothAbs", [__arg_0, __arg_1]);
 
-  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticSmoothRel", []);
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticSmoothRel", []);
 
-  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticSmoothRel", [__arg_0]);
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticSmoothRel", [__arg_0]);
 
-  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegCurvetoQuadraticSmoothRel", [__arg_0, __arg_1]);
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegCurvetoQuadraticSmoothRel", [__arg_0, __arg_1]);
 
-  createSVGPathSegLinetoAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoAbs", []);
+  createSVGPathSegLinetoAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoAbs", []);
 
-  createSVGPathSegLinetoAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoAbs", [__arg_0]);
+  createSVGPathSegLinetoAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoAbs", [__arg_0]);
 
-  createSVGPathSegLinetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoAbs", [__arg_0, __arg_1]);
+  createSVGPathSegLinetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoAbs", [__arg_0, __arg_1]);
 
-  createSVGPathSegLinetoHorizontalAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoHorizontalAbs", []);
+  createSVGPathSegLinetoHorizontalAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoHorizontalAbs", []);
 
-  createSVGPathSegLinetoHorizontalAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoHorizontalAbs", [__arg_0]);
+  createSVGPathSegLinetoHorizontalAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoHorizontalAbs", [__arg_0]);
 
-  createSVGPathSegLinetoHorizontalRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoHorizontalRel", []);
+  createSVGPathSegLinetoHorizontalRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoHorizontalRel", []);
 
-  createSVGPathSegLinetoHorizontalRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoHorizontalRel", [__arg_0]);
+  createSVGPathSegLinetoHorizontalRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoHorizontalRel", [__arg_0]);
 
-  createSVGPathSegLinetoRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoRel", []);
+  createSVGPathSegLinetoRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoRel", []);
 
-  createSVGPathSegLinetoRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoRel", [__arg_0]);
+  createSVGPathSegLinetoRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoRel", [__arg_0]);
 
-  createSVGPathSegLinetoRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoRel", [__arg_0, __arg_1]);
+  createSVGPathSegLinetoRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoRel", [__arg_0, __arg_1]);
 
-  createSVGPathSegLinetoVerticalAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoVerticalAbs", []);
+  createSVGPathSegLinetoVerticalAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoVerticalAbs", []);
 
-  createSVGPathSegLinetoVerticalAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoVerticalAbs", [__arg_0]);
+  createSVGPathSegLinetoVerticalAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoVerticalAbs", [__arg_0]);
 
-  createSVGPathSegLinetoVerticalRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoVerticalRel", []);
+  createSVGPathSegLinetoVerticalRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoVerticalRel", []);
 
-  createSVGPathSegLinetoVerticalRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegLinetoVerticalRel", [__arg_0]);
+  createSVGPathSegLinetoVerticalRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegLinetoVerticalRel", [__arg_0]);
 
-  createSVGPathSegMovetoAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegMovetoAbs", []);
+  createSVGPathSegMovetoAbs_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegMovetoAbs", []);
 
-  createSVGPathSegMovetoAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegMovetoAbs", [__arg_0]);
+  createSVGPathSegMovetoAbs_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegMovetoAbs", [__arg_0]);
 
-  createSVGPathSegMovetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegMovetoAbs", [__arg_0, __arg_1]);
+  createSVGPathSegMovetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegMovetoAbs", [__arg_0, __arg_1]);
 
-  createSVGPathSegMovetoRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegMovetoRel", []);
+  createSVGPathSegMovetoRel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegMovetoRel", []);
 
-  createSVGPathSegMovetoRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegMovetoRel", [__arg_0]);
+  createSVGPathSegMovetoRel_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegMovetoRel", [__arg_0]);
 
-  createSVGPathSegMovetoRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPathSegMovetoRel", [__arg_0, __arg_1]);
+  createSVGPathSegMovetoRel_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "createSVGPathSegMovetoRel", [__arg_0, __arg_1]);
 
-  getPathSegAtLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getPathSegAtLength", []);
+  getPathSegAtLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "getPathSegAtLength", []);
 
-  getPathSegAtLength_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getPathSegAtLength", [__arg_0]);
+  getPathSegAtLength_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "getPathSegAtLength", [__arg_0]);
 
-  getPointAtLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getPointAtLength", []);
+  getPointAtLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "getPointAtLength", []);
 
-  getPointAtLength_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getPointAtLength", [__arg_0]);
+  getPointAtLength_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "getPointAtLength", [__arg_0]);
 
-  getTotalLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTotalLength", []);
+  getTotalLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathElement */, "getTotalLength", []);
 
 }
 
 class BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSeg();
 
-  pathSegType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegType");
+  pathSegType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSeg */, "pathSegType");
 
-  pathSegTypeAsLetter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathSegTypeAsLetter");
+  pathSegTypeAsLetter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSeg */, "pathSegTypeAsLetter");
 
 }
 
 class BlinkSVGPathSegArcAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegArcAbs();
 
-  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angle");
+  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcAbs */, "angle");
 
-  angle_Setter_(mthis, __arg_0) => mthis["angle"] = __arg_0;
+  angle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcAbs */, "angle", __arg_0);
 
-  largeArcFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "largeArcFlag");
+  largeArcFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcAbs */, "largeArcFlag");
 
-  largeArcFlag_Setter_(mthis, __arg_0) => mthis["largeArcFlag"] = __arg_0;
+  largeArcFlag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcAbs */, "largeArcFlag", __arg_0);
 
-  r1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "r1");
+  r1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcAbs */, "r1");
 
-  r1_Setter_(mthis, __arg_0) => mthis["r1"] = __arg_0;
+  r1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcAbs */, "r1", __arg_0);
 
-  r2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "r2");
+  r2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcAbs */, "r2");
 
-  r2_Setter_(mthis, __arg_0) => mthis["r2"] = __arg_0;
+  r2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcAbs */, "r2", __arg_0);
 
-  sweepFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sweepFlag");
+  sweepFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcAbs */, "sweepFlag");
 
-  sweepFlag_Setter_(mthis, __arg_0) => mthis["sweepFlag"] = __arg_0;
+  sweepFlag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcAbs */, "sweepFlag", __arg_0);
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcAbs */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcAbs */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegArcRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegArcRel();
 
-  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angle");
+  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcRel */, "angle");
 
-  angle_Setter_(mthis, __arg_0) => mthis["angle"] = __arg_0;
+  angle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcRel */, "angle", __arg_0);
 
-  largeArcFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "largeArcFlag");
+  largeArcFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcRel */, "largeArcFlag");
 
-  largeArcFlag_Setter_(mthis, __arg_0) => mthis["largeArcFlag"] = __arg_0;
+  largeArcFlag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcRel */, "largeArcFlag", __arg_0);
 
-  r1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "r1");
+  r1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcRel */, "r1");
 
-  r1_Setter_(mthis, __arg_0) => mthis["r1"] = __arg_0;
+  r1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcRel */, "r1", __arg_0);
 
-  r2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "r2");
+  r2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcRel */, "r2");
 
-  r2_Setter_(mthis, __arg_0) => mthis["r2"] = __arg_0;
+  r2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcRel */, "r2", __arg_0);
 
-  sweepFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sweepFlag");
+  sweepFlag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcRel */, "sweepFlag");
 
-  sweepFlag_Setter_(mthis, __arg_0) => mthis["sweepFlag"] = __arg_0;
+  sweepFlag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcRel */, "sweepFlag", __arg_0);
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcRel */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegArcRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegArcRel */, "y", __arg_0);
 
 }
 
@@ -14751,600 +14751,600 @@
 class BlinkSVGPathSegCurvetoCubicAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicAbs();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "x", __arg_0);
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "x1");
 
-  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
+  x1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "x1", __arg_0);
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "x2");
 
-  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
+  x2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "x2", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "y", __arg_0);
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "y1");
 
-  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+  y1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "y1", __arg_0);
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "y2");
 
-  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+  y2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicAbs */, "y2", __arg_0);
 
 }
 
 class BlinkSVGPathSegCurvetoCubicRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicRel();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicRel */, "x", __arg_0);
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicRel */, "x1");
 
-  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
+  x1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicRel */, "x1", __arg_0);
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicRel */, "x2");
 
-  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
+  x2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicRel */, "x2", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicRel */, "y", __arg_0);
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicRel */, "y1");
 
-  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+  y1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicRel */, "y1", __arg_0);
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicRel */, "y2");
 
-  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+  y2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicRel */, "y2", __arg_0);
 
 }
 
 class BlinkSVGPathSegCurvetoCubicSmoothAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicSmoothAbs();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "x", __arg_0);
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "x2");
 
-  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
+  x2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "x2", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "y", __arg_0);
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "y2");
 
-  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+  y2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothAbs */, "y2", __arg_0);
 
 }
 
 class BlinkSVGPathSegCurvetoCubicSmoothRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicSmoothRel();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "x", __arg_0);
 
-  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x2");
+  x2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "x2");
 
-  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
+  x2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "x2", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "y", __arg_0);
 
-  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y2");
+  y2_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "y2");
 
-  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
+  y2_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoCubicSmoothRel */, "y2", __arg_0);
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticAbs();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "x", __arg_0);
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "x1");
 
-  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
+  x1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "x1", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "y", __arg_0);
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "y1");
 
-  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+  y1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticAbs */, "y1", __arg_0);
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticRel();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "x", __arg_0);
 
-  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x1");
+  x1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "x1");
 
-  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
+  x1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "x1", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "y", __arg_0);
 
-  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y1");
+  y1_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "y1");
 
-  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
+  y1_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticRel */, "y1", __arg_0);
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticSmoothAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticSmoothAbs();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothAbs */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothAbs */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticSmoothRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticSmoothRel();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothRel */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegCurvetoQuadraticSmoothRel */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegLinetoAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoAbs();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoAbs */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoAbs */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegLinetoHorizontalAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoHorizontalAbs();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoHorizontalAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoHorizontalAbs */, "x", __arg_0);
 
 }
 
 class BlinkSVGPathSegLinetoHorizontalRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoHorizontalRel();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoHorizontalRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoHorizontalRel */, "x", __arg_0);
 
 }
 
 class BlinkSVGPathSegLinetoRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoRel();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoRel */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoRel */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegLinetoVerticalAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoVerticalAbs();
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoVerticalAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoVerticalAbs */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegLinetoVerticalRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoVerticalRel();
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegLinetoVerticalRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegLinetoVerticalRel */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegList {
   static final instance = new BlinkSVGPathSegList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegList */, "length");
 
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegList */, "numberOfItems");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "__setter__", [__arg_0, __arg_1]);
 
-  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", []);
+  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "appendItem", []);
 
-  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", [__arg_0]);
+  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "appendItem", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "clear", []);
 
-  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getItem", []);
+  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "getItem", []);
 
-  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getItem", [__arg_0]);
+  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "getItem", [__arg_0]);
 
-  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initialize", []);
+  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "initialize", []);
 
-  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initialize", [__arg_0]);
+  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "initialize", [__arg_0]);
 
-  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", []);
+  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "insertItemBefore", []);
 
-  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0]);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "insertItemBefore", [__arg_0]);
 
-  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "insertItemBefore", [__arg_0, __arg_1]);
 
-  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
+  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "removeItem", []);
 
-  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
+  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "removeItem", [__arg_0]);
 
-  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", []);
+  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "replaceItem", []);
 
-  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0]);
+  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "replaceItem", [__arg_0]);
 
-  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0, __arg_1]);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPathSegList */, "replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGPathSegMovetoAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegMovetoAbs();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegMovetoAbs */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegMovetoAbs */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegMovetoAbs */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegMovetoAbs */, "y", __arg_0);
 
 }
 
 class BlinkSVGPathSegMovetoRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegMovetoRel();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegMovetoRel */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegMovetoRel */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPathSegMovetoRel */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPathSegMovetoRel */, "y", __arg_0);
 
 }
 
 class BlinkSVGPatternElement extends BlinkSVGElement {
   static final instance = new BlinkSVGPatternElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPatternElement */, "height");
 
-  patternContentUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "patternContentUnits");
+  patternContentUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPatternElement */, "patternContentUnits");
 
-  patternTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "patternTransform");
+  patternTransform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPatternElement */, "patternTransform");
 
-  patternUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "patternUnits");
+  patternUnits_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPatternElement */, "patternUnits");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPatternElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPatternElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPatternElement */, "y");
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "preserveAspectRatio");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "viewBox");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
-  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
+  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredExtensions");
 
-  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
+  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredFeatures");
 
-  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
+  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "systemLanguage");
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", []);
 
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", [__arg_0]);
 
 }
 
 class BlinkSVGPoint {
   static final instance = new BlinkSVGPoint();
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPoint */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPoint */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPoint */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPoint */, "y", __arg_0);
 
-  matrixTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matrixTransform", []);
+  matrixTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPoint */, "matrixTransform", []);
 
-  matrixTransform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matrixTransform", [__arg_0]);
+  matrixTransform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPoint */, "matrixTransform", [__arg_0]);
 
 }
 
 class BlinkSVGPointList {
   static final instance = new BlinkSVGPointList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPointList */, "length");
 
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPointList */, "numberOfItems");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "__setter__", [__arg_0, __arg_1]);
 
-  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", []);
+  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "appendItem", []);
 
-  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", [__arg_0]);
+  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "appendItem", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "clear", []);
 
-  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getItem", []);
+  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "getItem", []);
 
-  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getItem", [__arg_0]);
+  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "getItem", [__arg_0]);
 
-  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initialize", []);
+  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "initialize", []);
 
-  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initialize", [__arg_0]);
+  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "initialize", [__arg_0]);
 
-  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", []);
+  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "insertItemBefore", []);
 
-  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0]);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "insertItemBefore", [__arg_0]);
 
-  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "insertItemBefore", [__arg_0, __arg_1]);
 
-  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
+  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "removeItem", []);
 
-  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
+  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "removeItem", [__arg_0]);
 
-  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", []);
+  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "replaceItem", []);
 
-  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0]);
+  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "replaceItem", [__arg_0]);
 
-  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0, __arg_1]);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGPointList */, "replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGPolygonElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGPolygonElement();
 
-  animatedPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animatedPoints");
+  animatedPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPolygonElement */, "animatedPoints");
 
-  points_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "points");
+  points_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPolygonElement */, "points");
 
 }
 
 class BlinkSVGPolylineElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGPolylineElement();
 
-  animatedPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "animatedPoints");
+  animatedPoints_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPolylineElement */, "animatedPoints");
 
-  points_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "points");
+  points_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPolylineElement */, "points");
 
 }
 
 class BlinkSVGPreserveAspectRatio {
   static final instance = new BlinkSVGPreserveAspectRatio();
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPreserveAspectRatio */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPreserveAspectRatio */, "align", __arg_0);
 
-  meetOrSlice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "meetOrSlice");
+  meetOrSlice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGPreserveAspectRatio */, "meetOrSlice");
 
-  meetOrSlice_Setter_(mthis, __arg_0) => mthis["meetOrSlice"] = __arg_0;
+  meetOrSlice_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGPreserveAspectRatio */, "meetOrSlice", __arg_0);
 
 }
 
 class BlinkSVGRadialGradientElement extends BlinkSVGGradientElement {
   static final instance = new BlinkSVGRadialGradientElement();
 
-  cx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cx");
+  cx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRadialGradientElement */, "cx");
 
-  cy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cy");
+  cy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRadialGradientElement */, "cy");
 
-  fr_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fr");
+  fr_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRadialGradientElement */, "fr");
 
-  fx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fx");
+  fx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRadialGradientElement */, "fx");
 
-  fy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fy");
+  fy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRadialGradientElement */, "fy");
 
-  r_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "r");
+  r_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRadialGradientElement */, "r");
 
 }
 
 class BlinkSVGRect {
   static final instance = new BlinkSVGRect();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRect */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGRect */, "height", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRect */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGRect */, "width", __arg_0);
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRect */, "x");
 
-  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
+  x_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGRect */, "x", __arg_0);
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRect */, "y");
 
-  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
+  y_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGRect */, "y", __arg_0);
 
 }
 
 class BlinkSVGRectElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGRectElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRectElement */, "height");
 
-  rx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rx");
+  rx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRectElement */, "rx");
 
-  ry_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ry");
+  ry_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRectElement */, "ry");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRectElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRectElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGRectElement */, "y");
 
 }
 
 class BlinkSVGSVGElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGSVGElement();
 
-  currentScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentScale");
+  currentScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "currentScale");
 
-  currentScale_Setter_(mthis, __arg_0) => mthis["currentScale"] = __arg_0;
+  currentScale_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGSVGElement */, "currentScale", __arg_0);
 
-  currentTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentTranslate");
+  currentTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "currentTranslate");
 
-  currentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentView");
+  currentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "currentView");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "height");
 
-  pixelUnitToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pixelUnitToMillimeterX");
+  pixelUnitToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "pixelUnitToMillimeterX");
 
-  pixelUnitToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pixelUnitToMillimeterY");
+  pixelUnitToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "pixelUnitToMillimeterY");
 
-  screenPixelToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenPixelToMillimeterX");
+  screenPixelToMillimeterX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "screenPixelToMillimeterX");
 
-  screenPixelToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenPixelToMillimeterY");
+  screenPixelToMillimeterY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "screenPixelToMillimeterY");
 
-  useCurrentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "useCurrentView");
+  useCurrentView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "useCurrentView");
 
-  viewport_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewport");
+  viewport_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "viewport");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGSVGElement */, "y");
 
-  animationsPaused_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "animationsPaused", []);
+  animationsPaused_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "animationsPaused", []);
 
-  checkEnclosure_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkEnclosure", []);
+  checkEnclosure_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "checkEnclosure", []);
 
-  checkEnclosure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkEnclosure", [__arg_0]);
+  checkEnclosure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "checkEnclosure", [__arg_0]);
 
-  checkEnclosure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "checkEnclosure", [__arg_0, __arg_1]);
+  checkEnclosure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "checkEnclosure", [__arg_0, __arg_1]);
 
-  checkIntersection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkIntersection", []);
+  checkIntersection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "checkIntersection", []);
 
-  checkIntersection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkIntersection", [__arg_0]);
+  checkIntersection_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "checkIntersection", [__arg_0]);
 
-  checkIntersection_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "checkIntersection", [__arg_0, __arg_1]);
+  checkIntersection_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "checkIntersection", [__arg_0, __arg_1]);
 
-  createSVGAngle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGAngle", []);
+  createSVGAngle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGAngle", []);
 
-  createSVGLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGLength", []);
+  createSVGLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGLength", []);
 
-  createSVGMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGMatrix", []);
+  createSVGMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGMatrix", []);
 
-  createSVGNumber_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGNumber", []);
+  createSVGNumber_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGNumber", []);
 
-  createSVGPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGPoint", []);
+  createSVGPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGPoint", []);
 
-  createSVGRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGRect", []);
+  createSVGRect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGRect", []);
 
-  createSVGTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransform", []);
+  createSVGTransform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGTransform", []);
 
-  createSVGTransformFromMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransformFromMatrix", []);
+  createSVGTransformFromMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGTransformFromMatrix", []);
 
-  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransformFromMatrix", [__arg_0]);
+  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "createSVGTransformFromMatrix", [__arg_0]);
 
-  deselectAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deselectAll", []);
+  deselectAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "deselectAll", []);
 
-  forceRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "forceRedraw", []);
+  forceRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "forceRedraw", []);
 
-  getCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCurrentTime", []);
+  getCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getCurrentTime", []);
 
-  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", []);
+  getElementById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getElementById", []);
 
-  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getElementById", [__arg_0]);
+  getElementById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getElementById", [__arg_0]);
 
-  getEnclosureList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEnclosureList", []);
+  getEnclosureList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getEnclosureList", []);
 
-  getEnclosureList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEnclosureList", [__arg_0]);
+  getEnclosureList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getEnclosureList", [__arg_0]);
 
-  getEnclosureList_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getEnclosureList", [__arg_0, __arg_1]);
+  getEnclosureList_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getEnclosureList", [__arg_0, __arg_1]);
 
-  getIntersectionList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getIntersectionList", []);
+  getIntersectionList_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getIntersectionList", []);
 
-  getIntersectionList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getIntersectionList", [__arg_0]);
+  getIntersectionList_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getIntersectionList", [__arg_0]);
 
-  getIntersectionList_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getIntersectionList", [__arg_0, __arg_1]);
+  getIntersectionList_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "getIntersectionList", [__arg_0, __arg_1]);
 
-  pauseAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pauseAnimations", []);
+  pauseAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "pauseAnimations", []);
 
-  setCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setCurrentTime", []);
+  setCurrentTime_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "setCurrentTime", []);
 
-  setCurrentTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setCurrentTime", [__arg_0]);
+  setCurrentTime_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "setCurrentTime", [__arg_0]);
 
-  suspendRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "suspendRedraw", []);
+  suspendRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "suspendRedraw", []);
 
-  suspendRedraw_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "suspendRedraw", [__arg_0]);
+  suspendRedraw_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "suspendRedraw", [__arg_0]);
 
-  unpauseAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unpauseAnimations", []);
+  unpauseAnimations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "unpauseAnimations", []);
 
-  unsuspendRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unsuspendRedraw", []);
+  unsuspendRedraw_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "unsuspendRedraw", []);
 
-  unsuspendRedraw_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "unsuspendRedraw", [__arg_0]);
+  unsuspendRedraw_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "unsuspendRedraw", [__arg_0]);
 
-  unsuspendRedrawAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unsuspendRedrawAll", []);
+  unsuspendRedrawAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGSVGElement */, "unsuspendRedrawAll", []);
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "preserveAspectRatio");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "viewBox");
 
-  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
+  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomAndPan */, "zoomAndPan");
 
-  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
+  zoomAndPan_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGZoomAndPan */, "zoomAndPan", __arg_0);
 
 }
 
 class BlinkSVGScriptElement extends BlinkSVGElement {
   static final instance = new BlinkSVGScriptElement();
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGScriptElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGScriptElement */, "type", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
@@ -15356,71 +15356,71 @@
 class BlinkSVGStopElement extends BlinkSVGElement {
   static final instance = new BlinkSVGStopElement();
 
-  offset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offset");
+  offset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStopElement */, "offset");
 
 }
 
 class BlinkSVGStringList {
   static final instance = new BlinkSVGStringList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStringList */, "length");
 
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStringList */, "numberOfItems");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "__setter__", [__arg_0, __arg_1]);
 
-  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", []);
+  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "appendItem", []);
 
-  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", [__arg_0]);
+  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "appendItem", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "clear", []);
 
-  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getItem", []);
+  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "getItem", []);
 
-  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getItem", [__arg_0]);
+  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "getItem", [__arg_0]);
 
-  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initialize", []);
+  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "initialize", []);
 
-  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initialize", [__arg_0]);
+  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "initialize", [__arg_0]);
 
-  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", []);
+  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "insertItemBefore", []);
 
-  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0]);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "insertItemBefore", [__arg_0]);
 
-  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "insertItemBefore", [__arg_0, __arg_1]);
 
-  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
+  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "removeItem", []);
 
-  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
+  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "removeItem", [__arg_0]);
 
-  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", []);
+  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "replaceItem", []);
 
-  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0]);
+  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "replaceItem", [__arg_0]);
 
-  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0, __arg_1]);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGStringList */, "replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGStyleElement extends BlinkSVGElement {
   static final instance = new BlinkSVGStyleElement();
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStyleElement */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGStyleElement */, "disabled", __arg_0);
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStyleElement */, "media");
 
-  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
+  media_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGStyleElement */, "media", __arg_0);
 
-  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sheet");
+  sheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStyleElement */, "sheet");
 
-  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
+  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStyleElement */, "title");
 
-  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
+  title_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGStyleElement */, "title", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGStyleElement */, "type");
 
-  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
+  type_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGStyleElement */, "type", __arg_0);
 
 }
 
@@ -15432,9 +15432,9 @@
 class BlinkSVGSymbolElement extends BlinkSVGElement {
   static final instance = new BlinkSVGSymbolElement();
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "preserveAspectRatio");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "viewBox");
 
 }
 
@@ -15446,60 +15446,60 @@
 class BlinkSVGTests {
   static final instance = new BlinkSVGTests();
 
-  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredExtensions");
+  requiredExtensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredExtensions");
 
-  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "requiredFeatures");
+  requiredFeatures_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "requiredFeatures");
 
-  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "systemLanguage");
+  systemLanguage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTests */, "systemLanguage");
 
-  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", []);
+  hasExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", []);
 
-  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hasExtension", [__arg_0]);
+  hasExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTests */, "hasExtension", [__arg_0]);
 
 }
 
 class BlinkSVGTextContentElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGTextContentElement();
 
-  lengthAdjust_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lengthAdjust");
+  lengthAdjust_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextContentElement */, "lengthAdjust");
 
-  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "textLength");
+  textLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextContentElement */, "textLength");
 
-  getCharNumAtPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCharNumAtPosition", []);
+  getCharNumAtPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getCharNumAtPosition", []);
 
-  getCharNumAtPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCharNumAtPosition", [__arg_0]);
+  getCharNumAtPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getCharNumAtPosition", [__arg_0]);
 
-  getComputedTextLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getComputedTextLength", []);
+  getComputedTextLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getComputedTextLength", []);
 
-  getEndPositionOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEndPositionOfChar", []);
+  getEndPositionOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getEndPositionOfChar", []);
 
-  getEndPositionOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEndPositionOfChar", [__arg_0]);
+  getEndPositionOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getEndPositionOfChar", [__arg_0]);
 
-  getExtentOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtentOfChar", []);
+  getExtentOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getExtentOfChar", []);
 
-  getExtentOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtentOfChar", [__arg_0]);
+  getExtentOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getExtentOfChar", [__arg_0]);
 
-  getNumberOfChars_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNumberOfChars", []);
+  getNumberOfChars_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getNumberOfChars", []);
 
-  getRotationOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRotationOfChar", []);
+  getRotationOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getRotationOfChar", []);
 
-  getRotationOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRotationOfChar", [__arg_0]);
+  getRotationOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getRotationOfChar", [__arg_0]);
 
-  getStartPositionOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getStartPositionOfChar", []);
+  getStartPositionOfChar_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getStartPositionOfChar", []);
 
-  getStartPositionOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getStartPositionOfChar", [__arg_0]);
+  getStartPositionOfChar_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getStartPositionOfChar", [__arg_0]);
 
-  getSubStringLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSubStringLength", []);
+  getSubStringLength_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getSubStringLength", []);
 
-  getSubStringLength_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSubStringLength", [__arg_0]);
+  getSubStringLength_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getSubStringLength", [__arg_0]);
 
-  getSubStringLength_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSubStringLength", [__arg_0, __arg_1]);
+  getSubStringLength_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "getSubStringLength", [__arg_0, __arg_1]);
 
-  selectSubString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectSubString", []);
+  selectSubString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "selectSubString", []);
 
-  selectSubString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectSubString", [__arg_0]);
+  selectSubString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "selectSubString", [__arg_0]);
 
-  selectSubString_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "selectSubString", [__arg_0, __arg_1]);
+  selectSubString_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTextContentElement */, "selectSubString", [__arg_0, __arg_1]);
 
 }
 
@@ -15511,28 +15511,28 @@
 class BlinkSVGTextPathElement extends BlinkSVGTextContentElement {
   static final instance = new BlinkSVGTextPathElement();
 
-  method_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "method");
+  method_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPathElement */, "method");
 
-  spacing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "spacing");
+  spacing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPathElement */, "spacing");
 
-  startOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startOffset");
+  startOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPathElement */, "startOffset");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGTextPositioningElement extends BlinkSVGTextContentElement {
   static final instance = new BlinkSVGTextPositioningElement();
 
-  dx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dx");
+  dx_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPositioningElement */, "dx");
 
-  dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dy");
+  dy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPositioningElement */, "dy");
 
-  rotate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rotate");
+  rotate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPositioningElement */, "rotate");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPositioningElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTextPositioningElement */, "y");
 
 }
 
@@ -15544,95 +15544,95 @@
 class BlinkSVGTransform {
   static final instance = new BlinkSVGTransform();
 
-  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angle");
+  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTransform */, "angle");
 
-  matrix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "matrix");
+  matrix_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTransform */, "matrix");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTransform */, "type");
 
-  setMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setMatrix", []);
+  setMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setMatrix", []);
 
-  setMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setMatrix", [__arg_0]);
+  setMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setMatrix", [__arg_0]);
 
-  setRotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setRotate", [__arg_0]);
+  setRotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setRotate", [__arg_0]);
 
-  setRotate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setRotate", [__arg_0, __arg_1]);
+  setRotate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setRotate", [__arg_0, __arg_1]);
 
-  setRotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setRotate", [__arg_0, __arg_1, __arg_2]);
+  setRotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setRotate", [__arg_0, __arg_1, __arg_2]);
 
-  setScale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setScale", []);
+  setScale_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setScale", []);
 
-  setScale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setScale", [__arg_0]);
+  setScale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setScale", [__arg_0]);
 
-  setScale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setScale", [__arg_0, __arg_1]);
+  setScale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setScale", [__arg_0, __arg_1]);
 
-  setSkewX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setSkewX", []);
+  setSkewX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setSkewX", []);
 
-  setSkewX_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setSkewX", [__arg_0]);
+  setSkewX_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setSkewX", [__arg_0]);
 
-  setSkewY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setSkewY", []);
+  setSkewY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setSkewY", []);
 
-  setSkewY_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setSkewY", [__arg_0]);
+  setSkewY_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setSkewY", [__arg_0]);
 
-  setTranslate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTranslate", []);
+  setTranslate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setTranslate", []);
 
-  setTranslate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTranslate", [__arg_0]);
+  setTranslate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setTranslate", [__arg_0]);
 
-  setTranslate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTranslate", [__arg_0, __arg_1]);
+  setTranslate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransform */, "setTranslate", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGTransformList {
   static final instance = new BlinkSVGTransformList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTransformList */, "length");
 
-  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberOfItems");
+  numberOfItems_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGTransformList */, "numberOfItems");
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "__setter__", [__arg_0, __arg_1]);
 
-  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", []);
+  appendItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "appendItem", []);
 
-  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendItem", [__arg_0]);
+  appendItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "appendItem", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "clear", []);
 
-  consolidate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "consolidate", []);
+  consolidate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "consolidate", []);
 
-  createSVGTransformFromMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransformFromMatrix", []);
+  createSVGTransformFromMatrix_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "createSVGTransformFromMatrix", []);
 
-  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createSVGTransformFromMatrix", [__arg_0]);
+  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "createSVGTransformFromMatrix", [__arg_0]);
 
-  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getItem", []);
+  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "getItem", []);
 
-  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getItem", [__arg_0]);
+  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "getItem", [__arg_0]);
 
-  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "initialize", []);
+  initialize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "initialize", []);
 
-  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "initialize", [__arg_0]);
+  initialize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "initialize", [__arg_0]);
 
-  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", []);
+  insertItemBefore_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "insertItemBefore", []);
 
-  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0]);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "insertItemBefore", [__arg_0]);
 
-  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "insertItemBefore", [__arg_0, __arg_1]);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "insertItemBefore", [__arg_0, __arg_1]);
 
-  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
+  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "removeItem", []);
 
-  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
+  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "removeItem", [__arg_0]);
 
-  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", []);
+  replaceItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "replaceItem", []);
 
-  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0]);
+  replaceItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "replaceItem", [__arg_0]);
 
-  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "replaceItem", [__arg_0, __arg_1]);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SVGTransformList */, "replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGURIReference {
   static final instance = new BlinkSVGURIReference();
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
@@ -15644,1834 +15644,1834 @@
 class BlinkSVGUseElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGUseElement();
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGUseElement */, "height");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGUseElement */, "width");
 
-  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "x");
+  x_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGUseElement */, "x");
 
-  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "y");
+  y_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGUseElement */, "y");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGURIReference */, "href");
 
 }
 
 class BlinkSVGViewElement extends BlinkSVGElement {
   static final instance = new BlinkSVGViewElement();
 
-  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTarget");
+  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGViewElement */, "viewTarget");
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "preserveAspectRatio");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "viewBox");
 
-  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
+  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomAndPan */, "zoomAndPan");
 
-  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
+  zoomAndPan_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGZoomAndPan */, "zoomAndPan", __arg_0);
 
 }
 
 class BlinkSVGViewSpec {
   static final instance = new BlinkSVGViewSpec();
 
-  preserveAspectRatioString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatioString");
+  preserveAspectRatioString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGViewSpec */, "preserveAspectRatioString");
 
-  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transform");
+  transform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGViewSpec */, "transform");
 
-  transformString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transformString");
+  transformString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGViewSpec */, "transformString");
 
-  viewBoxString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBoxString");
+  viewBoxString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGViewSpec */, "viewBoxString");
 
-  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTarget");
+  viewTarget_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGViewSpec */, "viewTarget");
 
-  viewTargetString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewTargetString");
+  viewTargetString_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGViewSpec */, "viewTargetString");
 
-  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "preserveAspectRatio");
+  preserveAspectRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "preserveAspectRatio");
 
-  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewBox");
+  viewBox_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGFitToViewBox */, "viewBox");
 
-  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
+  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomAndPan */, "zoomAndPan");
 
-  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
+  zoomAndPan_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGZoomAndPan */, "zoomAndPan", __arg_0);
 
 }
 
 class BlinkSVGZoomAndPan {
   static final instance = new BlinkSVGZoomAndPan();
 
-  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomAndPan");
+  zoomAndPan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomAndPan */, "zoomAndPan");
 
-  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
+  zoomAndPan_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SVGZoomAndPan */, "zoomAndPan", __arg_0);
 
 }
 
 class BlinkSVGZoomEvent extends BlinkUIEvent {
   static final instance = new BlinkSVGZoomEvent();
 
-  newScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newScale");
+  newScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomEvent */, "newScale");
 
-  newTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newTranslate");
+  newTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomEvent */, "newTranslate");
 
-  previousScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousScale");
+  previousScale_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomEvent */, "previousScale");
 
-  previousTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "previousTranslate");
+  previousTranslate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomEvent */, "previousTranslate");
 
-  zoomRectScreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "zoomRectScreen");
+  zoomRectScreen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SVGZoomEvent */, "zoomRectScreen");
 
 }
 
 class BlinkScreen {
   static final instance = new BlinkScreen();
 
-  availHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "availHeight");
+  availHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "availHeight");
 
-  availLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "availLeft");
+  availLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "availLeft");
 
-  availTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "availTop");
+  availTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "availTop");
 
-  availWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "availWidth");
+  availWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "availWidth");
 
-  colorDepth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "colorDepth");
+  colorDepth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "colorDepth");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "height");
 
-  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientation");
+  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "orientation");
 
-  pixelDepth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pixelDepth");
+  pixelDepth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "pixelDepth");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Screen */, "width");
 
 }
 
 class BlinkScreenOrientation extends BlinkEventTarget {
   static final instance = new BlinkScreenOrientation();
 
-  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angle");
+  angle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScreenOrientation */, "angle");
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScreenOrientation */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ScreenOrientation */, "onchange", __arg_0);
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScreenOrientation */, "type");
 
-  lock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lock", []);
+  lock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ScreenOrientation */, "lock", []);
 
-  lock_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lock", [__arg_0]);
+  lock_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ScreenOrientation */, "lock", [__arg_0]);
 
-  unlock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unlock", []);
+  unlock_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ScreenOrientation */, "unlock", []);
 
 }
 
 class BlinkScriptProcessorNode extends BlinkAudioNode {
   static final instance = new BlinkScriptProcessorNode();
 
-  bufferSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bufferSize");
+  bufferSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScriptProcessorNode */, "bufferSize");
 
-  onaudioprocess_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaudioprocess");
+  onaudioprocess_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScriptProcessorNode */, "onaudioprocess");
 
-  onaudioprocess_Setter_(mthis, __arg_0) => mthis["onaudioprocess"] = __arg_0;
+  onaudioprocess_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ScriptProcessorNode */, "onaudioprocess", __arg_0);
 
-  setEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setEventListener", []);
+  setEventListener_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ScriptProcessorNode */, "setEventListener", []);
 
-  setEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setEventListener", [__arg_0]);
+  setEventListener_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ScriptProcessorNode */, "setEventListener", [__arg_0]);
 
 }
 
 class BlinkScrollState {
   static final instance = new BlinkScrollState();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ScrollState");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  constructorCallback_7_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  constructorCallback_7_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  constructorCallback_8_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ScrollState"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  constructorCallback_8_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callConstructor("ScrollState", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  deltaGranularity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaGranularity");
+  deltaGranularity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "deltaGranularity");
 
-  deltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaX");
+  deltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "deltaX");
 
-  deltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaY");
+  deltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "deltaY");
 
-  fromUserInput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fromUserInput");
+  fromUserInput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "fromUserInput");
 
-  inInertialPhase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "inInertialPhase");
+  inInertialPhase_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "inInertialPhase");
 
-  isBeginning_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isBeginning");
+  isBeginning_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "isBeginning");
 
-  isEnding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isEnding");
+  isEnding_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "isEnding");
 
-  shouldPropagate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shouldPropagate");
+  shouldPropagate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "shouldPropagate");
 
-  velocityX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "velocityX");
+  velocityX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "velocityX");
 
-  velocityY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "velocityY");
+  velocityY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ScrollState */, "velocityY");
 
-  consumeDelta_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "consumeDelta", []);
+  consumeDelta_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ScrollState */, "consumeDelta", []);
 
-  consumeDelta_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "consumeDelta", [__arg_0]);
+  consumeDelta_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ScrollState */, "consumeDelta", [__arg_0]);
 
-  consumeDelta_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "consumeDelta", [__arg_0, __arg_1]);
+  consumeDelta_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ScrollState */, "consumeDelta", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSecurityPolicyViolationEvent extends BlinkEvent {
   static final instance = new BlinkSecurityPolicyViolationEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SecurityPolicyViolationEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SecurityPolicyViolationEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SecurityPolicyViolationEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("SecurityPolicyViolationEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SecurityPolicyViolationEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("SecurityPolicyViolationEvent", [__arg_0, __arg_1]);
 
-  blockedURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "blockedURI");
+  blockedURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "blockedURI");
 
-  columnNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "columnNumber");
+  columnNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "columnNumber");
 
-  documentURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "documentURI");
+  documentURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "documentURI");
 
-  effectiveDirective_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "effectiveDirective");
+  effectiveDirective_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "effectiveDirective");
 
-  lineNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lineNumber");
+  lineNumber_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "lineNumber");
 
-  originalPolicy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "originalPolicy");
+  originalPolicy_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "originalPolicy");
 
-  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "referrer");
+  referrer_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "referrer");
 
-  sourceFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceFile");
+  sourceFile_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "sourceFile");
 
-  statusCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusCode");
+  statusCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "statusCode");
 
-  violatedDirective_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "violatedDirective");
+  violatedDirective_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SecurityPolicyViolationEvent */, "violatedDirective");
 
 }
 
 class BlinkSelection {
   static final instance = new BlinkSelection();
 
-  anchorNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "anchorNode");
+  anchorNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "anchorNode");
 
-  anchorOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "anchorOffset");
+  anchorOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "anchorOffset");
 
-  baseNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseNode");
+  baseNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "baseNode");
 
-  baseOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "baseOffset");
+  baseOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "baseOffset");
 
-  extentNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extentNode");
+  extentNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "extentNode");
 
-  extentOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extentOffset");
+  extentOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "extentOffset");
 
-  focusNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focusNode");
+  focusNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "focusNode");
 
-  focusOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focusOffset");
+  focusOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "focusOffset");
 
-  isCollapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isCollapsed");
+  isCollapsed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "isCollapsed");
 
-  rangeCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rangeCount");
+  rangeCount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "rangeCount");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Selection */, "type");
 
-  addRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRange", []);
+  addRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "addRange", []);
 
-  addRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRange", [__arg_0]);
+  addRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "addRange", [__arg_0]);
 
-  collapse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapse", []);
+  collapse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "collapse", []);
 
-  collapse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "collapse", [__arg_0]);
+  collapse_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "collapse", [__arg_0]);
 
-  collapse_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "collapse", [__arg_0, __arg_1]);
+  collapse_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "collapse", [__arg_0, __arg_1]);
 
-  collapseToEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapseToEnd", []);
+  collapseToEnd_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "collapseToEnd", []);
 
-  collapseToStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "collapseToStart", []);
+  collapseToStart_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "collapseToStart", []);
 
-  containsNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "containsNode", []);
+  containsNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "containsNode", []);
 
-  containsNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "containsNode", [__arg_0]);
+  containsNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "containsNode", [__arg_0]);
 
-  containsNode_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "containsNode", [__arg_0, __arg_1]);
+  containsNode_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "containsNode", [__arg_0, __arg_1]);
 
-  deleteFromDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFromDocument", []);
+  deleteFromDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "deleteFromDocument", []);
 
-  empty_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "empty", []);
+  empty_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "empty", []);
 
-  extend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "extend", []);
+  extend_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "extend", []);
 
-  extend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "extend", [__arg_0]);
+  extend_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "extend", [__arg_0]);
 
-  extend_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "extend", [__arg_0, __arg_1]);
+  extend_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "extend", [__arg_0, __arg_1]);
 
-  getRangeAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRangeAt", []);
+  getRangeAt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "getRangeAt", []);
 
-  getRangeAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRangeAt", [__arg_0]);
+  getRangeAt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "getRangeAt", [__arg_0]);
 
-  modify_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "modify", [__arg_0]);
+  modify_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "modify", [__arg_0]);
 
-  modify_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "modify", [__arg_0, __arg_1]);
+  modify_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "modify", [__arg_0, __arg_1]);
 
-  modify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "modify", [__arg_0, __arg_1, __arg_2]);
+  modify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "modify", [__arg_0, __arg_1, __arg_2]);
 
-  removeAllRanges_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeAllRanges", []);
+  removeAllRanges_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "removeAllRanges", []);
 
-  selectAllChildren_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "selectAllChildren", []);
+  selectAllChildren_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "selectAllChildren", []);
 
-  selectAllChildren_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "selectAllChildren", [__arg_0]);
+  selectAllChildren_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "selectAllChildren", [__arg_0]);
 
-  setBaseAndExtent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setBaseAndExtent", [__arg_0, __arg_1]);
+  setBaseAndExtent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "setBaseAndExtent", [__arg_0, __arg_1]);
 
-  setBaseAndExtent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setBaseAndExtent", [__arg_0, __arg_1, __arg_2]);
+  setBaseAndExtent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "setBaseAndExtent", [__arg_0, __arg_1, __arg_2]);
 
-  setBaseAndExtent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "setBaseAndExtent", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  setBaseAndExtent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "setBaseAndExtent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  setPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", []);
+  setPosition_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "setPosition", []);
 
-  setPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0]);
+  setPosition_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "setPosition", [__arg_0]);
 
-  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setPosition", [__arg_0, __arg_1]);
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Selection */, "setPosition", [__arg_0, __arg_1]);
 
 }
 
 class BlinkServicePort {
   static final instance = new BlinkServicePort();
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePort */, "data");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePort */, "name");
 
-  targetURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetURL");
+  targetURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePort */, "targetURL");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServicePort */, "close", []);
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServicePort */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServicePort */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ServicePort */, "postMessage", [__arg_0, __arg_1]);
 
 }
 
 class BlinkServicePortCollection extends BlinkEventTarget {
   static final instance = new BlinkServicePortCollection();
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePortCollection */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServicePortCollection */, "onclose", __arg_0);
 
-  onconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onconnect");
+  onconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePortCollection */, "onconnect");
 
-  onconnect_Setter_(mthis, __arg_0) => mthis["onconnect"] = __arg_0;
+  onconnect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServicePortCollection */, "onconnect", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePortCollection */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServicePortCollection */, "onmessage", __arg_0);
 
-  connect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "connect", []);
+  connect_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortCollection */, "connect", []);
 
-  connect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0]);
+  connect_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortCollection */, "connect", [__arg_0]);
 
-  connect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "connect", [__arg_0, __arg_1]);
+  connect_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortCollection */, "connect", [__arg_0, __arg_1]);
 
-  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "match", []);
+  match_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortCollection */, "match", []);
 
-  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "match", [__arg_0]);
+  match_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortCollection */, "match", [__arg_0]);
 
-  matchAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", []);
+  matchAll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortCollection */, "matchAll", []);
 
-  matchAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchAll", [__arg_0]);
+  matchAll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortCollection */, "matchAll", [__arg_0]);
 
 }
 
 class BlinkServicePortConnectEvent extends BlinkExtendableEvent {
   static final instance = new BlinkServicePortConnectEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServicePortConnectEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ServicePortConnectEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServicePortConnectEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ServicePortConnectEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServicePortConnectEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ServicePortConnectEvent", [__arg_0, __arg_1]);
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePortConnectEvent */, "origin");
 
-  targetURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetURL");
+  targetURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServicePortConnectEvent */, "targetURL");
 
-  respondWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", []);
+  respondWith_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortConnectEvent */, "respondWith", []);
 
-  respondWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "respondWith", [__arg_0]);
+  respondWith_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServicePortConnectEvent */, "respondWith", [__arg_0]);
 
 }
 
 class BlinkServiceWorker extends BlinkEventTarget {
   static final instance = new BlinkServiceWorker();
 
-  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstatechange");
+  onstatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorker */, "onstatechange");
 
-  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
+  onstatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorker */, "onstatechange", __arg_0);
 
-  scriptURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scriptURL");
+  scriptURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorker */, "scriptURL");
 
-  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "state");
+  state_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorker */, "state");
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorker */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorker */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorker */, "postMessage", [__arg_0, __arg_1]);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AbstractWorker */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AbstractWorker */, "onerror", __arg_0);
 
 }
 
 class BlinkServiceWorkerContainer extends BlinkEventTarget {
   static final instance = new BlinkServiceWorkerContainer();
 
-  controller_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "controller");
+  controller_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerContainer */, "controller");
 
-  oncontrollerchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontrollerchange");
+  oncontrollerchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerContainer */, "oncontrollerchange");
 
-  oncontrollerchange_Setter_(mthis, __arg_0) => mthis["oncontrollerchange"] = __arg_0;
+  oncontrollerchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerContainer */, "oncontrollerchange", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerContainer */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerContainer */, "onmessage", __arg_0);
 
-  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ready");
+  ready_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerContainer */, "ready");
 
-  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", []);
+  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerContainer */, "getRegistration", []);
 
-  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", [__arg_0]);
+  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerContainer */, "getRegistration", [__arg_0]);
 
-  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistrations", []);
+  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerContainer */, "getRegistrations", []);
 
-  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "register", []);
+  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerContainer */, "register", []);
 
-  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "register", [__arg_0]);
+  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerContainer */, "register", [__arg_0]);
 
-  register_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "register", [__arg_0, __arg_1]);
+  register_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerContainer */, "register", [__arg_0, __arg_1]);
 
 }
 
 class BlinkServiceWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkServiceWorkerGlobalScope();
 
-  clients_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clients");
+  clients_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "clients");
 
-  onactivate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onactivate");
+  onactivate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onactivate");
 
-  onactivate_Setter_(mthis, __arg_0) => mthis["onactivate"] = __arg_0;
+  onactivate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onactivate", __arg_0);
 
-  oncrossoriginconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncrossoriginconnect");
+  oncrossoriginconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "oncrossoriginconnect");
 
-  oncrossoriginconnect_Setter_(mthis, __arg_0) => mthis["oncrossoriginconnect"] = __arg_0;
+  oncrossoriginconnect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "oncrossoriginconnect", __arg_0);
 
-  oncrossoriginmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncrossoriginmessage");
+  oncrossoriginmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "oncrossoriginmessage");
 
-  oncrossoriginmessage_Setter_(mthis, __arg_0) => mthis["oncrossoriginmessage"] = __arg_0;
+  oncrossoriginmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "oncrossoriginmessage", __arg_0);
 
-  onfetch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfetch");
+  onfetch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onfetch");
 
-  onfetch_Setter_(mthis, __arg_0) => mthis["onfetch"] = __arg_0;
+  onfetch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onfetch", __arg_0);
 
-  ongeofenceenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ongeofenceenter");
+  ongeofenceenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "ongeofenceenter");
 
-  ongeofenceenter_Setter_(mthis, __arg_0) => mthis["ongeofenceenter"] = __arg_0;
+  ongeofenceenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "ongeofenceenter", __arg_0);
 
-  ongeofenceleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ongeofenceleave");
+  ongeofenceleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "ongeofenceleave");
 
-  ongeofenceleave_Setter_(mthis, __arg_0) => mthis["ongeofenceleave"] = __arg_0;
+  ongeofenceleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "ongeofenceleave", __arg_0);
 
-  oninstall_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninstall");
+  oninstall_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "oninstall");
 
-  oninstall_Setter_(mthis, __arg_0) => mthis["oninstall"] = __arg_0;
+  oninstall_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "oninstall", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onmessage", __arg_0);
 
-  onnotificationclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnotificationclick");
+  onnotificationclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onnotificationclick");
 
-  onnotificationclick_Setter_(mthis, __arg_0) => mthis["onnotificationclick"] = __arg_0;
+  onnotificationclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onnotificationclick", __arg_0);
 
-  onnotificationerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnotificationerror");
+  onnotificationerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onnotificationerror");
 
-  onnotificationerror_Setter_(mthis, __arg_0) => mthis["onnotificationerror"] = __arg_0;
+  onnotificationerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onnotificationerror", __arg_0);
 
-  onperiodicsync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onperiodicsync");
+  onperiodicsync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onperiodicsync");
 
-  onperiodicsync_Setter_(mthis, __arg_0) => mthis["onperiodicsync"] = __arg_0;
+  onperiodicsync_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onperiodicsync", __arg_0);
 
-  onpush_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpush");
+  onpush_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onpush");
 
-  onpush_Setter_(mthis, __arg_0) => mthis["onpush"] = __arg_0;
+  onpush_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onpush", __arg_0);
 
-  onsync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsync");
+  onsync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "onsync");
 
-  onsync_Setter_(mthis, __arg_0) => mthis["onsync"] = __arg_0;
+  onsync_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerGlobalScope */, "onsync", __arg_0);
 
-  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ports");
+  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "ports");
 
-  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "registration");
+  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerGlobalScope */, "registration");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerGlobalScope */, "close", []);
 
-  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fetch", []);
+  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerGlobalScope */, "fetch", []);
 
-  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0]);
+  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerGlobalScope */, "fetch", [__arg_0]);
 
-  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0, __arg_1]);
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerGlobalScope */, "fetch", [__arg_0, __arg_1]);
 
-  skipWaiting_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "skipWaiting", []);
+  skipWaiting_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerGlobalScope */, "skipWaiting", []);
 
 }
 
 class BlinkServiceWorkerMessageEvent extends BlinkEvent {
   static final instance = new BlinkServiceWorkerMessageEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServiceWorkerMessageEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("ServiceWorkerMessageEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServiceWorkerMessageEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("ServiceWorkerMessageEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "ServiceWorkerMessageEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("ServiceWorkerMessageEvent", [__arg_0, __arg_1]);
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerMessageEvent */, "data");
 
-  lastEventId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lastEventId");
+  lastEventId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerMessageEvent */, "lastEventId");
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerMessageEvent */, "origin");
 
-  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ports");
+  ports_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerMessageEvent */, "ports");
 
-  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "source");
+  source_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerMessageEvent */, "source");
 
 }
 
 class BlinkServiceWorkerRegistration extends BlinkEventTarget {
   static final instance = new BlinkServiceWorkerRegistration();
 
-  active_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "active");
+  active_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "active");
 
-  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geofencing");
+  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "geofencing");
 
-  installing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "installing");
+  installing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "installing");
 
-  onupdatefound_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onupdatefound");
+  onupdatefound_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "onupdatefound");
 
-  onupdatefound_Setter_(mthis, __arg_0) => mthis["onupdatefound"] = __arg_0;
+  onupdatefound_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ServiceWorkerRegistration */, "onupdatefound", __arg_0);
 
-  periodicSync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "periodicSync");
+  periodicSync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "periodicSync");
 
-  pushManager_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pushManager");
+  pushManager_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "pushManager");
 
-  scope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scope");
+  scope_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "scope");
 
-  sync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sync");
+  sync_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "sync");
 
-  waiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "waiting");
+  waiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ServiceWorkerRegistration */, "waiting");
 
-  getNotifications_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getNotifications", []);
+  getNotifications_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerRegistration */, "getNotifications", []);
 
-  getNotifications_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getNotifications", [__arg_0]);
+  getNotifications_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerRegistration */, "getNotifications", [__arg_0]);
 
-  showNotification_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "showNotification", []);
+  showNotification_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerRegistration */, "showNotification", []);
 
-  showNotification_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "showNotification", [__arg_0]);
+  showNotification_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerRegistration */, "showNotification", [__arg_0]);
 
-  showNotification_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "showNotification", [__arg_0, __arg_1]);
+  showNotification_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerRegistration */, "showNotification", [__arg_0, __arg_1]);
 
-  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregister", []);
+  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerRegistration */, "unregister", []);
 
-  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "update", []);
+  update_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ServiceWorkerRegistration */, "update", []);
 
 }
 
 class BlinkShadowRoot extends BlinkDocumentFragment {
   static final instance = new BlinkShadowRoot();
 
-  activeElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeElement");
+  activeElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ShadowRoot */, "activeElement");
 
-  delegatesFocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "delegatesFocus");
+  delegatesFocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ShadowRoot */, "delegatesFocus");
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ShadowRoot */, "host");
 
-  innerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerHTML");
+  innerHTML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ShadowRoot */, "innerHTML");
 
-  innerHTML_Setter_(mthis, __arg_0) => mthis["innerHTML"] = __arg_0;
+  innerHTML_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* ShadowRoot */, "innerHTML", __arg_0);
 
-  olderShadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "olderShadowRoot");
+  olderShadowRoot_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ShadowRoot */, "olderShadowRoot");
 
-  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleSheets");
+  styleSheets_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ShadowRoot */, "styleSheets");
 
-  cloneNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", []);
+  cloneNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "cloneNode", []);
 
-  cloneNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cloneNode", [__arg_0]);
+  cloneNode_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "cloneNode", [__arg_0]);
 
-  elementFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", []);
+  elementFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "elementFromPoint", []);
 
-  elementFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", [__arg_0]);
+  elementFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "elementFromPoint", [__arg_0]);
 
-  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementFromPoint", [__arg_0, __arg_1]);
+  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "elementFromPoint", [__arg_0, __arg_1]);
 
-  elementsFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", []);
+  elementsFromPoint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "elementsFromPoint", []);
 
-  elementsFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0]);
+  elementsFromPoint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "elementsFromPoint", [__arg_0]);
 
-  elementsFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "elementsFromPoint", [__arg_0, __arg_1]);
+  elementsFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "elementsFromPoint", [__arg_0, __arg_1]);
 
-  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelection", []);
+  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* ShadowRoot */, "getSelection", []);
 
 }
 
 class BlinkSharedArrayBuffer {
   static final instance = new BlinkSharedArrayBuffer();
 
-  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteLength");
+  byteLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SharedArrayBuffer */, "byteLength");
 
 }
 
 class BlinkSharedWorker extends BlinkEventTarget {
   static final instance = new BlinkSharedWorker();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SharedWorker"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SharedWorker");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SharedWorker"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("SharedWorker", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SharedWorker"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("SharedWorker", [__arg_0, __arg_1]);
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SharedWorker */, "port");
 
-  workerStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "workerStart");
+  workerStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SharedWorker */, "workerStart");
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AbstractWorker */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AbstractWorker */, "onerror", __arg_0);
 
 }
 
 class BlinkSharedWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkSharedWorkerGlobalScope();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SharedWorkerGlobalScope */, "name");
 
-  onconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onconnect");
+  onconnect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SharedWorkerGlobalScope */, "onconnect");
 
-  onconnect_Setter_(mthis, __arg_0) => mthis["onconnect"] = __arg_0;
+  onconnect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SharedWorkerGlobalScope */, "onconnect", __arg_0);
 
 }
 
 class BlinkSourceBuffer extends BlinkEventTarget {
   static final instance = new BlinkSourceBuffer();
 
-  appendWindowEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appendWindowEnd");
+  appendWindowEnd_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBuffer */, "appendWindowEnd");
 
-  appendWindowEnd_Setter_(mthis, __arg_0) => mthis["appendWindowEnd"] = __arg_0;
+  appendWindowEnd_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SourceBuffer */, "appendWindowEnd", __arg_0);
 
-  appendWindowStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appendWindowStart");
+  appendWindowStart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBuffer */, "appendWindowStart");
 
-  appendWindowStart_Setter_(mthis, __arg_0) => mthis["appendWindowStart"] = __arg_0;
+  appendWindowStart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SourceBuffer */, "appendWindowStart", __arg_0);
 
-  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "buffered");
+  buffered_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBuffer */, "buffered");
 
-  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
+  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBuffer */, "mode");
 
-  mode_Setter_(mthis, __arg_0) => mthis["mode"] = __arg_0;
+  mode_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SourceBuffer */, "mode", __arg_0);
 
-  timestampOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timestampOffset");
+  timestampOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBuffer */, "timestampOffset");
 
-  timestampOffset_Setter_(mthis, __arg_0) => mthis["timestampOffset"] = __arg_0;
+  timestampOffset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SourceBuffer */, "timestampOffset", __arg_0);
 
-  trackDefaults_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "trackDefaults");
+  trackDefaults_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBuffer */, "trackDefaults");
 
-  trackDefaults_Setter_(mthis, __arg_0) => mthis["trackDefaults"] = __arg_0;
+  trackDefaults_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SourceBuffer */, "trackDefaults", __arg_0);
 
-  updating_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "updating");
+  updating_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBuffer */, "updating");
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "abort", []);
 
-  appendBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendBuffer", []);
+  appendBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "appendBuffer", []);
 
-  appendBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendBuffer", [__arg_0]);
+  appendBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "appendBuffer", [__arg_0]);
 
-  appendStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", []);
+  appendStream_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "appendStream", []);
 
-  appendStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", [__arg_0]);
+  appendStream_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "appendStream", [__arg_0]);
 
-  appendStream_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "appendStream", [__arg_0, __arg_1]);
+  appendStream_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "appendStream", [__arg_0, __arg_1]);
 
-  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "remove", []);
+  remove_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "remove", []);
 
-  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0]);
+  remove_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "remove", [__arg_0]);
 
-  remove_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "remove", [__arg_0, __arg_1]);
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SourceBuffer */, "remove", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSourceBufferList extends BlinkEventTarget {
   static final instance = new BlinkSourceBufferList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceBufferList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SourceBufferList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SourceBufferList */, "item", [__arg_0]);
 
 }
 
 class BlinkSourceInfo {
   static final instance = new BlinkSourceInfo();
 
-  facing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "facing");
+  facing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceInfo */, "facing");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceInfo */, "id");
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceInfo */, "kind");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SourceInfo */, "label");
 
 }
 
 class BlinkSpeechGrammar {
   static final instance = new BlinkSpeechGrammar();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechGrammar"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SpeechGrammar");
 
-  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "src");
+  src_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechGrammar */, "src");
 
-  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
+  src_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechGrammar */, "src", __arg_0);
 
-  weight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "weight");
+  weight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechGrammar */, "weight");
 
-  weight_Setter_(mthis, __arg_0) => mthis["weight"] = __arg_0;
+  weight_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechGrammar */, "weight", __arg_0);
 
 }
 
 class BlinkSpeechGrammarList {
   static final instance = new BlinkSpeechGrammarList();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechGrammarList"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SpeechGrammarList");
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechGrammarList */, "length");
 
-  addFromString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addFromString", []);
+  addFromString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "addFromString", []);
 
-  addFromString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addFromString", [__arg_0]);
+  addFromString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "addFromString", [__arg_0]);
 
-  addFromString_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addFromString", [__arg_0, __arg_1]);
+  addFromString_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "addFromString", [__arg_0, __arg_1]);
 
-  addFromUri_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addFromUri", []);
+  addFromUri_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "addFromUri", []);
 
-  addFromUri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addFromUri", [__arg_0]);
+  addFromUri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "addFromUri", [__arg_0]);
 
-  addFromUri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "addFromUri", [__arg_0, __arg_1]);
+  addFromUri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "addFromUri", [__arg_0, __arg_1]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SpeechGrammarList */, "item", [__arg_0]);
 
 }
 
 class BlinkSpeechRecognition extends BlinkEventTarget {
   static final instance = new BlinkSpeechRecognition();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "webkitSpeechRecognition"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("webkitSpeechRecognition");
 
-  audioTrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "audioTrack");
+  audioTrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "audioTrack");
 
-  audioTrack_Setter_(mthis, __arg_0) => mthis["audioTrack"] = __arg_0;
+  audioTrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "audioTrack", __arg_0);
 
-  continuous_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "continuous");
+  continuous_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "continuous");
 
-  continuous_Setter_(mthis, __arg_0) => mthis["continuous"] = __arg_0;
+  continuous_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "continuous", __arg_0);
 
-  grammars_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "grammars");
+  grammars_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "grammars");
 
-  grammars_Setter_(mthis, __arg_0) => mthis["grammars"] = __arg_0;
+  grammars_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "grammars", __arg_0);
 
-  interimResults_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "interimResults");
+  interimResults_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "interimResults");
 
-  interimResults_Setter_(mthis, __arg_0) => mthis["interimResults"] = __arg_0;
+  interimResults_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "interimResults", __arg_0);
 
-  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lang");
+  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "lang");
 
-  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
+  lang_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "lang", __arg_0);
 
-  maxAlternatives_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maxAlternatives");
+  maxAlternatives_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "maxAlternatives");
 
-  maxAlternatives_Setter_(mthis, __arg_0) => mthis["maxAlternatives"] = __arg_0;
+  maxAlternatives_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "maxAlternatives", __arg_0);
 
-  onaudioend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaudioend");
+  onaudioend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onaudioend");
 
-  onaudioend_Setter_(mthis, __arg_0) => mthis["onaudioend"] = __arg_0;
+  onaudioend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onaudioend", __arg_0);
 
-  onaudiostart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaudiostart");
+  onaudiostart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onaudiostart");
 
-  onaudiostart_Setter_(mthis, __arg_0) => mthis["onaudiostart"] = __arg_0;
+  onaudiostart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onaudiostart", __arg_0);
 
-  onend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onend");
+  onend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onend");
 
-  onend_Setter_(mthis, __arg_0) => mthis["onend"] = __arg_0;
+  onend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onend", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onerror", __arg_0);
 
-  onnomatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onnomatch");
+  onnomatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onnomatch");
 
-  onnomatch_Setter_(mthis, __arg_0) => mthis["onnomatch"] = __arg_0;
+  onnomatch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onnomatch", __arg_0);
 
-  onresult_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresult");
+  onresult_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onresult");
 
-  onresult_Setter_(mthis, __arg_0) => mthis["onresult"] = __arg_0;
+  onresult_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onresult", __arg_0);
 
-  onsoundend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsoundend");
+  onsoundend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onsoundend");
 
-  onsoundend_Setter_(mthis, __arg_0) => mthis["onsoundend"] = __arg_0;
+  onsoundend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onsoundend", __arg_0);
 
-  onsoundstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsoundstart");
+  onsoundstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onsoundstart");
 
-  onsoundstart_Setter_(mthis, __arg_0) => mthis["onsoundstart"] = __arg_0;
+  onsoundstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onsoundstart", __arg_0);
 
-  onspeechend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onspeechend");
+  onspeechend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onspeechend");
 
-  onspeechend_Setter_(mthis, __arg_0) => mthis["onspeechend"] = __arg_0;
+  onspeechend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onspeechend", __arg_0);
 
-  onspeechstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onspeechstart");
+  onspeechstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onspeechstart");
 
-  onspeechstart_Setter_(mthis, __arg_0) => mthis["onspeechstart"] = __arg_0;
+  onspeechstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onspeechstart", __arg_0);
 
-  onstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstart");
+  onstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "onstart");
 
-  onstart_Setter_(mthis, __arg_0) => mthis["onstart"] = __arg_0;
+  onstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "onstart", __arg_0);
 
-  serviceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "serviceURI");
+  serviceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognition */, "serviceURI");
 
-  serviceURI_Setter_(mthis, __arg_0) => mthis["serviceURI"] = __arg_0;
+  serviceURI_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechRecognition */, "serviceURI", __arg_0);
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechRecognition */, "abort", []);
 
-  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
+  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechRecognition */, "start", []);
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechRecognition */, "stop", []);
 
 }
 
 class BlinkSpeechRecognitionAlternative {
   static final instance = new BlinkSpeechRecognitionAlternative();
 
-  confidence_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "confidence");
+  confidence_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionAlternative */, "confidence");
 
-  transcript_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "transcript");
+  transcript_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionAlternative */, "transcript");
 
 }
 
 class BlinkSpeechRecognitionError extends BlinkEvent {
   static final instance = new BlinkSpeechRecognitionError();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionError"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SpeechRecognitionError");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionError"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("SpeechRecognitionError", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionError"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("SpeechRecognitionError", [__arg_0, __arg_1]);
 
-  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "error");
+  error_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionError */, "error");
 
-  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "message");
+  message_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionError */, "message");
 
 }
 
 class BlinkSpeechRecognitionEvent extends BlinkEvent {
   static final instance = new BlinkSpeechRecognitionEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SpeechRecognitionEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("SpeechRecognitionEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechRecognitionEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("SpeechRecognitionEvent", [__arg_0, __arg_1]);
 
-  emma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "emma");
+  emma_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionEvent */, "emma");
 
-  interpretation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "interpretation");
+  interpretation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionEvent */, "interpretation");
 
-  resultIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "resultIndex");
+  resultIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionEvent */, "resultIndex");
 
-  results_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "results");
+  results_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionEvent */, "results");
 
 }
 
 class BlinkSpeechRecognitionResult {
   static final instance = new BlinkSpeechRecognitionResult();
 
-  isFinal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "isFinal");
+  isFinal_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionResult */, "isFinal");
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionResult */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechRecognitionResult */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SpeechRecognitionResult */, "item", [__arg_0]);
 
 }
 
 class BlinkSpeechRecognitionResultList {
   static final instance = new BlinkSpeechRecognitionResultList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechRecognitionResultList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechRecognitionResultList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SpeechRecognitionResultList */, "item", [__arg_0]);
 
 }
 
 class BlinkSpeechSynthesis extends BlinkEventTarget {
   static final instance = new BlinkSpeechSynthesis();
 
-  onvoiceschanged_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvoiceschanged");
+  onvoiceschanged_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesis */, "onvoiceschanged");
 
-  onvoiceschanged_Setter_(mthis, __arg_0) => mthis["onvoiceschanged"] = __arg_0;
+  onvoiceschanged_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesis */, "onvoiceschanged", __arg_0);
 
-  paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "paused");
+  paused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesis */, "paused");
 
-  pending_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pending");
+  pending_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesis */, "pending");
 
-  speaking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speaking");
+  speaking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesis */, "speaking");
 
-  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancel", []);
+  cancel_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechSynthesis */, "cancel", []);
 
-  getVoices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVoices", []);
+  getVoices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechSynthesis */, "getVoices", []);
 
-  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pause", []);
+  pause_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechSynthesis */, "pause", []);
 
-  resume_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resume", []);
+  resume_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechSynthesis */, "resume", []);
 
-  speak_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "speak", []);
+  speak_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SpeechSynthesis */, "speak", []);
 
-  speak_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "speak", [__arg_0]);
+  speak_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SpeechSynthesis */, "speak", [__arg_0]);
 
 }
 
 class BlinkSpeechSynthesisEvent extends BlinkEvent {
   static final instance = new BlinkSpeechSynthesisEvent();
 
-  charIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charIndex");
+  charIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisEvent */, "charIndex");
 
-  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elapsedTime");
+  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisEvent */, "elapsedTime");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisEvent */, "name");
 
-  utterance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "utterance");
+  utterance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisEvent */, "utterance");
 
 }
 
 class BlinkSpeechSynthesisUtterance extends BlinkEventTarget {
   static final instance = new BlinkSpeechSynthesisUtterance();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechSynthesisUtterance"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SpeechSynthesisUtterance");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SpeechSynthesisUtterance"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("SpeechSynthesisUtterance", [__arg_0]);
 
-  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lang");
+  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "lang");
 
-  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
+  lang_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "lang", __arg_0);
 
-  onboundary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onboundary");
+  onboundary_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "onboundary");
 
-  onboundary_Setter_(mthis, __arg_0) => mthis["onboundary"] = __arg_0;
+  onboundary_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "onboundary", __arg_0);
 
-  onend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onend");
+  onend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "onend");
 
-  onend_Setter_(mthis, __arg_0) => mthis["onend"] = __arg_0;
+  onend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "onend", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "onerror", __arg_0);
 
-  onmark_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmark");
+  onmark_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "onmark");
 
-  onmark_Setter_(mthis, __arg_0) => mthis["onmark"] = __arg_0;
+  onmark_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "onmark", __arg_0);
 
-  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "onpause");
 
-  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+  onpause_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "onpause", __arg_0);
 
-  onresume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresume");
+  onresume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "onresume");
 
-  onresume_Setter_(mthis, __arg_0) => mthis["onresume"] = __arg_0;
+  onresume_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "onresume", __arg_0);
 
-  onstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstart");
+  onstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "onstart");
 
-  onstart_Setter_(mthis, __arg_0) => mthis["onstart"] = __arg_0;
+  onstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "onstart", __arg_0);
 
-  pitch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pitch");
+  pitch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "pitch");
 
-  pitch_Setter_(mthis, __arg_0) => mthis["pitch"] = __arg_0;
+  pitch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "pitch", __arg_0);
 
-  rate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rate");
+  rate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "rate");
 
-  rate_Setter_(mthis, __arg_0) => mthis["rate"] = __arg_0;
+  rate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "rate", __arg_0);
 
-  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "text");
 
-  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+  text_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "text", __arg_0);
 
-  voice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "voice");
+  voice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "voice");
 
-  voice_Setter_(mthis, __arg_0) => mthis["voice"] = __arg_0;
+  voice_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "voice", __arg_0);
 
-  volume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "volume");
+  volume_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisUtterance */, "volume");
 
-  volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
+  volume_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* SpeechSynthesisUtterance */, "volume", __arg_0);
 
 }
 
 class BlinkSpeechSynthesisVoice {
   static final instance = new BlinkSpeechSynthesisVoice();
 
-  default_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "default");
+  default_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisVoice */, "default");
 
-  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "lang");
+  lang_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisVoice */, "lang");
 
-  localService_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localService");
+  localService_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisVoice */, "localService");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisVoice */, "name");
 
-  voiceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "voiceURI");
+  voiceURI_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SpeechSynthesisVoice */, "voiceURI");
 
 }
 
 class BlinkStashedMessagePort extends BlinkMessagePort {
   static final instance = new BlinkStashedMessagePort();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StashedMessagePort */, "name");
 
 }
 
 class BlinkStashedPortCollection extends BlinkEventTarget {
   static final instance = new BlinkStashedPortCollection();
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StashedPortCollection */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* StashedPortCollection */, "onmessage", __arg_0);
 
-  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "add", []);
+  add_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StashedPortCollection */, "add", []);
 
-  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0]);
+  add_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StashedPortCollection */, "add", [__arg_0]);
 
-  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "add", [__arg_0, __arg_1]);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* StashedPortCollection */, "add", [__arg_0, __arg_1]);
 
 }
 
 class BlinkStereoPannerNode extends BlinkAudioNode {
   static final instance = new BlinkStereoPannerNode();
 
-  pan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pan");
+  pan_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StereoPannerNode */, "pan");
 
 }
 
 class BlinkStorage {
   static final instance = new BlinkStorage();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Storage */, "length");
 
-  $__delete___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__delete__", [__arg_0]);
+  $__delete___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "__delete__", [__arg_0]);
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "__getter__", [__arg_0]);
 
-  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "__setter__", [__arg_0, __arg_1]);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "__setter__", [__arg_0, __arg_1]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "clear", []);
 
-  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getItem", []);
+  getItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "getItem", []);
 
-  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getItem", [__arg_0]);
+  getItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "getItem", [__arg_0]);
 
-  key_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "key", []);
+  key_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "key", []);
 
-  key_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "key", [__arg_0]);
+  key_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "key", [__arg_0]);
 
-  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", []);
+  removeItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "removeItem", []);
 
-  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeItem", [__arg_0]);
+  removeItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "removeItem", [__arg_0]);
 
-  setItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setItem", []);
+  setItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "setItem", []);
 
-  setItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setItem", [__arg_0]);
+  setItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "setItem", [__arg_0]);
 
-  setItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setItem", [__arg_0, __arg_1]);
+  setItem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Storage */, "setItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkStorageErrorCallback {
   static final instance = new BlinkStorageErrorCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StorageErrorCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StorageErrorCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkStorageEvent extends BlinkEvent {
   static final instance = new BlinkStorageEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "StorageEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("StorageEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "StorageEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("StorageEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "StorageEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("StorageEvent", [__arg_0, __arg_1]);
 
-  key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "key");
+  key_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageEvent */, "key");
 
-  newValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "newValue");
+  newValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageEvent */, "newValue");
 
-  oldValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oldValue");
+  oldValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageEvent */, "oldValue");
 
-  storageArea_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "storageArea");
+  storageArea_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageEvent */, "storageArea");
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageEvent */, "url");
 
-  initStorageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  initStorageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* StorageEvent */, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  initStorageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  initStorageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* StorageEvent */, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  initStorageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  initStorageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* StorageEvent */, "initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
 }
 
 class BlinkStorageInfo {
   static final instance = new BlinkStorageInfo();
 
-  quota_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "quota");
+  quota_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageInfo */, "quota");
 
-  usage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "usage");
+  usage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageInfo */, "usage");
 
 }
 
 class BlinkStorageQuota {
   static final instance = new BlinkStorageQuota();
 
-  supportedTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "supportedTypes");
+  supportedTypes_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StorageQuota */, "supportedTypes");
 
-  queryInfo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "queryInfo", []);
+  queryInfo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StorageQuota */, "queryInfo", []);
 
-  queryInfo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "queryInfo", [__arg_0]);
+  queryInfo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StorageQuota */, "queryInfo", [__arg_0]);
 
-  requestPersistentQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestPersistentQuota", []);
+  requestPersistentQuota_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StorageQuota */, "requestPersistentQuota", []);
 
-  requestPersistentQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestPersistentQuota", [__arg_0]);
+  requestPersistentQuota_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StorageQuota */, "requestPersistentQuota", [__arg_0]);
 
 }
 
 class BlinkStorageQuotaCallback {
   static final instance = new BlinkStorageQuotaCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StorageQuotaCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StorageQuotaCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkStorageUsageCallback {
   static final instance = new BlinkStorageUsageCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StorageUsageCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StorageUsageCallback */, "handleEvent", [__arg_0]);
 
-  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0, __arg_1]);
+  handleEvent_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* StorageUsageCallback */, "handleEvent", [__arg_0, __arg_1]);
 
 }
 
 class BlinkStream {
   static final instance = new BlinkStream();
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Stream */, "type");
 
 }
 
 class BlinkStringCallback {
   static final instance = new BlinkStringCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StringCallback */, "handleEvent", []);
 
-  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", [__arg_0]);
+  handleEvent_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StringCallback */, "handleEvent", [__arg_0]);
 
 }
 
 class BlinkStyleMedia {
   static final instance = new BlinkStyleMedia();
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleMedia */, "type");
 
-  matchMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchMedium", []);
+  matchMedium_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StyleMedia */, "matchMedium", []);
 
-  matchMedium_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchMedium", [__arg_0]);
+  matchMedium_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StyleMedia */, "matchMedium", [__arg_0]);
 
 }
 
 class BlinkStyleSheet {
   static final instance = new BlinkStyleSheet();
 
-  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "disabled");
+  disabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheet */, "disabled");
 
-  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
+  disabled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* StyleSheet */, "disabled", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheet */, "href");
 
-  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "media");
+  media_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheet */, "media");
 
-  ownerNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ownerNode");
+  ownerNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheet */, "ownerNode");
 
-  parentStyleSheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parentStyleSheet");
+  parentStyleSheet_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheet */, "parentStyleSheet");
 
-  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "title");
+  title_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheet */, "title");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheet */, "type");
 
 }
 
 class BlinkStyleSheetList {
   static final instance = new BlinkStyleSheetList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* StyleSheetList */, "length");
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StyleSheetList */, "__getter__", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* StyleSheetList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* StyleSheetList */, "item", [__arg_0]);
 
 }
 
 class BlinkSubtleCrypto {
   static final instance = new BlinkSubtleCrypto();
 
-  decrypt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "decrypt", [__arg_0]);
+  decrypt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "decrypt", [__arg_0]);
 
-  decrypt_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "decrypt", [__arg_0, __arg_1]);
+  decrypt_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "decrypt", [__arg_0, __arg_1]);
 
-  decrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "decrypt", [__arg_0, __arg_1, __arg_2]);
+  decrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "decrypt", [__arg_0, __arg_1, __arg_2]);
 
-  deriveBits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deriveBits", [__arg_0]);
+  deriveBits_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "deriveBits", [__arg_0]);
 
-  deriveBits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "deriveBits", [__arg_0, __arg_1]);
+  deriveBits_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "deriveBits", [__arg_0, __arg_1]);
 
-  deriveBits_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "deriveBits", [__arg_0, __arg_1, __arg_2]);
+  deriveBits_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "deriveBits", [__arg_0, __arg_1, __arg_2]);
 
-  digest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "digest", []);
+  digest_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "digest", []);
 
-  digest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "digest", [__arg_0]);
+  digest_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "digest", [__arg_0]);
 
-  digest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "digest", [__arg_0, __arg_1]);
+  digest_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "digest", [__arg_0, __arg_1]);
 
-  encrypt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "encrypt", [__arg_0]);
+  encrypt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "encrypt", [__arg_0]);
 
-  encrypt_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "encrypt", [__arg_0, __arg_1]);
+  encrypt_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "encrypt", [__arg_0, __arg_1]);
 
-  encrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "encrypt", [__arg_0, __arg_1, __arg_2]);
+  encrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "encrypt", [__arg_0, __arg_1, __arg_2]);
 
-  exportKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "exportKey", []);
+  exportKey_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "exportKey", []);
 
-  exportKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "exportKey", [__arg_0]);
+  exportKey_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "exportKey", [__arg_0]);
 
-  exportKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "exportKey", [__arg_0, __arg_1]);
+  exportKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "exportKey", [__arg_0, __arg_1]);
 
-  sign_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sign", [__arg_0]);
+  sign_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "sign", [__arg_0]);
 
-  sign_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sign", [__arg_0, __arg_1]);
+  sign_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "sign", [__arg_0, __arg_1]);
 
-  sign_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "sign", [__arg_0, __arg_1, __arg_2]);
+  sign_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "sign", [__arg_0, __arg_1, __arg_2]);
 
-  verify_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "verify", [__arg_0, __arg_1]);
+  verify_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "verify", [__arg_0, __arg_1]);
 
-  verify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "verify", [__arg_0, __arg_1, __arg_2]);
+  verify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "verify", [__arg_0, __arg_1, __arg_2]);
 
-  verify_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "verify", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  verify_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "verify", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  wrapKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "wrapKey", [__arg_0, __arg_1]);
+  wrapKey_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "wrapKey", [__arg_0, __arg_1]);
 
-  wrapKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "wrapKey", [__arg_0, __arg_1, __arg_2]);
+  wrapKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "wrapKey", [__arg_0, __arg_1, __arg_2]);
 
-  wrapKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "wrapKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  wrapKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* SubtleCrypto */, "wrapKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkSyncEvent extends BlinkExtendableEvent {
   static final instance = new BlinkSyncEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SyncEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("SyncEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SyncEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("SyncEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "SyncEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("SyncEvent", [__arg_0, __arg_1]);
 
-  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "registration");
+  registration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SyncEvent */, "registration");
 
 }
 
 class BlinkSyncManager {
   static final instance = new BlinkSyncManager();
 
-  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", []);
+  getRegistration_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SyncManager */, "getRegistration", []);
 
-  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRegistration", [__arg_0]);
+  getRegistration_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SyncManager */, "getRegistration", [__arg_0]);
 
-  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegistrations", []);
+  getRegistrations_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SyncManager */, "getRegistrations", []);
 
-  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "permissionState", []);
+  permissionState_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SyncManager */, "permissionState", []);
 
-  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "register", []);
+  register_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SyncManager */, "register", []);
 
-  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "register", [__arg_0]);
+  register_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* SyncManager */, "register", [__arg_0]);
 
 }
 
 class BlinkSyncRegistration {
   static final instance = new BlinkSyncRegistration();
 
-  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tag");
+  tag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* SyncRegistration */, "tag");
 
-  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "unregister", []);
+  unregister_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* SyncRegistration */, "unregister", []);
 
 }
 
 class BlinkText extends BlinkCharacterData {
   static final instance = new BlinkText();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Text"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Text");
 
-  wholeText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wholeText");
+  wholeText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Text */, "wholeText");
 
-  getDestinationInsertionPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getDestinationInsertionPoints", []);
+  getDestinationInsertionPoints_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Text */, "getDestinationInsertionPoints", []);
 
-  splitText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "splitText", []);
+  splitText_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Text */, "splitText", []);
 
-  splitText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "splitText", [__arg_0]);
+  splitText_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Text */, "splitText", [__arg_0]);
 
 }
 
 class BlinkTextEvent extends BlinkUIEvent {
   static final instance = new BlinkTextEvent();
 
-  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "data");
+  data_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextEvent */, "data");
 
-  initTextEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", [__arg_0, __arg_1, __arg_2]);
+  initTextEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* TextEvent */, "initTextEvent", [__arg_0, __arg_1, __arg_2]);
 
-  initTextEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  initTextEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* TextEvent */, "initTextEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  initTextEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initTextEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  initTextEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* TextEvent */, "initTextEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkTextMetrics {
   static final instance = new BlinkTextMetrics();
 
-  actualBoundingBoxAscent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "actualBoundingBoxAscent");
+  actualBoundingBoxAscent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "actualBoundingBoxAscent");
 
-  actualBoundingBoxDescent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "actualBoundingBoxDescent");
+  actualBoundingBoxDescent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "actualBoundingBoxDescent");
 
-  actualBoundingBoxLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "actualBoundingBoxLeft");
+  actualBoundingBoxLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "actualBoundingBoxLeft");
 
-  actualBoundingBoxRight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "actualBoundingBoxRight");
+  actualBoundingBoxRight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "actualBoundingBoxRight");
 
-  alphabeticBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "alphabeticBaseline");
+  alphabeticBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "alphabeticBaseline");
 
-  emHeightAscent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "emHeightAscent");
+  emHeightAscent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "emHeightAscent");
 
-  emHeightDescent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "emHeightDescent");
+  emHeightDescent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "emHeightDescent");
 
-  fontBoundingBoxAscent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fontBoundingBoxAscent");
+  fontBoundingBoxAscent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "fontBoundingBoxAscent");
 
-  fontBoundingBoxDescent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "fontBoundingBoxDescent");
+  fontBoundingBoxDescent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "fontBoundingBoxDescent");
 
-  hangingBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hangingBaseline");
+  hangingBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "hangingBaseline");
 
-  ideographicBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ideographicBaseline");
+  ideographicBaseline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "ideographicBaseline");
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextMetrics */, "width");
 
 }
 
 class BlinkTextTrack extends BlinkEventTarget {
   static final instance = new BlinkTextTrack();
 
-  activeCues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "activeCues");
+  activeCues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "activeCues");
 
-  cues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "cues");
+  cues_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "cues");
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "id");
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "kind");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "label");
 
-  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "language");
 
-  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "mode");
+  mode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "mode");
 
-  mode_Setter_(mthis, __arg_0) => mthis["mode"] = __arg_0;
+  mode_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrack */, "mode", __arg_0);
 
-  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "oncuechange");
 
-  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+  oncuechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrack */, "oncuechange", __arg_0);
 
-  regions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "regions");
+  regions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrack */, "regions");
 
-  addCue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addCue", []);
+  addCue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "addCue", []);
 
-  addCue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addCue", [__arg_0]);
+  addCue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "addCue", [__arg_0]);
 
-  addRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "addRegion", []);
+  addRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "addRegion", []);
 
-  addRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "addRegion", [__arg_0]);
+  addRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "addRegion", [__arg_0]);
 
-  removeCue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeCue", []);
+  removeCue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "removeCue", []);
 
-  removeCue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeCue", [__arg_0]);
+  removeCue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "removeCue", [__arg_0]);
 
-  removeRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeRegion", []);
+  removeRegion_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "removeRegion", []);
 
-  removeRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeRegion", [__arg_0]);
+  removeRegion_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrack */, "removeRegion", [__arg_0]);
 
 }
 
 class BlinkTextTrackCue extends BlinkEventTarget {
   static final instance = new BlinkTextTrackCue();
 
-  endTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "endTime");
+  endTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCue */, "endTime");
 
-  endTime_Setter_(mthis, __arg_0) => mthis["endTime"] = __arg_0;
+  endTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackCue */, "endTime", __arg_0);
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCue */, "id");
 
-  id_Setter_(mthis, __arg_0) => mthis["id"] = __arg_0;
+  id_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackCue */, "id", __arg_0);
 
-  onenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onenter");
+  onenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCue */, "onenter");
 
-  onenter_Setter_(mthis, __arg_0) => mthis["onenter"] = __arg_0;
+  onenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackCue */, "onenter", __arg_0);
 
-  onexit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onexit");
+  onexit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCue */, "onexit");
 
-  onexit_Setter_(mthis, __arg_0) => mthis["onexit"] = __arg_0;
+  onexit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackCue */, "onexit", __arg_0);
 
-  pauseOnExit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pauseOnExit");
+  pauseOnExit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCue */, "pauseOnExit");
 
-  pauseOnExit_Setter_(mthis, __arg_0) => mthis["pauseOnExit"] = __arg_0;
+  pauseOnExit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackCue */, "pauseOnExit", __arg_0);
 
-  startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "startTime");
+  startTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCue */, "startTime");
 
-  startTime_Setter_(mthis, __arg_0) => mthis["startTime"] = __arg_0;
+  startTime_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackCue */, "startTime", __arg_0);
 
-  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
+  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCue */, "track");
 
 }
 
 class BlinkTextTrackCueList {
   static final instance = new BlinkTextTrackCueList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackCueList */, "length");
 
-  getCueById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCueById", []);
+  getCueById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackCueList */, "getCueById", []);
 
-  getCueById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getCueById", [__arg_0]);
+  getCueById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackCueList */, "getCueById", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackCueList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackCueList */, "item", [__arg_0]);
 
 }
 
 class BlinkTextTrackList extends BlinkEventTarget {
   static final instance = new BlinkTextTrackList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackList */, "length");
 
-  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
+  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackList */, "onaddtrack");
 
-  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
+  onaddtrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackList */, "onaddtrack", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackList */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackList */, "onchange", __arg_0);
 
-  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovetrack");
+  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TextTrackList */, "onremovetrack");
 
-  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
+  onremovetrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TextTrackList */, "onremovetrack", __arg_0);
 
-  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
+  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackList */, "getTrackById", []);
 
-  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
+  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackList */, "getTrackById", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TextTrackList */, "item", [__arg_0]);
 
 }
 
 class BlinkTimeRanges {
   static final instance = new BlinkTimeRanges();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TimeRanges */, "length");
 
-  end_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "end", []);
+  end_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TimeRanges */, "end", []);
 
-  end_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "end", [__arg_0]);
+  end_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TimeRanges */, "end", [__arg_0]);
 
-  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "start", []);
+  start_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TimeRanges */, "start", []);
 
-  start_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "start", [__arg_0]);
+  start_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TimeRanges */, "start", [__arg_0]);
 
 }
 
 class BlinkTimeoutHandler {
   static final instance = new BlinkTimeoutHandler();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TimeoutHandler */, "handleEvent", []);
 
 }
 
 class BlinkTouch {
   static final instance = new BlinkTouch();
 
-  clientX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientX");
+  clientX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "clientX");
 
-  clientY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientY");
+  clientY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "clientY");
 
-  force_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "force");
+  force_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "force");
 
-  identifier_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "identifier");
+  identifier_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "identifier");
 
-  pageX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageX");
+  pageX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "pageX");
 
-  pageY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageY");
+  pageY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "pageY");
 
-  radiusX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiusX");
+  radiusX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "radiusX");
 
-  radiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "radiusY");
+  radiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "radiusY");
 
-  rotationAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rotationAngle");
+  rotationAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "rotationAngle");
 
-  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenX");
+  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "screenX");
 
-  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenY");
+  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "screenY");
 
-  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "target");
+  target_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "target");
 
-  webkitForce_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitForce");
+  webkitForce_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "webkitForce");
 
-  webkitRadiusX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitRadiusX");
+  webkitRadiusX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "webkitRadiusX");
 
-  webkitRadiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitRadiusY");
+  webkitRadiusY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "webkitRadiusY");
 
-  webkitRotationAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitRotationAngle");
+  webkitRotationAngle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Touch */, "webkitRotationAngle");
 
 }
 
 class BlinkTouchEvent extends BlinkUIEvent {
   static final instance = new BlinkTouchEvent();
 
-  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "altKey");
+  altKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchEvent */, "altKey");
 
-  changedTouches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "changedTouches");
+  changedTouches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchEvent */, "changedTouches");
 
-  ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ctrlKey");
+  ctrlKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchEvent */, "ctrlKey");
 
-  metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "metaKey");
+  metaKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchEvent */, "metaKey");
 
-  shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "shiftKey");
+  shiftKey_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchEvent */, "shiftKey");
 
-  targetTouches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "targetTouches");
+  targetTouches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchEvent */, "targetTouches");
 
-  touches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "touches");
+  touches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchEvent */, "touches");
 
-  initTouchEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+  initTouchEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis /* TouchEvent */, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
 
-  initTouchEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11]);
+  initTouchEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => Blink_JsNative_DomException.callMethod(mthis /* TouchEvent */, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11]);
 
-  initTouchEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
+  initTouchEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => Blink_JsNative_DomException.callMethod(mthis /* TouchEvent */, "initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12]);
 
 }
 
 class BlinkTouchList {
   static final instance = new BlinkTouchList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TouchList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TouchList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TouchList */, "item", [__arg_0]);
 
 }
 
 class BlinkTrackDefault {
   static final instance = new BlinkTrackDefault();
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("TrackDefault", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("TrackDefault", [__arg_0, __arg_1, __arg_2]);
 
-  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1, __arg_2, __arg_3]);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callConstructor("TrackDefault", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefault"), [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callConstructor("TrackDefault", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  byteStreamTrackID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "byteStreamTrackID");
+  byteStreamTrackID_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TrackDefault */, "byteStreamTrackID");
 
-  kinds_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kinds");
+  kinds_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TrackDefault */, "kinds");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TrackDefault */, "label");
 
-  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TrackDefault */, "language");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TrackDefault */, "type");
 
 }
 
 class BlinkTrackDefaultList {
   static final instance = new BlinkTrackDefaultList();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefaultList"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("TrackDefaultList");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackDefaultList"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("TrackDefaultList", [__arg_0]);
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TrackDefaultList */, "length");
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TrackDefaultList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* TrackDefaultList */, "item", [__arg_0]);
 
 }
 
 class BlinkTrackEvent extends BlinkEvent {
   static final instance = new BlinkTrackEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("TrackEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("TrackEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TrackEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("TrackEvent", [__arg_0, __arg_1]);
 
-  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
+  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TrackEvent */, "track");
 
 }
 
 class BlinkTransitionEvent extends BlinkEvent {
   static final instance = new BlinkTransitionEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TransitionEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("TransitionEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TransitionEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("TransitionEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "TransitionEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("TransitionEvent", [__arg_0, __arg_1]);
 
-  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "elapsedTime");
+  elapsedTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TransitionEvent */, "elapsedTime");
 
-  propertyName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "propertyName");
+  propertyName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TransitionEvent */, "propertyName");
 
-  pseudoElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pseudoElement");
+  pseudoElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TransitionEvent */, "pseudoElement");
 
 }
 
 class BlinkTreeWalker {
   static final instance = new BlinkTreeWalker();
 
-  currentNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentNode");
+  currentNode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TreeWalker */, "currentNode");
 
-  currentNode_Setter_(mthis, __arg_0) => mthis["currentNode"] = __arg_0;
+  currentNode_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* TreeWalker */, "currentNode", __arg_0);
 
-  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "filter");
+  filter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TreeWalker */, "filter");
 
-  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "root");
+  root_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TreeWalker */, "root");
 
-  whatToShow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "whatToShow");
+  whatToShow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* TreeWalker */, "whatToShow");
 
-  firstChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "firstChild", []);
+  firstChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TreeWalker */, "firstChild", []);
 
-  lastChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lastChild", []);
+  lastChild_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TreeWalker */, "lastChild", []);
 
-  nextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "nextNode", []);
+  nextNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TreeWalker */, "nextNode", []);
 
-  nextSibling_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "nextSibling", []);
+  nextSibling_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TreeWalker */, "nextSibling", []);
 
-  parentNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "parentNode", []);
+  parentNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TreeWalker */, "parentNode", []);
 
-  previousNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "previousNode", []);
+  previousNode_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TreeWalker */, "previousNode", []);
 
-  previousSibling_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "previousSibling", []);
+  previousSibling_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* TreeWalker */, "previousSibling", []);
 
 }
 
 class BlinkUIEvent extends BlinkEvent {
   static final instance = new BlinkUIEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "UIEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("UIEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "UIEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("UIEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "UIEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("UIEvent", [__arg_0, __arg_1]);
 
-  charCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "charCode");
+  charCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* UIEvent */, "charCode");
 
-  detail_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "detail");
+  detail_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* UIEvent */, "detail");
 
-  keyCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "keyCode");
+  keyCode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* UIEvent */, "keyCode");
 
-  sourceDevice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sourceDevice");
+  sourceDevice_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* UIEvent */, "sourceDevice");
 
-  view_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "view");
+  view_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* UIEvent */, "view");
 
-  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "which");
+  which_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* UIEvent */, "which");
 
-  initUIEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", [__arg_0, __arg_1, __arg_2]);
+  initUIEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* UIEvent */, "initUIEvent", [__arg_0, __arg_1, __arg_2]);
 
-  initUIEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  initUIEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* UIEvent */, "initUIEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  initUIEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "initUIEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  initUIEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* UIEvent */, "initUIEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkURL {
   static final instance = new BlinkURL();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "URL"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("URL");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "URL"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("URL", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "URL"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("URL", [__arg_0, __arg_1]);
 
-  createObjectURL_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "createObjectURL", []);
+  createObjectURL_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL") /* URL */, "createObjectURL", []);
 
-  createObjectURL_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "createObjectURL", [__arg_0]);
+  createObjectURL_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL") /* URL */, "createObjectURL", [__arg_0]);
 
-  revokeObjectURL_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "revokeObjectURL", []);
+  revokeObjectURL_Callback_0_() => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL") /* URL */, "revokeObjectURL", []);
 
-  revokeObjectURL_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL"), "revokeObjectURL", [__arg_0]);
+  revokeObjectURL_Callback_1_(__arg_0) => Blink_JsNative_DomException.callMethod(Blink_JsNative_DomException.getProperty(js.context, "URL") /* URL */, "revokeObjectURL", [__arg_0]);
 
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hash");
 
-  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+  hash_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hash", __arg_0);
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "host");
 
-  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+  host_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "host", __arg_0);
 
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hostname");
 
-  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+  hostname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hostname", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "href");
 
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+  href_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "href", __arg_0);
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "origin");
 
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "password");
 
-  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
+  password_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "password", __arg_0);
 
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "pathname");
 
-  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+  pathname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "pathname", __arg_0);
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "port");
 
-  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+  port_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "port", __arg_0);
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "protocol");
 
-  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+  protocol_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "protocol", __arg_0);
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "search");
 
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+  search_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "search", __arg_0);
 
-  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
+  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "username");
 
-  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
+  username_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "username", __arg_0);
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* URLUtils */, "toString", []);
 
 }
 
 class BlinkURLUtils {
   static final instance = new BlinkURLUtils();
 
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hash");
 
-  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
+  hash_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hash", __arg_0);
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "host");
 
-  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
+  host_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "host", __arg_0);
 
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "hostname");
 
-  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
+  hostname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "hostname", __arg_0);
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "href");
 
-  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
+  href_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "href", __arg_0);
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "origin");
 
-  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "password");
+  password_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "password");
 
-  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
+  password_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "password", __arg_0);
 
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "pathname");
 
-  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
+  pathname_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "pathname", __arg_0);
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "port");
 
-  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
+  port_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "port", __arg_0);
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "protocol");
 
-  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
+  protocol_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "protocol", __arg_0);
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "search");
 
-  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
+  search_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "search", __arg_0);
 
-  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "username");
+  username_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtils */, "username");
 
-  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
+  username_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* URLUtils */, "username", __arg_0);
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* URLUtils */, "toString", []);
 
 }
 
 class BlinkURLUtilsReadOnly {
   static final instance = new BlinkURLUtilsReadOnly();
 
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "hash");
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "host");
 
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "hostname");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "href");
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "origin");
 
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "pathname");
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "port");
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "protocol");
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "search");
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* URLUtilsReadOnly */, "toString", []);
 
 }
 
@@ -17498,2662 +17498,2662 @@
 class BlinkVRDevice {
   static final instance = new BlinkVRDevice();
 
-  deviceId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deviceId");
+  deviceId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRDevice */, "deviceId");
 
-  deviceName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deviceName");
+  deviceName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRDevice */, "deviceName");
 
-  hardwareUnitId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareUnitId");
+  hardwareUnitId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRDevice */, "hardwareUnitId");
 
 }
 
 class BlinkVREyeParameters {
   static final instance = new BlinkVREyeParameters();
 
-  currentFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "currentFieldOfView");
+  currentFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VREyeParameters */, "currentFieldOfView");
 
-  eyeTranslation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "eyeTranslation");
+  eyeTranslation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VREyeParameters */, "eyeTranslation");
 
-  maximumFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "maximumFieldOfView");
+  maximumFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VREyeParameters */, "maximumFieldOfView");
 
-  minimumFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "minimumFieldOfView");
+  minimumFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VREyeParameters */, "minimumFieldOfView");
 
-  recommendedFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "recommendedFieldOfView");
+  recommendedFieldOfView_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VREyeParameters */, "recommendedFieldOfView");
 
-  renderRect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "renderRect");
+  renderRect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VREyeParameters */, "renderRect");
 
 }
 
 class BlinkVRFieldOfView {
   static final instance = new BlinkVRFieldOfView();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VRFieldOfView"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("VRFieldOfView");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VRFieldOfView"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("VRFieldOfView", [__arg_0]);
 
-  downDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "downDegrees");
+  downDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRFieldOfView */, "downDegrees");
 
-  downDegrees_Setter_(mthis, __arg_0) => mthis["downDegrees"] = __arg_0;
+  downDegrees_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VRFieldOfView */, "downDegrees", __arg_0);
 
-  leftDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "leftDegrees");
+  leftDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRFieldOfView */, "leftDegrees");
 
-  leftDegrees_Setter_(mthis, __arg_0) => mthis["leftDegrees"] = __arg_0;
+  leftDegrees_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VRFieldOfView */, "leftDegrees", __arg_0);
 
-  rightDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rightDegrees");
+  rightDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRFieldOfView */, "rightDegrees");
 
-  rightDegrees_Setter_(mthis, __arg_0) => mthis["rightDegrees"] = __arg_0;
+  rightDegrees_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VRFieldOfView */, "rightDegrees", __arg_0);
 
-  upDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upDegrees");
+  upDegrees_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRFieldOfView */, "upDegrees");
 
-  upDegrees_Setter_(mthis, __arg_0) => mthis["upDegrees"] = __arg_0;
+  upDegrees_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VRFieldOfView */, "upDegrees", __arg_0);
 
 }
 
 class BlinkVRPositionState {
   static final instance = new BlinkVRPositionState();
 
-  angularAcceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angularAcceleration");
+  angularAcceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRPositionState */, "angularAcceleration");
 
-  angularVelocity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "angularVelocity");
+  angularVelocity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRPositionState */, "angularVelocity");
 
-  linearAcceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "linearAcceleration");
+  linearAcceleration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRPositionState */, "linearAcceleration");
 
-  linearVelocity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "linearVelocity");
+  linearVelocity_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRPositionState */, "linearVelocity");
 
-  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientation");
+  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRPositionState */, "orientation");
 
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRPositionState */, "position");
 
-  timeStamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeStamp");
+  timeStamp_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VRPositionState */, "timeStamp");
 
 }
 
 class BlinkVTTCue extends BlinkTextTrackCue {
   static final instance = new BlinkVTTCue();
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VTTCue"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("VTTCue", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VTTCue"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("VTTCue", [__arg_0, __arg_1]);
 
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VTTCue"), [__arg_0, __arg_1, __arg_2]);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callConstructor("VTTCue", [__arg_0, __arg_1, __arg_2]);
 
-  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "align");
+  align_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "align");
 
-  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
+  align_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "align", __arg_0);
 
-  line_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "line");
+  line_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "line");
 
-  line_Setter_(mthis, __arg_0) => mthis["line"] = __arg_0;
+  line_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "line", __arg_0);
 
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "position");
 
-  position_Setter_(mthis, __arg_0) => mthis["position"] = __arg_0;
+  position_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "position", __arg_0);
 
-  regionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "regionId");
+  regionId_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "regionId");
 
-  regionId_Setter_(mthis, __arg_0) => mthis["regionId"] = __arg_0;
+  regionId_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "regionId", __arg_0);
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "size");
 
-  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
+  size_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "size", __arg_0);
 
-  snapToLines_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "snapToLines");
+  snapToLines_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "snapToLines");
 
-  snapToLines_Setter_(mthis, __arg_0) => mthis["snapToLines"] = __arg_0;
+  snapToLines_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "snapToLines", __arg_0);
 
-  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "text");
+  text_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "text");
 
-  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
+  text_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "text", __arg_0);
 
-  vertical_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "vertical");
+  vertical_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTCue */, "vertical");
 
-  vertical_Setter_(mthis, __arg_0) => mthis["vertical"] = __arg_0;
+  vertical_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTCue */, "vertical", __arg_0);
 
-  getCueAsHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getCueAsHTML", []);
+  getCueAsHTML_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* VTTCue */, "getCueAsHTML", []);
 
 }
 
 class BlinkVTTRegion {
   static final instance = new BlinkVTTRegion();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "VTTRegion"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("VTTRegion");
 
-  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "height");
+  height_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "height");
 
-  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
+  height_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "height", __arg_0);
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "id");
 
-  id_Setter_(mthis, __arg_0) => mthis["id"] = __arg_0;
+  id_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "id", __arg_0);
 
-  regionAnchorX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "regionAnchorX");
+  regionAnchorX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "regionAnchorX");
 
-  regionAnchorX_Setter_(mthis, __arg_0) => mthis["regionAnchorX"] = __arg_0;
+  regionAnchorX_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "regionAnchorX", __arg_0);
 
-  regionAnchorY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "regionAnchorY");
+  regionAnchorY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "regionAnchorY");
 
-  regionAnchorY_Setter_(mthis, __arg_0) => mthis["regionAnchorY"] = __arg_0;
+  regionAnchorY_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "regionAnchorY", __arg_0);
 
-  scroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scroll");
+  scroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "scroll");
 
-  scroll_Setter_(mthis, __arg_0) => mthis["scroll"] = __arg_0;
+  scroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "scroll", __arg_0);
 
-  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "track");
+  track_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "track");
 
-  viewportAnchorX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewportAnchorX");
+  viewportAnchorX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "viewportAnchorX");
 
-  viewportAnchorX_Setter_(mthis, __arg_0) => mthis["viewportAnchorX"] = __arg_0;
+  viewportAnchorX_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "viewportAnchorX", __arg_0);
 
-  viewportAnchorY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "viewportAnchorY");
+  viewportAnchorY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "viewportAnchorY");
 
-  viewportAnchorY_Setter_(mthis, __arg_0) => mthis["viewportAnchorY"] = __arg_0;
+  viewportAnchorY_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "viewportAnchorY", __arg_0);
 
-  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "width");
+  width_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegion */, "width");
 
-  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
+  width_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VTTRegion */, "width", __arg_0);
 
 }
 
 class BlinkVTTRegionList {
   static final instance = new BlinkVTTRegionList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VTTRegionList */, "length");
 
-  getRegionById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRegionById", []);
+  getRegionById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* VTTRegionList */, "getRegionById", []);
 
-  getRegionById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRegionById", [__arg_0]);
+  getRegionById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* VTTRegionList */, "getRegionById", [__arg_0]);
 
-  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "item", []);
+  item_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* VTTRegionList */, "item", []);
 
-  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "item", [__arg_0]);
+  item_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* VTTRegionList */, "item", [__arg_0]);
 
 }
 
 class BlinkValidityState {
   static final instance = new BlinkValidityState();
 
-  badInput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "badInput");
+  badInput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "badInput");
 
-  customError_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "customError");
+  customError_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "customError");
 
-  patternMismatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "patternMismatch");
+  patternMismatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "patternMismatch");
 
-  rangeOverflow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rangeOverflow");
+  rangeOverflow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "rangeOverflow");
 
-  rangeUnderflow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rangeUnderflow");
+  rangeUnderflow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "rangeUnderflow");
 
-  stepMismatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stepMismatch");
+  stepMismatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "stepMismatch");
 
-  tooLong_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tooLong");
+  tooLong_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "tooLong");
 
-  tooShort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "tooShort");
+  tooShort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "tooShort");
 
-  typeMismatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "typeMismatch");
+  typeMismatch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "typeMismatch");
 
-  valid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valid");
+  valid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "valid");
 
-  valueMissing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "valueMissing");
+  valueMissing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* ValidityState */, "valueMissing");
 
 }
 
 class BlinkVideoPlaybackQuality {
   static final instance = new BlinkVideoPlaybackQuality();
 
-  corruptedVideoFrames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "corruptedVideoFrames");
+  corruptedVideoFrames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoPlaybackQuality */, "corruptedVideoFrames");
 
-  creationTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "creationTime");
+  creationTime_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoPlaybackQuality */, "creationTime");
 
-  droppedVideoFrames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "droppedVideoFrames");
+  droppedVideoFrames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoPlaybackQuality */, "droppedVideoFrames");
 
-  totalVideoFrames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "totalVideoFrames");
+  totalVideoFrames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoPlaybackQuality */, "totalVideoFrames");
 
 }
 
 class BlinkVideoTrack {
   static final instance = new BlinkVideoTrack();
 
-  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "id");
+  id_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrack */, "id");
 
-  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "kind");
+  kind_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrack */, "kind");
 
-  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "label");
+  label_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrack */, "label");
 
-  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "language");
+  language_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrack */, "language");
 
-  selected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selected");
+  selected_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrack */, "selected");
 
-  selected_Setter_(mthis, __arg_0) => mthis["selected"] = __arg_0;
+  selected_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VideoTrack */, "selected", __arg_0);
 
 }
 
 class BlinkVideoTrackList extends BlinkEventTarget {
   static final instance = new BlinkVideoTrackList();
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrackList */, "length");
 
-  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onaddtrack");
+  onaddtrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrackList */, "onaddtrack");
 
-  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
+  onaddtrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VideoTrackList */, "onaddtrack", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrackList */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VideoTrackList */, "onchange", __arg_0);
 
-  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onremovetrack");
+  onremovetrack_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrackList */, "onremovetrack");
 
-  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
+  onremovetrack_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* VideoTrackList */, "onremovetrack", __arg_0);
 
-  selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "selectedIndex");
+  selectedIndex_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* VideoTrackList */, "selectedIndex");
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* VideoTrackList */, "__getter__", [__arg_0]);
 
-  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", []);
+  getTrackById_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* VideoTrackList */, "getTrackById", []);
 
-  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTrackById", [__arg_0]);
+  getTrackById_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* VideoTrackList */, "getTrackById", [__arg_0]);
 
 }
 
 class BlinkVoidCallback {
   static final instance = new BlinkVoidCallback();
 
-  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "handleEvent", []);
+  handleEvent_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* VoidCallback */, "handleEvent", []);
 
 }
 
 class BlinkWaveShaperNode extends BlinkAudioNode {
   static final instance = new BlinkWaveShaperNode();
 
-  curve_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "curve");
+  curve_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WaveShaperNode */, "curve");
 
-  curve_Setter_(mthis, __arg_0) => mthis["curve"] = __arg_0;
+  curve_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WaveShaperNode */, "curve", __arg_0);
 
-  oversample_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oversample");
+  oversample_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WaveShaperNode */, "oversample");
 
-  oversample_Setter_(mthis, __arg_0) => mthis["oversample"] = __arg_0;
+  oversample_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WaveShaperNode */, "oversample", __arg_0);
 
 }
 
 class BlinkWebGL2RenderingContext {
   static final instance = new BlinkWebGL2RenderingContext();
 
-  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "canvas");
 
-  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferHeight");
 
-  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferWidth");
 
-  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
+  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", []);
 
-  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", [__arg_0]);
+  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", [__arg_0]);
 
-  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", []);
+  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", []);
 
-  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0]);
+  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0]);
 
-  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0, __arg_1]);
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0]);
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0]);
 
-  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1]);
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
 
-  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", []);
+  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", []);
 
-  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0]);
+  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0]);
 
-  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0, __arg_1]);
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0, __arg_1]);
 
-  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", []);
+  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", []);
 
-  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0]);
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0]);
 
-  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0, __arg_1]);
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0, __arg_1]);
 
-  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", []);
+  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", []);
 
-  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0]);
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0]);
 
-  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0, __arg_1]);
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0, __arg_1]);
 
-  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", []);
+  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", []);
 
-  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0]);
+  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0]);
 
-  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0, __arg_1]);
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0, __arg_1]);
 
-  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1]);
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1]);
 
-  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2]);
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2]);
 
-  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", []);
 
-  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", [__arg_0]);
 
-  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
+  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", []);
 
-  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0]);
 
-  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0, __arg_1]);
 
-  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", []);
 
-  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0]);
 
-  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
+  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0]);
 
-  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1]);
 
-  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1, __arg_2]);
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1, __arg_2]);
 
-  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0]);
+  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0]);
 
-  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1]);
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1]);
 
-  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
+  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", []);
 
-  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", []);
 
-  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", [__arg_0]);
 
-  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1]);
 
-  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2]);
 
-  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", []);
+  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", []);
 
-  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", [__arg_0]);
+  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", [__arg_0]);
 
-  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", []);
+  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", []);
 
-  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
+  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", [__arg_0]);
 
-  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1]);
 
-  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2]);
 
-  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", []);
+  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", []);
 
-  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", [__arg_0]);
+  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", [__arg_0]);
 
-  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", []);
+  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createBuffer", []);
 
-  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createFramebuffer", []);
+  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createFramebuffer", []);
 
-  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProgram", []);
+  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createProgram", []);
 
-  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRenderbuffer", []);
+  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createRenderbuffer", []);
 
-  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShader", []);
+  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", []);
 
-  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShader", [__arg_0]);
+  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", [__arg_0]);
 
-  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTexture", []);
+  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createTexture", []);
 
-  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", []);
+  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", []);
 
-  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", [__arg_0]);
+  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", [__arg_0]);
 
-  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", []);
+  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", []);
 
-  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", [__arg_0]);
+  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", [__arg_0]);
 
-  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", []);
+  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", []);
 
-  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", [__arg_0]);
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", [__arg_0]);
 
-  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", []);
+  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", []);
 
-  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", [__arg_0]);
+  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", [__arg_0]);
 
-  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", []);
+  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", []);
 
-  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", [__arg_0]);
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", [__arg_0]);
 
-  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", []);
+  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", []);
 
-  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", [__arg_0]);
+  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", [__arg_0]);
 
-  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", []);
+  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", []);
 
-  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", [__arg_0]);
+  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", [__arg_0]);
 
-  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", []);
+  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", []);
 
-  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", [__arg_0]);
+  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", [__arg_0]);
 
-  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", []);
+  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", []);
 
-  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", [__arg_0]);
+  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", [__arg_0]);
 
-  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", []);
+  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", []);
 
-  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0]);
+  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0]);
 
-  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0, __arg_1]);
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0, __arg_1]);
 
-  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", []);
+  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", []);
 
-  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0]);
+  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0]);
 
-  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0, __arg_1]);
 
-  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
+  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", []);
 
-  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
+  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", [__arg_0]);
 
-  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", []);
 
-  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", [__arg_0]);
 
-  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
+  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0]);
 
-  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1]);
 
-  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1, __arg_2]);
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1]);
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1]);
 
-  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2]);
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", []);
 
-  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", [__arg_0]);
 
-  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
+  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", []);
 
-  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", [__arg_0]);
 
-  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "finish", []);
 
-  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
+  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "flush", []);
 
-  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1]);
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1]);
 
-  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", []);
+  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", []);
 
-  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", [__arg_0]);
+  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", [__arg_0]);
 
-  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", []);
+  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", []);
 
-  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", [__arg_0]);
+  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", [__arg_0]);
 
-  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", []);
+  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", []);
 
-  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0]);
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0]);
 
-  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0, __arg_1]);
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0, __arg_1]);
 
-  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", []);
+  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", []);
 
-  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0]);
+  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0]);
 
-  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0, __arg_1]);
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0, __arg_1]);
 
-  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", []);
+  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", []);
 
-  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", [__arg_0]);
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", [__arg_0]);
 
-  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", []);
+  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", []);
 
-  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0]);
+  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0]);
 
-  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0, __arg_1]);
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0, __arg_1]);
 
-  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", []);
+  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", []);
 
-  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0]);
+  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0]);
 
-  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0, __arg_1]);
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0, __arg_1]);
 
-  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getContextAttributes", []);
 
-  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getError", []);
+  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getError", []);
 
-  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", []);
+  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", []);
 
-  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", [__arg_0]);
+  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0]);
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
 
-  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", []);
 
-  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", [__arg_0]);
 
-  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", []);
+  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", []);
 
-  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", [__arg_0]);
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", [__arg_0]);
 
-  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", []);
+  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", []);
 
-  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0]);
+  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0]);
 
-  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0, __arg_1]);
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0, __arg_1]);
 
-  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", []);
+  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", []);
 
-  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0]);
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0]);
 
-  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0, __arg_1]);
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0, __arg_1]);
 
-  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", []);
+  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", []);
 
-  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", [__arg_0]);
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", [__arg_0]);
 
-  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", []);
+  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", []);
 
-  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0]);
+  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0]);
 
-  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0, __arg_1]);
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0, __arg_1]);
 
-  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", []);
+  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", []);
 
-  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0]);
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0]);
 
-  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
 
-  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", []);
+  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", []);
 
-  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", [__arg_0]);
+  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", [__arg_0]);
 
-  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSupportedExtensions", []);
+  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getSupportedExtensions", []);
 
-  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", []);
+  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", []);
 
-  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0]);
+  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0]);
 
-  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0, __arg_1]);
 
-  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
+  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", []);
 
-  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
+  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0]);
 
-  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0, __arg_1]);
 
-  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", []);
 
-  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0]);
 
-  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0, __arg_1]);
 
-  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
+  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", []);
 
-  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0]);
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0]);
 
-  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0, __arg_1]);
 
-  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", []);
 
-  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0]);
 
-  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0, __arg_1]);
 
-  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
+  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", []);
 
-  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
+  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0]);
 
-  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0, __arg_1]);
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0, __arg_1]);
 
-  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", []);
+  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", []);
 
-  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", [__arg_0]);
+  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", [__arg_0]);
 
-  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isContextLost", []);
 
-  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", []);
+  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", []);
 
-  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", [__arg_0]);
+  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", [__arg_0]);
 
-  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", []);
+  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", []);
 
-  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", [__arg_0]);
+  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", [__arg_0]);
 
-  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", []);
+  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", []);
 
-  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", [__arg_0]);
+  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", [__arg_0]);
 
-  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", []);
+  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", []);
 
-  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", [__arg_0]);
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", [__arg_0]);
 
-  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isShader", []);
+  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", []);
 
-  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isShader", [__arg_0]);
+  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", [__arg_0]);
 
-  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", []);
+  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", []);
 
-  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", [__arg_0]);
+  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", [__arg_0]);
 
-  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", []);
+  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", []);
 
-  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", [__arg_0]);
+  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", [__arg_0]);
 
-  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", []);
+  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", []);
 
-  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", [__arg_0]);
+  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", [__arg_0]);
 
-  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", []);
+  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", []);
 
-  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0]);
+  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0]);
 
-  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0, __arg_1]);
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0, __arg_1]);
 
-  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", []);
+  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", []);
 
-  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0]);
+  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0]);
 
-  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0, __arg_1]);
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0, __arg_1]);
 
-  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1]);
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1]);
 
-  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
 
-  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", []);
+  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", []);
 
-  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0]);
+  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0]);
 
-  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0, __arg_1]);
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0, __arg_1]);
 
-  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1]);
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1]);
 
-  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2]);
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2]);
 
-  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", []);
+  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", []);
 
-  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0]);
+  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0]);
 
-  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0]);
 
-  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1]);
 
-  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", []);
 
-  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", [__arg_0]);
 
-  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
+  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", []);
 
-  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0]);
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0]);
 
-  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
+  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0]);
 
-  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1]);
 
-  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0]);
+  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0]);
 
-  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1]);
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1]);
 
-  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1, __arg_2]);
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1, __arg_2]);
 
-  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0]);
+  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0]);
 
-  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1]);
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1]);
 
-  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1, __arg_2]);
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1, __arg_2]);
 
-  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", []);
+  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", []);
 
-  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0]);
+  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0]);
 
-  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0, __arg_1]);
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0, __arg_1]);
 
-  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", []);
+  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", []);
 
-  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0]);
+  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0]);
 
-  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0, __arg_1]);
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0, __arg_1]);
 
-  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", []);
+  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", []);
 
-  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0]);
+  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0]);
 
-  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0, __arg_1]);
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0, __arg_1]);
 
-  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", []);
+  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", []);
 
-  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0]);
+  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0]);
 
-  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0, __arg_1]);
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0]);
+  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0]);
 
-  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1]);
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1, __arg_2]);
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", []);
+  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", []);
 
-  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0]);
+  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0]);
 
-  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0, __arg_1]);
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0]);
+  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0]);
 
-  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1]);
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1, __arg_2]);
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", []);
+  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", []);
 
-  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0]);
+  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0]);
 
-  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0, __arg_1]);
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1]);
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2]);
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", []);
+  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", []);
 
-  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0]);
+  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0]);
 
-  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0, __arg_1]);
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1]);
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2]);
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", []);
+  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", []);
 
-  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0]);
+  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0]);
 
-  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0, __arg_1]);
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0, __arg_1]);
 
-  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2]);
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", []);
+  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", []);
 
-  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0]);
+  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0]);
 
-  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0, __arg_1]);
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0, __arg_1]);
 
-  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2]);
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", []);
+  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", []);
 
-  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0]);
+  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0]);
 
-  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0, __arg_1]);
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0]);
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0]);
 
-  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1]);
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0]);
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0]);
 
-  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1]);
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0]);
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0]);
 
-  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1]);
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
 
-  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", []);
+  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", []);
 
-  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", [__arg_0]);
+  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", [__arg_0]);
 
-  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", []);
+  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", []);
 
-  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", [__arg_0]);
+  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", [__arg_0]);
 
-  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", []);
+  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", []);
 
-  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0]);
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0]);
 
-  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0, __arg_1]);
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0, __arg_1]);
 
-  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", []);
+  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", []);
 
-  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0]);
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0]);
 
-  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0, __arg_1]);
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0]);
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0]);
 
-  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1]);
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", []);
+  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", []);
 
-  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0]);
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0]);
 
-  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0, __arg_1]);
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1]);
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", []);
+  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", []);
 
-  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0]);
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0]);
 
-  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0, __arg_1]);
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0, __arg_1]);
 
-  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", []);
+  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", []);
 
-  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0]);
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0]);
 
-  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0, __arg_1]);
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0, __arg_1]);
 
-  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1]);
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1]);
 
-  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2]);
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2]);
 
-  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  beginQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", []);
+  beginQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginQuery", []);
 
-  beginQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0]);
+  beginQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginQuery", [__arg_0]);
 
-  beginQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0, __arg_1]);
+  beginQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginQuery", [__arg_0, __arg_1]);
 
-  beginTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", []);
+  beginTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginTransformFeedback", []);
 
-  beginTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", [__arg_0]);
+  beginTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginTransformFeedback", [__arg_0]);
 
-  bindBufferBase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0]);
+  bindBufferBase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferBase", [__arg_0]);
 
-  bindBufferBase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1]);
+  bindBufferBase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferBase", [__arg_0, __arg_1]);
 
-  bindBufferBase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1, __arg_2]);
+  bindBufferBase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferBase", [__arg_0, __arg_1, __arg_2]);
 
-  bindBufferRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2]);
+  bindBufferRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferRange", [__arg_0, __arg_1, __arg_2]);
 
-  bindBufferRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  bindBufferRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bindBufferRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  bindBufferRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bindSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", []);
+  bindSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindSampler", []);
 
-  bindSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0]);
+  bindSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindSampler", [__arg_0]);
 
-  bindSampler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0, __arg_1]);
+  bindSampler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindSampler", [__arg_0, __arg_1]);
 
-  bindTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", []);
+  bindTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindTransformFeedback", []);
 
-  bindTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0]);
+  bindTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindTransformFeedback", [__arg_0]);
 
-  bindTransformFeedback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0, __arg_1]);
+  bindTransformFeedback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindTransformFeedback", [__arg_0, __arg_1]);
 
-  bindVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", []);
+  bindVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindVertexArray", []);
 
-  bindVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", [__arg_0]);
+  bindVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindVertexArray", [__arg_0]);
 
-  blitFramebuffer_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  blitFramebuffer_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  blitFramebuffer_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  blitFramebuffer_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  blitFramebuffer_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  blitFramebuffer_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  clearBufferfi_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1]);
+  clearBufferfi_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfi", [__arg_0, __arg_1]);
 
-  clearBufferfi_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2]);
+  clearBufferfi_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfi", [__arg_0, __arg_1, __arg_2]);
 
-  clearBufferfi_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  clearBufferfi_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfi", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  clearBufferfv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0]);
+  clearBufferfv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfv", [__arg_0]);
 
-  clearBufferfv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1]);
+  clearBufferfv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfv", [__arg_0, __arg_1]);
 
-  clearBufferfv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1, __arg_2]);
+  clearBufferfv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfv", [__arg_0, __arg_1, __arg_2]);
 
-  clearBufferiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0]);
+  clearBufferiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferiv", [__arg_0]);
 
-  clearBufferiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1]);
+  clearBufferiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferiv", [__arg_0, __arg_1]);
 
-  clearBufferiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1, __arg_2]);
+  clearBufferiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferiv", [__arg_0, __arg_1, __arg_2]);
 
-  clearBufferuiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0]);
+  clearBufferuiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferuiv", [__arg_0]);
 
-  clearBufferuiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1]);
+  clearBufferuiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferuiv", [__arg_0, __arg_1]);
 
-  clearBufferuiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1, __arg_2]);
+  clearBufferuiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferuiv", [__arg_0, __arg_1, __arg_2]);
 
-  clientWaitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0]);
+  clientWaitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clientWaitSync", [__arg_0]);
 
-  clientWaitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1]);
+  clientWaitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clientWaitSync", [__arg_0, __arg_1]);
 
-  clientWaitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1, __arg_2]);
+  clientWaitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clientWaitSync", [__arg_0, __arg_1, __arg_2]);
 
-  compressedTexImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  compressedTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  compressedTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  compressedTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  compressedTexSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  compressedTexSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  copyBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2]);
+  copyBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyBufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  copyBufferSubData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  copyBufferSubData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  copyBufferSubData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  copyBufferSubData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  copyTexSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  copyTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  createQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createQuery", []);
+  createQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createQuery", []);
 
-  createSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSampler", []);
+  createSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createSampler", []);
 
-  createTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTransformFeedback", []);
+  createTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createTransformFeedback", []);
 
-  createVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createVertexArray", []);
+  createVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createVertexArray", []);
 
-  deleteQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", []);
+  deleteQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteQuery", []);
 
-  deleteQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", [__arg_0]);
+  deleteQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteQuery", [__arg_0]);
 
-  deleteSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", []);
+  deleteSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSampler", []);
 
-  deleteSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", [__arg_0]);
+  deleteSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSampler", [__arg_0]);
 
-  deleteSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", []);
+  deleteSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSync", []);
 
-  deleteSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", [__arg_0]);
+  deleteSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSync", [__arg_0]);
 
-  deleteTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", []);
+  deleteTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteTransformFeedback", []);
 
-  deleteTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", [__arg_0]);
+  deleteTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteTransformFeedback", [__arg_0]);
 
-  deleteVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", []);
+  deleteVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteVertexArray", []);
 
-  deleteVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", [__arg_0]);
+  deleteVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteVertexArray", [__arg_0]);
 
-  drawArraysInstanced_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1]);
+  drawArraysInstanced_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawArraysInstanced", [__arg_0, __arg_1]);
 
-  drawArraysInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2]);
+  drawArraysInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2]);
 
-  drawArraysInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawArraysInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawBuffers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", []);
+  drawBuffers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawBuffers", []);
 
-  drawBuffers_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", [__arg_0]);
+  drawBuffers_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawBuffers", [__arg_0]);
 
-  drawElementsInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2]);
+  drawElementsInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2]);
 
-  drawElementsInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawElementsInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawElementsInstanced_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  drawElementsInstanced_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  drawRangeElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawRangeElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawRangeElements_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  drawRangeElements_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  drawRangeElements_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  drawRangeElements_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  endQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", []);
+  endQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "endQuery", []);
 
-  endQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", [__arg_0]);
+  endQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "endQuery", [__arg_0]);
 
-  endTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endTransformFeedback", []);
+  endTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "endTransformFeedback", []);
 
-  fenceSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", []);
+  fenceSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "fenceSync", []);
 
-  fenceSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0]);
+  fenceSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "fenceSync", [__arg_0]);
 
-  fenceSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0, __arg_1]);
+  fenceSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "fenceSync", [__arg_0, __arg_1]);
 
-  framebufferTextureLayer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2]);
+  framebufferTextureLayer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferTextureLayer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferTextureLayer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTextureLayer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  framebufferTextureLayer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  getActiveUniformBlockName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", []);
+  getActiveUniformBlockName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockName", []);
 
-  getActiveUniformBlockName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0]);
+  getActiveUniformBlockName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockName", [__arg_0]);
 
-  getActiveUniformBlockName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0, __arg_1]);
+  getActiveUniformBlockName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockName", [__arg_0, __arg_1]);
 
-  getActiveUniformBlockParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0]);
+  getActiveUniformBlockParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockParameter", [__arg_0]);
 
-  getActiveUniformBlockParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1]);
+  getActiveUniformBlockParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockParameter", [__arg_0, __arg_1]);
 
-  getActiveUniformBlockParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1, __arg_2]);
+  getActiveUniformBlockParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getActiveUniforms_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0]);
+  getActiveUniforms_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniforms", [__arg_0]);
 
-  getActiveUniforms_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1]);
+  getActiveUniforms_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniforms", [__arg_0, __arg_1]);
 
-  getActiveUniforms_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1, __arg_2]);
+  getActiveUniforms_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniforms", [__arg_0, __arg_1, __arg_2]);
 
-  getBufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0]);
+  getBufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getBufferSubData", [__arg_0]);
 
-  getBufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1]);
+  getBufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getBufferSubData", [__arg_0, __arg_1]);
 
-  getBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1, __arg_2]);
+  getBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getBufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  getFragDataLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", []);
+  getFragDataLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getFragDataLocation", []);
 
-  getFragDataLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0]);
+  getFragDataLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getFragDataLocation", [__arg_0]);
 
-  getFragDataLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0, __arg_1]);
+  getFragDataLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getFragDataLocation", [__arg_0, __arg_1]);
 
-  getIndexedParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", []);
+  getIndexedParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getIndexedParameter", []);
 
-  getIndexedParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0]);
+  getIndexedParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getIndexedParameter", [__arg_0]);
 
-  getIndexedParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0, __arg_1]);
+  getIndexedParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getIndexedParameter", [__arg_0, __arg_1]);
 
-  getInternalformatParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0]);
+  getInternalformatParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getInternalformatParameter", [__arg_0]);
 
-  getInternalformatParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1]);
+  getInternalformatParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getInternalformatParameter", [__arg_0, __arg_1]);
 
-  getInternalformatParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1, __arg_2]);
+  getInternalformatParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getInternalformatParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", []);
+  getQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQuery", []);
 
-  getQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0]);
+  getQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQuery", [__arg_0]);
 
-  getQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0, __arg_1]);
+  getQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQuery", [__arg_0, __arg_1]);
 
-  getQueryParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", []);
+  getQueryParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQueryParameter", []);
 
-  getQueryParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0]);
+  getQueryParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQueryParameter", [__arg_0]);
 
-  getQueryParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0, __arg_1]);
+  getQueryParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQueryParameter", [__arg_0, __arg_1]);
 
-  getSamplerParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", []);
+  getSamplerParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSamplerParameter", []);
 
-  getSamplerParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0]);
+  getSamplerParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSamplerParameter", [__arg_0]);
 
-  getSamplerParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0, __arg_1]);
+  getSamplerParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSamplerParameter", [__arg_0, __arg_1]);
 
-  getSyncParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", []);
+  getSyncParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSyncParameter", []);
 
-  getSyncParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0]);
+  getSyncParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSyncParameter", [__arg_0]);
 
-  getSyncParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0, __arg_1]);
+  getSyncParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSyncParameter", [__arg_0, __arg_1]);
 
-  getTransformFeedbackVarying_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", []);
+  getTransformFeedbackVarying_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getTransformFeedbackVarying", []);
 
-  getTransformFeedbackVarying_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0]);
+  getTransformFeedbackVarying_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getTransformFeedbackVarying", [__arg_0]);
 
-  getTransformFeedbackVarying_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0, __arg_1]);
+  getTransformFeedbackVarying_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getTransformFeedbackVarying", [__arg_0, __arg_1]);
 
-  getUniformBlockIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", []);
+  getUniformBlockIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformBlockIndex", []);
 
-  getUniformBlockIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0]);
+  getUniformBlockIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformBlockIndex", [__arg_0]);
 
-  getUniformBlockIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0, __arg_1]);
+  getUniformBlockIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformBlockIndex", [__arg_0, __arg_1]);
 
-  getUniformIndices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", []);
+  getUniformIndices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformIndices", []);
 
-  getUniformIndices_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0]);
+  getUniformIndices_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformIndices", [__arg_0]);
 
-  getUniformIndices_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0, __arg_1]);
+  getUniformIndices_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformIndices", [__arg_0, __arg_1]);
 
-  invalidateFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", []);
+  invalidateFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateFramebuffer", []);
 
-  invalidateFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0]);
+  invalidateFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateFramebuffer", [__arg_0]);
 
-  invalidateFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0, __arg_1]);
+  invalidateFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateFramebuffer", [__arg_0, __arg_1]);
 
-  invalidateSubFramebuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  invalidateSubFramebuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  invalidateSubFramebuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  invalidateSubFramebuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  invalidateSubFramebuffer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  invalidateSubFramebuffer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  isQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", []);
+  isQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isQuery", []);
 
-  isQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", [__arg_0]);
+  isQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isQuery", [__arg_0]);
 
-  isSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", []);
+  isSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSampler", []);
 
-  isSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", [__arg_0]);
+  isSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSampler", [__arg_0]);
 
-  isSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSync", []);
+  isSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSync", []);
 
-  isSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSync", [__arg_0]);
+  isSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSync", [__arg_0]);
 
-  isTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", []);
+  isTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isTransformFeedback", []);
 
-  isTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", [__arg_0]);
+  isTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isTransformFeedback", [__arg_0]);
 
-  isVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", []);
+  isVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isVertexArray", []);
 
-  isVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", [__arg_0]);
+  isVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isVertexArray", [__arg_0]);
 
-  pauseTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pauseTransformFeedback", []);
+  pauseTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "pauseTransformFeedback", []);
 
-  readBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", []);
+  readBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "readBuffer", []);
 
-  readBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", [__arg_0]);
+  readBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "readBuffer", [__arg_0]);
 
-  renderbufferStorageMultisample_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2]);
+  renderbufferStorageMultisample_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2]);
 
-  renderbufferStorageMultisample_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  renderbufferStorageMultisample_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  renderbufferStorageMultisample_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  renderbufferStorageMultisample_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  resumeTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resumeTransformFeedback", []);
+  resumeTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "resumeTransformFeedback", []);
 
-  samplerParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0]);
+  samplerParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameterf", [__arg_0]);
 
-  samplerParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1]);
+  samplerParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameterf", [__arg_0, __arg_1]);
 
-  samplerParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1, __arg_2]);
+  samplerParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameterf", [__arg_0, __arg_1, __arg_2]);
 
-  samplerParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0]);
+  samplerParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameteri", [__arg_0]);
 
-  samplerParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1]);
+  samplerParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameteri", [__arg_0, __arg_1]);
 
-  samplerParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1, __arg_2]);
+  samplerParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameteri", [__arg_0, __arg_1, __arg_2]);
 
-  texImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  texImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  texStorage2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2]);
+  texStorage2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage2D", [__arg_0, __arg_1, __arg_2]);
 
-  texStorage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texStorage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texStorage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texStorage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texStorage3D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texStorage3D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texStorage3D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texStorage3D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texStorage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texStorage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texSubImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  texSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  texSubImage3D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+  texSubImage3D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
 
-  transformFeedbackVaryings_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0]);
+  transformFeedbackVaryings_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "transformFeedbackVaryings", [__arg_0]);
 
-  transformFeedbackVaryings_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1]);
+  transformFeedbackVaryings_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "transformFeedbackVaryings", [__arg_0, __arg_1]);
 
-  transformFeedbackVaryings_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1, __arg_2]);
+  transformFeedbackVaryings_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "transformFeedbackVaryings", [__arg_0, __arg_1, __arg_2]);
 
-  uniform1ui_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", []);
+  uniform1ui_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1ui", []);
 
-  uniform1ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0]);
+  uniform1ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1ui", [__arg_0]);
 
-  uniform1ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0, __arg_1]);
+  uniform1ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1ui", [__arg_0, __arg_1]);
 
-  uniform1uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", []);
+  uniform1uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1uiv", []);
 
-  uniform1uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0]);
+  uniform1uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1uiv", [__arg_0]);
 
-  uniform1uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0, __arg_1]);
+  uniform1uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1uiv", [__arg_0, __arg_1]);
 
-  uniform2ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0]);
+  uniform2ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2ui", [__arg_0]);
 
-  uniform2ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1]);
+  uniform2ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2ui", [__arg_0, __arg_1]);
 
-  uniform2ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1, __arg_2]);
+  uniform2ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2ui", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", []);
+  uniform2uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2uiv", []);
 
-  uniform2uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0]);
+  uniform2uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2uiv", [__arg_0]);
 
-  uniform2uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0, __arg_1]);
+  uniform2uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2uiv", [__arg_0, __arg_1]);
 
-  uniform3ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1]);
+  uniform3ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3ui", [__arg_0, __arg_1]);
 
-  uniform3ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2]);
+  uniform3ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3ui", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", []);
+  uniform3uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3uiv", []);
 
-  uniform3uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0]);
+  uniform3uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3uiv", [__arg_0]);
 
-  uniform3uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0, __arg_1]);
+  uniform3uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3uiv", [__arg_0, __arg_1]);
 
-  uniform4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2]);
+  uniform4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4ui", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", []);
+  uniform4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4uiv", []);
 
-  uniform4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0]);
+  uniform4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4uiv", [__arg_0]);
 
-  uniform4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0, __arg_1]);
+  uniform4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4uiv", [__arg_0, __arg_1]);
 
-  uniformBlockBinding_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0]);
+  uniformBlockBinding_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformBlockBinding", [__arg_0]);
 
-  uniformBlockBinding_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1]);
+  uniformBlockBinding_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformBlockBinding", [__arg_0, __arg_1]);
 
-  uniformBlockBinding_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1, __arg_2]);
+  uniformBlockBinding_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformBlockBinding", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix2x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0]);
+  uniformMatrix2x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x3fv", [__arg_0]);
 
-  uniformMatrix2x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1]);
+  uniformMatrix2x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x3fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix2x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0]);
+  uniformMatrix2x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x4fv", [__arg_0]);
 
-  uniformMatrix2x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1]);
+  uniformMatrix2x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x4fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0]);
+  uniformMatrix3x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x2fv", [__arg_0]);
 
-  uniformMatrix3x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1]);
+  uniformMatrix3x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0]);
+  uniformMatrix3x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x4fv", [__arg_0]);
 
-  uniformMatrix3x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1]);
+  uniformMatrix3x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x4fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0]);
+  uniformMatrix4x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x2fv", [__arg_0]);
 
-  uniformMatrix4x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1]);
+  uniformMatrix4x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0]);
+  uniformMatrix4x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x3fv", [__arg_0]);
 
-  uniformMatrix4x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1]);
+  uniformMatrix4x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x3fv", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribDivisor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", []);
+  vertexAttribDivisor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribDivisor", []);
 
-  vertexAttribDivisor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0]);
+  vertexAttribDivisor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribDivisor", [__arg_0]);
 
-  vertexAttribDivisor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0, __arg_1]);
+  vertexAttribDivisor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribDivisor", [__arg_0, __arg_1]);
 
-  vertexAttribI4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2]);
+  vertexAttribI4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribI4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribI4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribI4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribI4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribI4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", []);
+  vertexAttribI4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4iv", []);
 
-  vertexAttribI4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0]);
+  vertexAttribI4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4iv", [__arg_0]);
 
-  vertexAttribI4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0, __arg_1]);
+  vertexAttribI4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4iv", [__arg_0, __arg_1]);
 
-  vertexAttribI4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2]);
+  vertexAttribI4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribI4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribI4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribI4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribI4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribI4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", []);
+  vertexAttribI4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4uiv", []);
 
-  vertexAttribI4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0]);
+  vertexAttribI4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4uiv", [__arg_0]);
 
-  vertexAttribI4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0, __arg_1]);
+  vertexAttribI4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4uiv", [__arg_0, __arg_1]);
 
-  vertexAttribIPointer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2]);
+  vertexAttribIPointer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribIPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribIPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribIPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribIPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  waitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0]);
+  waitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "waitSync", [__arg_0]);
 
-  waitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1]);
+  waitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "waitSync", [__arg_0, __arg_1]);
 
-  waitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1, __arg_2]);
+  waitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "waitSync", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkWebGL2RenderingContextBase {
   static final instance = new BlinkWebGL2RenderingContextBase();
 
-  beginQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", []);
+  beginQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginQuery", []);
 
-  beginQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0]);
+  beginQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginQuery", [__arg_0]);
 
-  beginQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "beginQuery", [__arg_0, __arg_1]);
+  beginQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginQuery", [__arg_0, __arg_1]);
 
-  beginTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", []);
+  beginTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginTransformFeedback", []);
 
-  beginTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "beginTransformFeedback", [__arg_0]);
+  beginTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "beginTransformFeedback", [__arg_0]);
 
-  bindBufferBase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0]);
+  bindBufferBase_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferBase", [__arg_0]);
 
-  bindBufferBase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1]);
+  bindBufferBase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferBase", [__arg_0, __arg_1]);
 
-  bindBufferBase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferBase", [__arg_0, __arg_1, __arg_2]);
+  bindBufferBase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferBase", [__arg_0, __arg_1, __arg_2]);
 
-  bindBufferRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2]);
+  bindBufferRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferRange", [__arg_0, __arg_1, __arg_2]);
 
-  bindBufferRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  bindBufferRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bindBufferRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  bindBufferRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindBufferRange", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  bindSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", []);
+  bindSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindSampler", []);
 
-  bindSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0]);
+  bindSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindSampler", [__arg_0]);
 
-  bindSampler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindSampler", [__arg_0, __arg_1]);
+  bindSampler_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindSampler", [__arg_0, __arg_1]);
 
-  bindTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", []);
+  bindTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindTransformFeedback", []);
 
-  bindTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0]);
+  bindTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindTransformFeedback", [__arg_0]);
 
-  bindTransformFeedback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTransformFeedback", [__arg_0, __arg_1]);
+  bindTransformFeedback_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindTransformFeedback", [__arg_0, __arg_1]);
 
-  bindVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", []);
+  bindVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindVertexArray", []);
 
-  bindVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindVertexArray", [__arg_0]);
+  bindVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "bindVertexArray", [__arg_0]);
 
-  blitFramebuffer_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  blitFramebuffer_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  blitFramebuffer_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  blitFramebuffer_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  blitFramebuffer_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  blitFramebuffer_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "blitFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  clearBufferfi_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1]);
+  clearBufferfi_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfi", [__arg_0, __arg_1]);
 
-  clearBufferfi_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2]);
+  clearBufferfi_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfi", [__arg_0, __arg_1, __arg_2]);
 
-  clearBufferfi_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfi", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  clearBufferfi_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfi", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  clearBufferfv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0]);
+  clearBufferfv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfv", [__arg_0]);
 
-  clearBufferfv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1]);
+  clearBufferfv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfv", [__arg_0, __arg_1]);
 
-  clearBufferfv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferfv", [__arg_0, __arg_1, __arg_2]);
+  clearBufferfv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferfv", [__arg_0, __arg_1, __arg_2]);
 
-  clearBufferiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0]);
+  clearBufferiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferiv", [__arg_0]);
 
-  clearBufferiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1]);
+  clearBufferiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferiv", [__arg_0, __arg_1]);
 
-  clearBufferiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferiv", [__arg_0, __arg_1, __arg_2]);
+  clearBufferiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferiv", [__arg_0, __arg_1, __arg_2]);
 
-  clearBufferuiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0]);
+  clearBufferuiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferuiv", [__arg_0]);
 
-  clearBufferuiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1]);
+  clearBufferuiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferuiv", [__arg_0, __arg_1]);
 
-  clearBufferuiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearBufferuiv", [__arg_0, __arg_1, __arg_2]);
+  clearBufferuiv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clearBufferuiv", [__arg_0, __arg_1, __arg_2]);
 
-  clientWaitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0]);
+  clientWaitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clientWaitSync", [__arg_0]);
 
-  clientWaitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1]);
+  clientWaitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clientWaitSync", [__arg_0, __arg_1]);
 
-  clientWaitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clientWaitSync", [__arg_0, __arg_1, __arg_2]);
+  clientWaitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "clientWaitSync", [__arg_0, __arg_1, __arg_2]);
 
-  compressedTexImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  compressedTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  compressedTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  compressedTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  compressedTexSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  compressedTexSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "compressedTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  copyBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2]);
+  copyBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyBufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  copyBufferSubData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  copyBufferSubData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  copyBufferSubData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  copyBufferSubData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyBufferSubData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  copyTexSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  copyTexSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "copyTexSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  createQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createQuery", []);
+  createQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createQuery", []);
 
-  createSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createSampler", []);
+  createSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createSampler", []);
 
-  createTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTransformFeedback", []);
+  createTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createTransformFeedback", []);
 
-  createVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createVertexArray", []);
+  createVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "createVertexArray", []);
 
-  deleteQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", []);
+  deleteQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteQuery", []);
 
-  deleteQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteQuery", [__arg_0]);
+  deleteQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteQuery", [__arg_0]);
 
-  deleteSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", []);
+  deleteSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSampler", []);
 
-  deleteSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSampler", [__arg_0]);
+  deleteSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSampler", [__arg_0]);
 
-  deleteSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", []);
+  deleteSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSync", []);
 
-  deleteSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteSync", [__arg_0]);
+  deleteSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteSync", [__arg_0]);
 
-  deleteTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", []);
+  deleteTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteTransformFeedback", []);
 
-  deleteTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTransformFeedback", [__arg_0]);
+  deleteTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteTransformFeedback", [__arg_0]);
 
-  deleteVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", []);
+  deleteVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteVertexArray", []);
 
-  deleteVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteVertexArray", [__arg_0]);
+  deleteVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "deleteVertexArray", [__arg_0]);
 
-  drawArraysInstanced_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1]);
+  drawArraysInstanced_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawArraysInstanced", [__arg_0, __arg_1]);
 
-  drawArraysInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2]);
+  drawArraysInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2]);
 
-  drawArraysInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawArraysInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawArraysInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawBuffers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", []);
+  drawBuffers_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawBuffers", []);
 
-  drawBuffers_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffers", [__arg_0]);
+  drawBuffers_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawBuffers", [__arg_0]);
 
-  drawElementsInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2]);
+  drawElementsInstanced_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2]);
 
-  drawElementsInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawElementsInstanced_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawElementsInstanced_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  drawElementsInstanced_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawElementsInstanced", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  drawRangeElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawRangeElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  drawRangeElements_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  drawRangeElements_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  drawRangeElements_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  drawRangeElements_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "drawRangeElements", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  endQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", []);
+  endQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "endQuery", []);
 
-  endQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "endQuery", [__arg_0]);
+  endQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "endQuery", [__arg_0]);
 
-  endTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "endTransformFeedback", []);
+  endTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "endTransformFeedback", []);
 
-  fenceSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", []);
+  fenceSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "fenceSync", []);
 
-  fenceSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0]);
+  fenceSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "fenceSync", [__arg_0]);
 
-  fenceSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fenceSync", [__arg_0, __arg_1]);
+  fenceSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "fenceSync", [__arg_0, __arg_1]);
 
-  framebufferTextureLayer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2]);
+  framebufferTextureLayer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferTextureLayer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferTextureLayer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTextureLayer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  framebufferTextureLayer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "framebufferTextureLayer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  getActiveUniformBlockName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", []);
+  getActiveUniformBlockName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockName", []);
 
-  getActiveUniformBlockName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0]);
+  getActiveUniformBlockName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockName", [__arg_0]);
 
-  getActiveUniformBlockName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockName", [__arg_0, __arg_1]);
+  getActiveUniformBlockName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockName", [__arg_0, __arg_1]);
 
-  getActiveUniformBlockParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0]);
+  getActiveUniformBlockParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockParameter", [__arg_0]);
 
-  getActiveUniformBlockParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1]);
+  getActiveUniformBlockParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockParameter", [__arg_0, __arg_1]);
 
-  getActiveUniformBlockParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniformBlockParameter", [__arg_0, __arg_1, __arg_2]);
+  getActiveUniformBlockParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniformBlockParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getActiveUniforms_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0]);
+  getActiveUniforms_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniforms", [__arg_0]);
 
-  getActiveUniforms_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1]);
+  getActiveUniforms_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniforms", [__arg_0, __arg_1]);
 
-  getActiveUniforms_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniforms", [__arg_0, __arg_1, __arg_2]);
+  getActiveUniforms_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getActiveUniforms", [__arg_0, __arg_1, __arg_2]);
 
-  getBufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0]);
+  getBufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getBufferSubData", [__arg_0]);
 
-  getBufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1]);
+  getBufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getBufferSubData", [__arg_0, __arg_1]);
 
-  getBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getBufferSubData", [__arg_0, __arg_1, __arg_2]);
+  getBufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getBufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  getFragDataLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", []);
+  getFragDataLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getFragDataLocation", []);
 
-  getFragDataLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0]);
+  getFragDataLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getFragDataLocation", [__arg_0]);
 
-  getFragDataLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFragDataLocation", [__arg_0, __arg_1]);
+  getFragDataLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getFragDataLocation", [__arg_0, __arg_1]);
 
-  getIndexedParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", []);
+  getIndexedParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getIndexedParameter", []);
 
-  getIndexedParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0]);
+  getIndexedParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getIndexedParameter", [__arg_0]);
 
-  getIndexedParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getIndexedParameter", [__arg_0, __arg_1]);
+  getIndexedParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getIndexedParameter", [__arg_0, __arg_1]);
 
-  getInternalformatParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0]);
+  getInternalformatParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getInternalformatParameter", [__arg_0]);
 
-  getInternalformatParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1]);
+  getInternalformatParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getInternalformatParameter", [__arg_0, __arg_1]);
 
-  getInternalformatParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getInternalformatParameter", [__arg_0, __arg_1, __arg_2]);
+  getInternalformatParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getInternalformatParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", []);
+  getQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQuery", []);
 
-  getQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0]);
+  getQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQuery", [__arg_0]);
 
-  getQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQuery", [__arg_0, __arg_1]);
+  getQuery_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQuery", [__arg_0, __arg_1]);
 
-  getQueryParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", []);
+  getQueryParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQueryParameter", []);
 
-  getQueryParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0]);
+  getQueryParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQueryParameter", [__arg_0]);
 
-  getQueryParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getQueryParameter", [__arg_0, __arg_1]);
+  getQueryParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getQueryParameter", [__arg_0, __arg_1]);
 
-  getSamplerParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", []);
+  getSamplerParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSamplerParameter", []);
 
-  getSamplerParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0]);
+  getSamplerParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSamplerParameter", [__arg_0]);
 
-  getSamplerParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSamplerParameter", [__arg_0, __arg_1]);
+  getSamplerParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSamplerParameter", [__arg_0, __arg_1]);
 
-  getSyncParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", []);
+  getSyncParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSyncParameter", []);
 
-  getSyncParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0]);
+  getSyncParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSyncParameter", [__arg_0]);
 
-  getSyncParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getSyncParameter", [__arg_0, __arg_1]);
+  getSyncParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getSyncParameter", [__arg_0, __arg_1]);
 
-  getTransformFeedbackVarying_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", []);
+  getTransformFeedbackVarying_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getTransformFeedbackVarying", []);
 
-  getTransformFeedbackVarying_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0]);
+  getTransformFeedbackVarying_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getTransformFeedbackVarying", [__arg_0]);
 
-  getTransformFeedbackVarying_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTransformFeedbackVarying", [__arg_0, __arg_1]);
+  getTransformFeedbackVarying_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getTransformFeedbackVarying", [__arg_0, __arg_1]);
 
-  getUniformBlockIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", []);
+  getUniformBlockIndex_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformBlockIndex", []);
 
-  getUniformBlockIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0]);
+  getUniformBlockIndex_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformBlockIndex", [__arg_0]);
 
-  getUniformBlockIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformBlockIndex", [__arg_0, __arg_1]);
+  getUniformBlockIndex_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformBlockIndex", [__arg_0, __arg_1]);
 
-  getUniformIndices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", []);
+  getUniformIndices_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformIndices", []);
 
-  getUniformIndices_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0]);
+  getUniformIndices_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformIndices", [__arg_0]);
 
-  getUniformIndices_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformIndices", [__arg_0, __arg_1]);
+  getUniformIndices_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "getUniformIndices", [__arg_0, __arg_1]);
 
-  invalidateFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", []);
+  invalidateFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateFramebuffer", []);
 
-  invalidateFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0]);
+  invalidateFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateFramebuffer", [__arg_0]);
 
-  invalidateFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "invalidateFramebuffer", [__arg_0, __arg_1]);
+  invalidateFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateFramebuffer", [__arg_0, __arg_1]);
 
-  invalidateSubFramebuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  invalidateSubFramebuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  invalidateSubFramebuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  invalidateSubFramebuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  invalidateSubFramebuffer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  invalidateSubFramebuffer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "invalidateSubFramebuffer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  isQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", []);
+  isQuery_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isQuery", []);
 
-  isQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isQuery", [__arg_0]);
+  isQuery_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isQuery", [__arg_0]);
 
-  isSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", []);
+  isSampler_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSampler", []);
 
-  isSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSampler", [__arg_0]);
+  isSampler_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSampler", [__arg_0]);
 
-  isSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isSync", []);
+  isSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSync", []);
 
-  isSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isSync", [__arg_0]);
+  isSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isSync", [__arg_0]);
 
-  isTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", []);
+  isTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isTransformFeedback", []);
 
-  isTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTransformFeedback", [__arg_0]);
+  isTransformFeedback_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isTransformFeedback", [__arg_0]);
 
-  isVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", []);
+  isVertexArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isVertexArray", []);
 
-  isVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isVertexArray", [__arg_0]);
+  isVertexArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "isVertexArray", [__arg_0]);
 
-  pauseTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pauseTransformFeedback", []);
+  pauseTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "pauseTransformFeedback", []);
 
-  readBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", []);
+  readBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "readBuffer", []);
 
-  readBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "readBuffer", [__arg_0]);
+  readBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "readBuffer", [__arg_0]);
 
-  renderbufferStorageMultisample_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2]);
+  renderbufferStorageMultisample_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2]);
 
-  renderbufferStorageMultisample_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  renderbufferStorageMultisample_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  renderbufferStorageMultisample_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  renderbufferStorageMultisample_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "renderbufferStorageMultisample", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  resumeTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resumeTransformFeedback", []);
+  resumeTransformFeedback_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "resumeTransformFeedback", []);
 
-  samplerParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0]);
+  samplerParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameterf", [__arg_0]);
 
-  samplerParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1]);
+  samplerParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameterf", [__arg_0, __arg_1]);
 
-  samplerParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameterf", [__arg_0, __arg_1, __arg_2]);
+  samplerParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameterf", [__arg_0, __arg_1, __arg_2]);
 
-  samplerParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0]);
+  samplerParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameteri", [__arg_0]);
 
-  samplerParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1]);
+  samplerParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameteri", [__arg_0, __arg_1]);
 
-  samplerParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "samplerParameteri", [__arg_0, __arg_1, __arg_2]);
+  samplerParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "samplerParameteri", [__arg_0, __arg_1, __arg_2]);
 
-  texImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  texImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  texStorage2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2]);
+  texStorage2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage2D", [__arg_0, __arg_1, __arg_2]);
 
-  texStorage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texStorage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texStorage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texStorage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texStorage3D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texStorage3D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texStorage3D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texStorage3D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texStorage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texStorage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texStorage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texSubImage3D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texSubImage3D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texSubImage3D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texSubImage3D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
+  texSubImage3D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  texSubImage3D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
+  texSubImage3D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "texSubImage3D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
 
-  transformFeedbackVaryings_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0]);
+  transformFeedbackVaryings_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "transformFeedbackVaryings", [__arg_0]);
 
-  transformFeedbackVaryings_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1]);
+  transformFeedbackVaryings_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "transformFeedbackVaryings", [__arg_0, __arg_1]);
 
-  transformFeedbackVaryings_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "transformFeedbackVaryings", [__arg_0, __arg_1, __arg_2]);
+  transformFeedbackVaryings_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "transformFeedbackVaryings", [__arg_0, __arg_1, __arg_2]);
 
-  uniform1ui_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", []);
+  uniform1ui_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1ui", []);
 
-  uniform1ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0]);
+  uniform1ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1ui", [__arg_0]);
 
-  uniform1ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1ui", [__arg_0, __arg_1]);
+  uniform1ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1ui", [__arg_0, __arg_1]);
 
-  uniform1uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", []);
+  uniform1uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1uiv", []);
 
-  uniform1uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0]);
+  uniform1uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1uiv", [__arg_0]);
 
-  uniform1uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1uiv", [__arg_0, __arg_1]);
+  uniform1uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform1uiv", [__arg_0, __arg_1]);
 
-  uniform2ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0]);
+  uniform2ui_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2ui", [__arg_0]);
 
-  uniform2ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1]);
+  uniform2ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2ui", [__arg_0, __arg_1]);
 
-  uniform2ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2ui", [__arg_0, __arg_1, __arg_2]);
+  uniform2ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2ui", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", []);
+  uniform2uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2uiv", []);
 
-  uniform2uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0]);
+  uniform2uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2uiv", [__arg_0]);
 
-  uniform2uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2uiv", [__arg_0, __arg_1]);
+  uniform2uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform2uiv", [__arg_0, __arg_1]);
 
-  uniform3ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1]);
+  uniform3ui_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3ui", [__arg_0, __arg_1]);
 
-  uniform3ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2]);
+  uniform3ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3ui", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", []);
+  uniform3uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3uiv", []);
 
-  uniform3uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0]);
+  uniform3uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3uiv", [__arg_0]);
 
-  uniform3uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3uiv", [__arg_0, __arg_1]);
+  uniform3uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform3uiv", [__arg_0, __arg_1]);
 
-  uniform4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2]);
+  uniform4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4ui", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", []);
+  uniform4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4uiv", []);
 
-  uniform4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0]);
+  uniform4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4uiv", [__arg_0]);
 
-  uniform4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4uiv", [__arg_0, __arg_1]);
+  uniform4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniform4uiv", [__arg_0, __arg_1]);
 
-  uniformBlockBinding_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0]);
+  uniformBlockBinding_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformBlockBinding", [__arg_0]);
 
-  uniformBlockBinding_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1]);
+  uniformBlockBinding_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformBlockBinding", [__arg_0, __arg_1]);
 
-  uniformBlockBinding_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformBlockBinding", [__arg_0, __arg_1, __arg_2]);
+  uniformBlockBinding_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformBlockBinding", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix2x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0]);
+  uniformMatrix2x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x3fv", [__arg_0]);
 
-  uniformMatrix2x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1]);
+  uniformMatrix2x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x3fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix2x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0]);
+  uniformMatrix2x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x4fv", [__arg_0]);
 
-  uniformMatrix2x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1]);
+  uniformMatrix2x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2x4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix2x4fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0]);
+  uniformMatrix3x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x2fv", [__arg_0]);
 
-  uniformMatrix3x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1]);
+  uniformMatrix3x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0]);
+  uniformMatrix3x4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x4fv", [__arg_0]);
 
-  uniformMatrix3x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1]);
+  uniformMatrix3x4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3x4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3x4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix3x4fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0]);
+  uniformMatrix4x2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x2fv", [__arg_0]);
 
-  uniformMatrix4x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1]);
+  uniformMatrix4x2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4x2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0]);
+  uniformMatrix4x3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x3fv", [__arg_0]);
 
-  uniformMatrix4x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1]);
+  uniformMatrix4x3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4x3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4x3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "uniformMatrix4x3fv", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribDivisor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", []);
+  vertexAttribDivisor_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribDivisor", []);
 
-  vertexAttribDivisor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0]);
+  vertexAttribDivisor_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribDivisor", [__arg_0]);
 
-  vertexAttribDivisor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribDivisor", [__arg_0, __arg_1]);
+  vertexAttribDivisor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribDivisor", [__arg_0, __arg_1]);
 
-  vertexAttribI4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2]);
+  vertexAttribI4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribI4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribI4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribI4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribI4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribI4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", []);
+  vertexAttribI4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4iv", []);
 
-  vertexAttribI4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0]);
+  vertexAttribI4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4iv", [__arg_0]);
 
-  vertexAttribI4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4iv", [__arg_0, __arg_1]);
+  vertexAttribI4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4iv", [__arg_0, __arg_1]);
 
-  vertexAttribI4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2]);
+  vertexAttribI4ui_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribI4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribI4ui_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribI4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribI4ui_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4ui", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribI4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", []);
+  vertexAttribI4uiv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4uiv", []);
 
-  vertexAttribI4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0]);
+  vertexAttribI4uiv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4uiv", [__arg_0]);
 
-  vertexAttribI4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribI4uiv", [__arg_0, __arg_1]);
+  vertexAttribI4uiv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribI4uiv", [__arg_0, __arg_1]);
 
-  vertexAttribIPointer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2]);
+  vertexAttribIPointer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttribIPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribIPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribIPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribIPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "vertexAttribIPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  waitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0]);
+  waitSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "waitSync", [__arg_0]);
 
-  waitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1]);
+  waitSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "waitSync", [__arg_0, __arg_1]);
 
-  waitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "waitSync", [__arg_0, __arg_1, __arg_2]);
+  waitSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGL2RenderingContextBase */, "waitSync", [__arg_0, __arg_1, __arg_2]);
 
-  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "canvas");
 
-  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferHeight");
 
-  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferWidth");
 
-  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
+  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", []);
 
-  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", [__arg_0]);
+  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", [__arg_0]);
 
-  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", []);
+  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", []);
 
-  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0]);
+  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0]);
 
-  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0, __arg_1]);
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0]);
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0]);
 
-  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1]);
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
 
-  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", []);
+  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", []);
 
-  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0]);
+  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0]);
 
-  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0, __arg_1]);
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0, __arg_1]);
 
-  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", []);
+  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", []);
 
-  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0]);
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0]);
 
-  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0, __arg_1]);
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0, __arg_1]);
 
-  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", []);
+  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", []);
 
-  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0]);
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0]);
 
-  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0, __arg_1]);
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0, __arg_1]);
 
-  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", []);
+  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", []);
 
-  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0]);
+  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0]);
 
-  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0, __arg_1]);
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0, __arg_1]);
 
-  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1]);
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1]);
 
-  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2]);
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2]);
 
-  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", []);
 
-  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", [__arg_0]);
 
-  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
+  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", []);
 
-  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0]);
 
-  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0, __arg_1]);
 
-  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", []);
 
-  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0]);
 
-  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
+  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0]);
 
-  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1]);
 
-  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1, __arg_2]);
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1, __arg_2]);
 
-  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0]);
+  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0]);
 
-  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1]);
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1]);
 
-  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
+  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", []);
 
-  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", []);
 
-  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", [__arg_0]);
 
-  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1]);
 
-  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2]);
 
-  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", []);
+  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", []);
 
-  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", [__arg_0]);
+  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", [__arg_0]);
 
-  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", []);
+  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", []);
 
-  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
+  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", [__arg_0]);
 
-  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1]);
 
-  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2]);
 
-  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", []);
+  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", []);
 
-  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", [__arg_0]);
+  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", [__arg_0]);
 
-  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", []);
+  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createBuffer", []);
 
-  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createFramebuffer", []);
+  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createFramebuffer", []);
 
-  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProgram", []);
+  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createProgram", []);
 
-  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRenderbuffer", []);
+  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createRenderbuffer", []);
 
-  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShader", []);
+  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", []);
 
-  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShader", [__arg_0]);
+  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", [__arg_0]);
 
-  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTexture", []);
+  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createTexture", []);
 
-  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", []);
+  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", []);
 
-  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", [__arg_0]);
+  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", [__arg_0]);
 
-  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", []);
+  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", []);
 
-  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", [__arg_0]);
+  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", [__arg_0]);
 
-  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", []);
+  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", []);
 
-  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", [__arg_0]);
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", [__arg_0]);
 
-  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", []);
+  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", []);
 
-  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", [__arg_0]);
+  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", [__arg_0]);
 
-  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", []);
+  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", []);
 
-  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", [__arg_0]);
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", [__arg_0]);
 
-  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", []);
+  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", []);
 
-  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", [__arg_0]);
+  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", [__arg_0]);
 
-  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", []);
+  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", []);
 
-  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", [__arg_0]);
+  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", [__arg_0]);
 
-  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", []);
+  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", []);
 
-  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", [__arg_0]);
+  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", [__arg_0]);
 
-  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", []);
+  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", []);
 
-  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", [__arg_0]);
+  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", [__arg_0]);
 
-  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", []);
+  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", []);
 
-  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0]);
+  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0]);
 
-  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0, __arg_1]);
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0, __arg_1]);
 
-  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", []);
+  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", []);
 
-  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0]);
+  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0]);
 
-  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0, __arg_1]);
 
-  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
+  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", []);
 
-  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
+  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", [__arg_0]);
 
-  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", []);
 
-  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", [__arg_0]);
 
-  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
+  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0]);
 
-  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1]);
 
-  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1, __arg_2]);
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1]);
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1]);
 
-  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2]);
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", []);
 
-  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", [__arg_0]);
 
-  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
+  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", []);
 
-  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", [__arg_0]);
 
-  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "finish", []);
 
-  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
+  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "flush", []);
 
-  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1]);
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1]);
 
-  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", []);
+  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", []);
 
-  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", [__arg_0]);
+  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", [__arg_0]);
 
-  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", []);
+  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", []);
 
-  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", [__arg_0]);
+  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", [__arg_0]);
 
-  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", []);
+  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", []);
 
-  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0]);
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0]);
 
-  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0, __arg_1]);
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0, __arg_1]);
 
-  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", []);
+  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", []);
 
-  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0]);
+  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0]);
 
-  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0, __arg_1]);
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0, __arg_1]);
 
-  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", []);
+  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", []);
 
-  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", [__arg_0]);
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", [__arg_0]);
 
-  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", []);
+  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", []);
 
-  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0]);
+  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0]);
 
-  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0, __arg_1]);
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0, __arg_1]);
 
-  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", []);
+  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", []);
 
-  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0]);
+  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0]);
 
-  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0, __arg_1]);
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0, __arg_1]);
 
-  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getContextAttributes", []);
 
-  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getError", []);
+  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getError", []);
 
-  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", []);
+  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", []);
 
-  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", [__arg_0]);
+  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0]);
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
 
-  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", []);
 
-  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", [__arg_0]);
 
-  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", []);
+  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", []);
 
-  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", [__arg_0]);
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", [__arg_0]);
 
-  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", []);
+  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", []);
 
-  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0]);
+  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0]);
 
-  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0, __arg_1]);
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0, __arg_1]);
 
-  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", []);
+  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", []);
 
-  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0]);
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0]);
 
-  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0, __arg_1]);
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0, __arg_1]);
 
-  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", []);
+  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", []);
 
-  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", [__arg_0]);
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", [__arg_0]);
 
-  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", []);
+  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", []);
 
-  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0]);
+  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0]);
 
-  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0, __arg_1]);
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0, __arg_1]);
 
-  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", []);
+  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", []);
 
-  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0]);
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0]);
 
-  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
 
-  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", []);
+  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", []);
 
-  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", [__arg_0]);
+  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", [__arg_0]);
 
-  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSupportedExtensions", []);
+  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getSupportedExtensions", []);
 
-  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", []);
+  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", []);
 
-  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0]);
+  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0]);
 
-  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0, __arg_1]);
 
-  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
+  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", []);
 
-  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
+  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0]);
 
-  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0, __arg_1]);
 
-  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", []);
 
-  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0]);
 
-  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0, __arg_1]);
 
-  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
+  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", []);
 
-  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0]);
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0]);
 
-  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0, __arg_1]);
 
-  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", []);
 
-  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0]);
 
-  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0, __arg_1]);
 
-  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
+  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", []);
 
-  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
+  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0]);
 
-  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0, __arg_1]);
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0, __arg_1]);
 
-  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", []);
+  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", []);
 
-  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", [__arg_0]);
+  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", [__arg_0]);
 
-  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isContextLost", []);
 
-  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", []);
+  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", []);
 
-  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", [__arg_0]);
+  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", [__arg_0]);
 
-  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", []);
+  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", []);
 
-  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", [__arg_0]);
+  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", [__arg_0]);
 
-  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", []);
+  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", []);
 
-  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", [__arg_0]);
+  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", [__arg_0]);
 
-  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", []);
+  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", []);
 
-  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", [__arg_0]);
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", [__arg_0]);
 
-  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isShader", []);
+  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", []);
 
-  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isShader", [__arg_0]);
+  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", [__arg_0]);
 
-  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", []);
+  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", []);
 
-  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", [__arg_0]);
+  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", [__arg_0]);
 
-  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", []);
+  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", []);
 
-  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", [__arg_0]);
+  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", [__arg_0]);
 
-  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", []);
+  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", []);
 
-  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", [__arg_0]);
+  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", [__arg_0]);
 
-  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", []);
+  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", []);
 
-  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0]);
+  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0]);
 
-  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0, __arg_1]);
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0, __arg_1]);
 
-  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", []);
+  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", []);
 
-  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0]);
+  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0]);
 
-  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0, __arg_1]);
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0, __arg_1]);
 
-  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1]);
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1]);
 
-  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
 
-  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", []);
+  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", []);
 
-  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0]);
+  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0]);
 
-  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0, __arg_1]);
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0, __arg_1]);
 
-  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1]);
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1]);
 
-  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2]);
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2]);
 
-  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", []);
+  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", []);
 
-  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0]);
+  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0]);
 
-  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0]);
 
-  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1]);
 
-  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", []);
 
-  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", [__arg_0]);
 
-  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
+  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", []);
 
-  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0]);
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0]);
 
-  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
+  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0]);
 
-  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1]);
 
-  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0]);
+  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0]);
 
-  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1]);
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1]);
 
-  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1, __arg_2]);
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1, __arg_2]);
 
-  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0]);
+  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0]);
 
-  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1]);
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1]);
 
-  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1, __arg_2]);
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1, __arg_2]);
 
-  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", []);
+  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", []);
 
-  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0]);
+  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0]);
 
-  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0, __arg_1]);
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0, __arg_1]);
 
-  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", []);
+  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", []);
 
-  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0]);
+  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0]);
 
-  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0, __arg_1]);
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0, __arg_1]);
 
-  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", []);
+  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", []);
 
-  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0]);
+  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0]);
 
-  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0, __arg_1]);
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0, __arg_1]);
 
-  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", []);
+  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", []);
 
-  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0]);
+  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0]);
 
-  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0, __arg_1]);
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0]);
+  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0]);
 
-  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1]);
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1, __arg_2]);
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", []);
+  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", []);
 
-  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0]);
+  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0]);
 
-  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0, __arg_1]);
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0]);
+  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0]);
 
-  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1]);
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1, __arg_2]);
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", []);
+  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", []);
 
-  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0]);
+  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0]);
 
-  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0, __arg_1]);
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1]);
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2]);
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", []);
+  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", []);
 
-  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0]);
+  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0]);
 
-  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0, __arg_1]);
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1]);
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2]);
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", []);
+  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", []);
 
-  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0]);
+  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0]);
 
-  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0, __arg_1]);
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0, __arg_1]);
 
-  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2]);
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", []);
+  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", []);
 
-  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0]);
+  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0]);
 
-  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0, __arg_1]);
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0, __arg_1]);
 
-  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2]);
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", []);
+  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", []);
 
-  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0]);
+  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0]);
 
-  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0, __arg_1]);
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0]);
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0]);
 
-  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1]);
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0]);
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0]);
 
-  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1]);
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0]);
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0]);
 
-  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1]);
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
 
-  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", []);
+  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", []);
 
-  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", [__arg_0]);
+  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", [__arg_0]);
 
-  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", []);
+  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", []);
 
-  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", [__arg_0]);
+  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", [__arg_0]);
 
-  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", []);
+  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", []);
 
-  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0]);
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0]);
 
-  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0, __arg_1]);
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0, __arg_1]);
 
-  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", []);
+  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", []);
 
-  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0]);
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0]);
 
-  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0, __arg_1]);
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0]);
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0]);
 
-  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1]);
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", []);
+  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", []);
 
-  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0]);
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0]);
 
-  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0, __arg_1]);
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1]);
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", []);
+  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", []);
 
-  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0]);
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0]);
 
-  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0, __arg_1]);
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0, __arg_1]);
 
-  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", []);
+  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", []);
 
-  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0]);
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0]);
 
-  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0, __arg_1]);
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0, __arg_1]);
 
-  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1]);
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1]);
 
-  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2]);
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2]);
 
-  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkWebGLActiveInfo {
   static final instance = new BlinkWebGLActiveInfo();
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLActiveInfo */, "name");
 
-  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "size");
+  size_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLActiveInfo */, "size");
 
-  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "type");
+  type_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLActiveInfo */, "type");
 
 }
 
@@ -20185,13 +20185,13 @@
 class BlinkWebGLContextEvent extends BlinkEvent {
   static final instance = new BlinkWebGLContextEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebGLContextEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("WebGLContextEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebGLContextEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("WebGLContextEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebGLContextEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("WebGLContextEvent", [__arg_0, __arg_1]);
 
-  statusMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusMessage");
+  statusMessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLContextEvent */, "statusMessage");
 
 }
 
@@ -20203,9 +20203,9 @@
 class BlinkWebGLDebugShaders {
   static final instance = new BlinkWebGLDebugShaders();
 
-  getTranslatedShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTranslatedShaderSource", []);
+  getTranslatedShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLDebugShaders */, "getTranslatedShaderSource", []);
 
-  getTranslatedShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTranslatedShaderSource", [__arg_0]);
+  getTranslatedShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLDebugShaders */, "getTranslatedShaderSource", [__arg_0]);
 
 }
 
@@ -20217,9 +20217,9 @@
 class BlinkWebGLDrawBuffers {
   static final instance = new BlinkWebGLDrawBuffers();
 
-  drawBuffersWEBGL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffersWEBGL", []);
+  drawBuffersWEBGL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLDrawBuffers */, "drawBuffersWEBGL", []);
 
-  drawBuffersWEBGL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawBuffersWEBGL", [__arg_0]);
+  drawBuffersWEBGL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLDrawBuffers */, "drawBuffersWEBGL", [__arg_0]);
 
 }
 
@@ -20231,9 +20231,9 @@
 class BlinkWebGLLoseContext {
   static final instance = new BlinkWebGLLoseContext();
 
-  loseContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "loseContext", []);
+  loseContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLLoseContext */, "loseContext", []);
 
-  restoreContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "restoreContext", []);
+  restoreContext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLLoseContext */, "restoreContext", []);
 
 }
 
@@ -20255,1422 +20255,1422 @@
 class BlinkWebGLRenderingContext {
   static final instance = new BlinkWebGLRenderingContext();
 
-  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "canvas");
 
-  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferHeight");
 
-  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferWidth");
 
-  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
+  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", []);
 
-  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", [__arg_0]);
+  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", [__arg_0]);
 
-  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", []);
+  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", []);
 
-  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0]);
+  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0]);
 
-  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0, __arg_1]);
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0]);
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0]);
 
-  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1]);
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
 
-  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", []);
+  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", []);
 
-  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0]);
+  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0]);
 
-  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0, __arg_1]);
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0, __arg_1]);
 
-  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", []);
+  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", []);
 
-  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0]);
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0]);
 
-  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0, __arg_1]);
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0, __arg_1]);
 
-  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", []);
+  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", []);
 
-  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0]);
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0]);
 
-  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0, __arg_1]);
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0, __arg_1]);
 
-  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", []);
+  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", []);
 
-  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0]);
+  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0]);
 
-  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0, __arg_1]);
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0, __arg_1]);
 
-  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1]);
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1]);
 
-  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2]);
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2]);
 
-  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", []);
 
-  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", [__arg_0]);
 
-  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
+  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", []);
 
-  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0]);
 
-  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0, __arg_1]);
 
-  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", []);
 
-  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0]);
 
-  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
+  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0]);
 
-  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1]);
 
-  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1, __arg_2]);
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1, __arg_2]);
 
-  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0]);
+  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0]);
 
-  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1]);
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1]);
 
-  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
+  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", []);
 
-  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", []);
 
-  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", [__arg_0]);
 
-  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1]);
 
-  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2]);
 
-  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", []);
+  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", []);
 
-  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", [__arg_0]);
+  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", [__arg_0]);
 
-  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", []);
+  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", []);
 
-  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
+  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", [__arg_0]);
 
-  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1]);
 
-  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2]);
 
-  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", []);
+  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", []);
 
-  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", [__arg_0]);
+  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", [__arg_0]);
 
-  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", []);
+  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createBuffer", []);
 
-  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createFramebuffer", []);
+  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createFramebuffer", []);
 
-  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProgram", []);
+  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createProgram", []);
 
-  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRenderbuffer", []);
+  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createRenderbuffer", []);
 
-  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShader", []);
+  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", []);
 
-  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShader", [__arg_0]);
+  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", [__arg_0]);
 
-  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTexture", []);
+  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createTexture", []);
 
-  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", []);
+  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", []);
 
-  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", [__arg_0]);
+  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", [__arg_0]);
 
-  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", []);
+  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", []);
 
-  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", [__arg_0]);
+  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", [__arg_0]);
 
-  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", []);
+  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", []);
 
-  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", [__arg_0]);
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", [__arg_0]);
 
-  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", []);
+  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", []);
 
-  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", [__arg_0]);
+  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", [__arg_0]);
 
-  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", []);
+  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", []);
 
-  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", [__arg_0]);
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", [__arg_0]);
 
-  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", []);
+  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", []);
 
-  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", [__arg_0]);
+  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", [__arg_0]);
 
-  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", []);
+  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", []);
 
-  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", [__arg_0]);
+  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", [__arg_0]);
 
-  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", []);
+  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", []);
 
-  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", [__arg_0]);
+  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", [__arg_0]);
 
-  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", []);
+  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", []);
 
-  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", [__arg_0]);
+  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", [__arg_0]);
 
-  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", []);
+  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", []);
 
-  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0]);
+  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0]);
 
-  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0, __arg_1]);
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0, __arg_1]);
 
-  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", []);
+  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", []);
 
-  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0]);
+  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0]);
 
-  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0, __arg_1]);
 
-  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
+  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", []);
 
-  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
+  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", [__arg_0]);
 
-  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", []);
 
-  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", [__arg_0]);
 
-  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
+  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0]);
 
-  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1]);
 
-  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1, __arg_2]);
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1]);
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1]);
 
-  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2]);
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", []);
 
-  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", [__arg_0]);
 
-  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
+  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", []);
 
-  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", [__arg_0]);
 
-  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "finish", []);
 
-  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
+  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "flush", []);
 
-  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1]);
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1]);
 
-  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", []);
+  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", []);
 
-  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", [__arg_0]);
+  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", [__arg_0]);
 
-  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", []);
+  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", []);
 
-  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", [__arg_0]);
+  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", [__arg_0]);
 
-  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", []);
+  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", []);
 
-  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0]);
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0]);
 
-  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0, __arg_1]);
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0, __arg_1]);
 
-  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", []);
+  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", []);
 
-  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0]);
+  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0]);
 
-  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0, __arg_1]);
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0, __arg_1]);
 
-  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", []);
+  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", []);
 
-  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", [__arg_0]);
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", [__arg_0]);
 
-  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", []);
+  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", []);
 
-  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0]);
+  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0]);
 
-  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0, __arg_1]);
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0, __arg_1]);
 
-  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", []);
+  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", []);
 
-  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0]);
+  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0]);
 
-  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0, __arg_1]);
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0, __arg_1]);
 
-  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getContextAttributes", []);
 
-  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getError", []);
+  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getError", []);
 
-  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", []);
+  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", []);
 
-  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", [__arg_0]);
+  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0]);
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
 
-  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", []);
 
-  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", [__arg_0]);
 
-  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", []);
+  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", []);
 
-  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", [__arg_0]);
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", [__arg_0]);
 
-  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", []);
+  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", []);
 
-  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0]);
+  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0]);
 
-  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0, __arg_1]);
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0, __arg_1]);
 
-  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", []);
+  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", []);
 
-  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0]);
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0]);
 
-  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0, __arg_1]);
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0, __arg_1]);
 
-  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", []);
+  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", []);
 
-  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", [__arg_0]);
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", [__arg_0]);
 
-  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", []);
+  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", []);
 
-  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0]);
+  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0]);
 
-  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0, __arg_1]);
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0, __arg_1]);
 
-  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", []);
+  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", []);
 
-  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0]);
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0]);
 
-  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
 
-  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", []);
+  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", []);
 
-  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", [__arg_0]);
+  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", [__arg_0]);
 
-  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSupportedExtensions", []);
+  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getSupportedExtensions", []);
 
-  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", []);
+  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", []);
 
-  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0]);
+  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0]);
 
-  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0, __arg_1]);
 
-  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
+  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", []);
 
-  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
+  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0]);
 
-  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0, __arg_1]);
 
-  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", []);
 
-  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0]);
 
-  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0, __arg_1]);
 
-  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
+  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", []);
 
-  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0]);
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0]);
 
-  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0, __arg_1]);
 
-  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", []);
 
-  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0]);
 
-  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0, __arg_1]);
 
-  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
+  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", []);
 
-  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
+  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0]);
 
-  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0, __arg_1]);
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0, __arg_1]);
 
-  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", []);
+  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", []);
 
-  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", [__arg_0]);
+  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", [__arg_0]);
 
-  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isContextLost", []);
 
-  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", []);
+  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", []);
 
-  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", [__arg_0]);
+  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", [__arg_0]);
 
-  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", []);
+  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", []);
 
-  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", [__arg_0]);
+  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", [__arg_0]);
 
-  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", []);
+  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", []);
 
-  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", [__arg_0]);
+  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", [__arg_0]);
 
-  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", []);
+  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", []);
 
-  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", [__arg_0]);
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", [__arg_0]);
 
-  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isShader", []);
+  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", []);
 
-  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isShader", [__arg_0]);
+  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", [__arg_0]);
 
-  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", []);
+  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", []);
 
-  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", [__arg_0]);
+  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", [__arg_0]);
 
-  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", []);
+  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", []);
 
-  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", [__arg_0]);
+  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", [__arg_0]);
 
-  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", []);
+  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", []);
 
-  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", [__arg_0]);
+  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", [__arg_0]);
 
-  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", []);
+  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", []);
 
-  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0]);
+  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0]);
 
-  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0, __arg_1]);
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0, __arg_1]);
 
-  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", []);
+  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", []);
 
-  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0]);
+  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0]);
 
-  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0, __arg_1]);
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0, __arg_1]);
 
-  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1]);
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1]);
 
-  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
 
-  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", []);
+  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", []);
 
-  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0]);
+  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0]);
 
-  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0, __arg_1]);
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0, __arg_1]);
 
-  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1]);
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1]);
 
-  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2]);
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2]);
 
-  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", []);
+  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", []);
 
-  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0]);
+  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0]);
 
-  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0]);
 
-  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1]);
 
-  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", []);
 
-  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", [__arg_0]);
 
-  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
+  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", []);
 
-  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0]);
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0]);
 
-  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
+  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0]);
 
-  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1]);
 
-  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0]);
+  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0]);
 
-  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1]);
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1]);
 
-  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1, __arg_2]);
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1, __arg_2]);
 
-  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0]);
+  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0]);
 
-  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1]);
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1]);
 
-  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1, __arg_2]);
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1, __arg_2]);
 
-  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", []);
+  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", []);
 
-  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0]);
+  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0]);
 
-  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0, __arg_1]);
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0, __arg_1]);
 
-  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", []);
+  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", []);
 
-  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0]);
+  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0]);
 
-  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0, __arg_1]);
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0, __arg_1]);
 
-  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", []);
+  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", []);
 
-  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0]);
+  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0]);
 
-  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0, __arg_1]);
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0, __arg_1]);
 
-  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", []);
+  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", []);
 
-  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0]);
+  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0]);
 
-  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0, __arg_1]);
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0]);
+  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0]);
 
-  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1]);
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1, __arg_2]);
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", []);
+  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", []);
 
-  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0]);
+  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0]);
 
-  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0, __arg_1]);
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0]);
+  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0]);
 
-  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1]);
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1, __arg_2]);
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", []);
+  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", []);
 
-  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0]);
+  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0]);
 
-  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0, __arg_1]);
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1]);
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2]);
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", []);
+  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", []);
 
-  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0]);
+  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0]);
 
-  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0, __arg_1]);
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1]);
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2]);
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", []);
+  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", []);
 
-  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0]);
+  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0]);
 
-  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0, __arg_1]);
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0, __arg_1]);
 
-  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2]);
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", []);
+  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", []);
 
-  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0]);
+  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0]);
 
-  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0, __arg_1]);
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0, __arg_1]);
 
-  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2]);
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", []);
+  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", []);
 
-  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0]);
+  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0]);
 
-  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0, __arg_1]);
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0]);
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0]);
 
-  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1]);
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0]);
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0]);
 
-  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1]);
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0]);
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0]);
 
-  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1]);
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
 
-  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", []);
+  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", []);
 
-  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", [__arg_0]);
+  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", [__arg_0]);
 
-  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", []);
+  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", []);
 
-  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", [__arg_0]);
+  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", [__arg_0]);
 
-  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", []);
+  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", []);
 
-  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0]);
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0]);
 
-  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0, __arg_1]);
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0, __arg_1]);
 
-  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", []);
+  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", []);
 
-  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0]);
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0]);
 
-  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0, __arg_1]);
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0]);
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0]);
 
-  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1]);
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", []);
+  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", []);
 
-  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0]);
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0]);
 
-  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0, __arg_1]);
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1]);
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", []);
+  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", []);
 
-  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0]);
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0]);
 
-  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0, __arg_1]);
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0, __arg_1]);
 
-  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", []);
+  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", []);
 
-  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0]);
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0]);
 
-  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0, __arg_1]);
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0, __arg_1]);
 
-  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1]);
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1]);
 
-  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2]);
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2]);
 
-  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkWebGLRenderingContextBase {
   static final instance = new BlinkWebGLRenderingContextBase();
 
-  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "canvas");
+  canvas_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "canvas");
 
-  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferHeight");
+  drawingBufferHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferHeight");
 
-  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "drawingBufferWidth");
+  drawingBufferWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLRenderingContextBase */, "drawingBufferWidth");
 
-  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", []);
+  activeTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", []);
 
-  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "activeTexture", [__arg_0]);
+  activeTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "activeTexture", [__arg_0]);
 
-  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", []);
+  attachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", []);
 
-  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0]);
+  attachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0]);
 
-  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "attachShader", [__arg_0, __arg_1]);
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "attachShader", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0]);
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0]);
 
-  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1]);
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1]);
 
-  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindAttribLocation", [__arg_0, __arg_1, __arg_2]);
 
-  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", []);
+  bindBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", []);
 
-  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0]);
+  bindBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0]);
 
-  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindBuffer", [__arg_0, __arg_1]);
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindBuffer", [__arg_0, __arg_1]);
 
-  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", []);
+  bindFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", []);
 
-  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0]);
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0]);
 
-  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindFramebuffer", [__arg_0, __arg_1]);
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindFramebuffer", [__arg_0, __arg_1]);
 
-  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", []);
+  bindRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", []);
 
-  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0]);
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0]);
 
-  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindRenderbuffer", [__arg_0, __arg_1]);
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindRenderbuffer", [__arg_0, __arg_1]);
 
-  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", []);
+  bindTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", []);
 
-  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0]);
+  bindTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0]);
 
-  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bindTexture", [__arg_0, __arg_1]);
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bindTexture", [__arg_0, __arg_1]);
 
-  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1]);
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1]);
 
-  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2]);
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2]);
 
-  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", []);
+  blendEquation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", []);
 
-  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquation", [__arg_0]);
+  blendEquation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquation", [__arg_0]);
 
-  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", []);
+  blendEquationSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", []);
 
-  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0]);
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0]);
 
-  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendEquationSeparate", [__arg_0, __arg_1]);
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendEquationSeparate", [__arg_0, __arg_1]);
 
-  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", []);
+  blendFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", []);
 
-  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0]);
+  blendFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0]);
 
-  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFunc", [__arg_0, __arg_1]);
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFunc", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1]);
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1]);
 
-  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0]);
+  bufferData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0]);
 
-  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1]);
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1]);
 
-  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferData", [__arg_0, __arg_1, __arg_2]);
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferData", [__arg_0, __arg_1, __arg_2]);
 
-  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0]);
+  bufferSubData_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0]);
 
-  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1]);
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1]);
 
-  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "bufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", []);
+  checkFramebufferStatus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", []);
 
-  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "checkFramebufferStatus", [__arg_0]);
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "checkFramebufferStatus", [__arg_0]);
 
-  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clear", []);
+  clear_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", []);
 
-  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clear", [__arg_0]);
+  clear_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clear", [__arg_0]);
 
-  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1]);
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1]);
 
-  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2]);
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2]);
 
-  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", []);
+  clearDepth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", []);
 
-  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearDepth", [__arg_0]);
+  clearDepth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearDepth", [__arg_0]);
 
-  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", []);
+  clearStencil_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", []);
 
-  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearStencil", [__arg_0]);
+  clearStencil_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "clearStencil", [__arg_0]);
 
-  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1]);
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1]);
 
-  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2]);
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2]);
 
-  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", []);
+  compileShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", []);
 
-  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "compileShader", [__arg_0]);
+  compileShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compileShader", [__arg_0]);
 
-  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createBuffer", []);
+  createBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createBuffer", []);
 
-  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createFramebuffer", []);
+  createFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createFramebuffer", []);
 
-  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createProgram", []);
+  createProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createProgram", []);
 
-  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createRenderbuffer", []);
+  createRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createRenderbuffer", []);
 
-  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createShader", []);
+  createShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", []);
 
-  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createShader", [__arg_0]);
+  createShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createShader", [__arg_0]);
 
-  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createTexture", []);
+  createTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "createTexture", []);
 
-  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", []);
+  cullFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", []);
 
-  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cullFace", [__arg_0]);
+  cullFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "cullFace", [__arg_0]);
 
-  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", []);
+  deleteBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", []);
 
-  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteBuffer", [__arg_0]);
+  deleteBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteBuffer", [__arg_0]);
 
-  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", []);
+  deleteFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", []);
 
-  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteFramebuffer", [__arg_0]);
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteFramebuffer", [__arg_0]);
 
-  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", []);
+  deleteProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", []);
 
-  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteProgram", [__arg_0]);
+  deleteProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteProgram", [__arg_0]);
 
-  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", []);
+  deleteRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", []);
 
-  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteRenderbuffer", [__arg_0]);
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteRenderbuffer", [__arg_0]);
 
-  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", []);
+  deleteShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", []);
 
-  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteShader", [__arg_0]);
+  deleteShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteShader", [__arg_0]);
 
-  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", []);
+  deleteTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", []);
 
-  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "deleteTexture", [__arg_0]);
+  deleteTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "deleteTexture", [__arg_0]);
 
-  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", []);
+  depthFunc_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", []);
 
-  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthFunc", [__arg_0]);
+  depthFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthFunc", [__arg_0]);
 
-  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", []);
+  depthMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", []);
 
-  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthMask", [__arg_0]);
+  depthMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthMask", [__arg_0]);
 
-  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", []);
+  depthRange_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", []);
 
-  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0]);
+  depthRange_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0]);
 
-  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "depthRange", [__arg_0, __arg_1]);
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "depthRange", [__arg_0, __arg_1]);
 
-  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", []);
+  detachShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", []);
 
-  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0]);
+  detachShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0]);
 
-  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "detachShader", [__arg_0, __arg_1]);
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "detachShader", [__arg_0, __arg_1]);
 
-  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disable", []);
+  disable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", []);
 
-  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disable", [__arg_0]);
+  disable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disable", [__arg_0]);
 
-  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", []);
+  disableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", []);
 
-  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "disableVertexAttribArray", [__arg_0]);
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "disableVertexAttribArray", [__arg_0]);
 
-  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0]);
+  drawArrays_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0]);
 
-  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1]);
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1]);
 
-  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawArrays", [__arg_0, __arg_1, __arg_2]);
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawArrays", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1]);
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1]);
 
-  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2]);
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2]);
 
-  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enable", []);
+  enable_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", []);
 
-  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enable", [__arg_0]);
+  enable_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enable", [__arg_0]);
 
-  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", []);
+  enableVertexAttribArray_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", []);
 
-  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "enableVertexAttribArray", [__arg_0]);
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "enableVertexAttribArray", [__arg_0]);
 
-  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "finish", []);
+  finish_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "finish", []);
 
-  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "flush", []);
+  flush_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "flush", []);
 
-  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1]);
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1]);
 
-  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
 
-  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", []);
+  frontFace_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", []);
 
-  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "frontFace", [__arg_0]);
+  frontFace_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "frontFace", [__arg_0]);
 
-  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", []);
+  generateMipmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", []);
 
-  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "generateMipmap", [__arg_0]);
+  generateMipmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "generateMipmap", [__arg_0]);
 
-  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", []);
+  getActiveAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", []);
 
-  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0]);
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0]);
 
-  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveAttrib", [__arg_0, __arg_1]);
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveAttrib", [__arg_0, __arg_1]);
 
-  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", []);
+  getActiveUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", []);
 
-  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0]);
+  getActiveUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0]);
 
-  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getActiveUniform", [__arg_0, __arg_1]);
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getActiveUniform", [__arg_0, __arg_1]);
 
-  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", []);
+  getAttachedShaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", []);
 
-  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttachedShaders", [__arg_0]);
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttachedShaders", [__arg_0]);
 
-  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", []);
+  getAttribLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", []);
 
-  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0]);
+  getAttribLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0]);
 
-  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getAttribLocation", [__arg_0, __arg_1]);
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getAttribLocation", [__arg_0, __arg_1]);
 
-  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", []);
+  getBufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", []);
 
-  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0]);
+  getBufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0]);
 
-  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getBufferParameter", [__arg_0, __arg_1]);
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getBufferParameter", [__arg_0, __arg_1]);
 
-  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getContextAttributes", []);
+  getContextAttributes_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getContextAttributes", []);
 
-  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getError", []);
+  getError_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getError", []);
 
-  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", []);
+  getExtension_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", []);
 
-  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getExtension", [__arg_0]);
+  getExtension_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getExtension", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0]);
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0]);
 
-  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
 
-  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
 
-  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", []);
 
-  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getParameter", [__arg_0]);
 
-  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", []);
+  getProgramInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", []);
 
-  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramInfoLog", [__arg_0]);
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramInfoLog", [__arg_0]);
 
-  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", []);
+  getProgramParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", []);
 
-  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0]);
+  getProgramParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0]);
 
-  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getProgramParameter", [__arg_0, __arg_1]);
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getProgramParameter", [__arg_0, __arg_1]);
 
-  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", []);
+  getRenderbufferParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", []);
 
-  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0]);
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0]);
 
-  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getRenderbufferParameter", [__arg_0, __arg_1]);
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getRenderbufferParameter", [__arg_0, __arg_1]);
 
-  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", []);
+  getShaderInfoLog_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", []);
 
-  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderInfoLog", [__arg_0]);
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderInfoLog", [__arg_0]);
 
-  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", []);
+  getShaderParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", []);
 
-  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0]);
+  getShaderParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0]);
 
-  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderParameter", [__arg_0, __arg_1]);
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderParameter", [__arg_0, __arg_1]);
 
-  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", []);
+  getShaderPrecisionFormat_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", []);
 
-  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0]);
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0]);
 
-  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderPrecisionFormat", [__arg_0, __arg_1]);
 
-  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", []);
+  getShaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", []);
 
-  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getShaderSource", [__arg_0]);
+  getShaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getShaderSource", [__arg_0]);
 
-  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSupportedExtensions", []);
+  getSupportedExtensions_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getSupportedExtensions", []);
 
-  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", []);
+  getTexParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", []);
 
-  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0]);
+  getTexParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0]);
 
-  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getTexParameter", [__arg_0, __arg_1]);
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getTexParameter", [__arg_0, __arg_1]);
 
-  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", []);
+  getUniform_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", []);
 
-  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0]);
+  getUniform_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0]);
 
-  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniform", [__arg_0, __arg_1]);
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniform", [__arg_0, __arg_1]);
 
-  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", []);
+  getUniformLocation_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", []);
 
-  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0]);
+  getUniformLocation_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0]);
 
-  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getUniformLocation", [__arg_0, __arg_1]);
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getUniformLocation", [__arg_0, __arg_1]);
 
-  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", []);
+  getVertexAttrib_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", []);
 
-  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0]);
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0]);
 
-  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttrib", [__arg_0, __arg_1]);
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttrib", [__arg_0, __arg_1]);
 
-  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", []);
+  getVertexAttribOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", []);
 
-  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0]);
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0]);
 
-  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getVertexAttribOffset", [__arg_0, __arg_1]);
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "getVertexAttribOffset", [__arg_0, __arg_1]);
 
-  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "hint", []);
+  hint_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", []);
 
-  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0]);
+  hint_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0]);
 
-  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "hint", [__arg_0, __arg_1]);
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "hint", [__arg_0, __arg_1]);
 
-  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", []);
+  isBuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", []);
 
-  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isBuffer", [__arg_0]);
+  isBuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isBuffer", [__arg_0]);
 
-  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isContextLost", []);
+  isContextLost_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isContextLost", []);
 
-  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", []);
+  isEnabled_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", []);
 
-  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isEnabled", [__arg_0]);
+  isEnabled_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isEnabled", [__arg_0]);
 
-  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", []);
+  isFramebuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", []);
 
-  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isFramebuffer", [__arg_0]);
+  isFramebuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isFramebuffer", [__arg_0]);
 
-  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", []);
+  isProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", []);
 
-  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isProgram", [__arg_0]);
+  isProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isProgram", [__arg_0]);
 
-  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", []);
+  isRenderbuffer_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", []);
 
-  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isRenderbuffer", [__arg_0]);
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isRenderbuffer", [__arg_0]);
 
-  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isShader", []);
+  isShader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", []);
 
-  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isShader", [__arg_0]);
+  isShader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isShader", [__arg_0]);
 
-  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", []);
+  isTexture_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", []);
 
-  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "isTexture", [__arg_0]);
+  isTexture_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "isTexture", [__arg_0]);
 
-  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", []);
+  lineWidth_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", []);
 
-  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lineWidth", [__arg_0]);
+  lineWidth_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "lineWidth", [__arg_0]);
 
-  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", []);
+  linkProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", []);
 
-  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "linkProgram", [__arg_0]);
+  linkProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "linkProgram", [__arg_0]);
 
-  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", []);
+  pixelStorei_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", []);
 
-  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0]);
+  pixelStorei_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0]);
 
-  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "pixelStorei", [__arg_0, __arg_1]);
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "pixelStorei", [__arg_0, __arg_1]);
 
-  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", []);
+  polygonOffset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", []);
 
-  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0]);
+  polygonOffset_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0]);
 
-  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "polygonOffset", [__arg_0, __arg_1]);
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "polygonOffset", [__arg_0, __arg_1]);
 
-  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1]);
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1]);
 
-  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
 
-  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", []);
+  sampleCoverage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", []);
 
-  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0]);
+  sampleCoverage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0]);
 
-  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "sampleCoverage", [__arg_0, __arg_1]);
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "sampleCoverage", [__arg_0, __arg_1]);
 
-  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1]);
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1]);
 
-  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2]);
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2]);
 
-  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "scissor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", []);
+  shaderSource_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", []);
 
-  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0]);
+  shaderSource_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0]);
 
-  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "shaderSource", [__arg_0, __arg_1]);
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "shaderSource", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0]);
+  stencilFunc_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0]);
 
-  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1]);
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1]);
 
-  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFunc", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1]);
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1]);
 
-  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", []);
+  stencilMask_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", []);
 
-  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMask", [__arg_0]);
+  stencilMask_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMask", [__arg_0]);
 
-  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", []);
+  stencilMaskSeparate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", []);
 
-  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0]);
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0]);
 
-  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilMaskSeparate", [__arg_0, __arg_1]);
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilMaskSeparate", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0]);
+  stencilOp_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0]);
 
-  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1]);
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1]);
 
-  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOp", [__arg_0, __arg_1, __arg_2]);
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOp", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1]);
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1]);
 
-  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0]);
+  texParameterf_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0]);
 
-  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1]);
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1]);
 
-  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameterf", [__arg_0, __arg_1, __arg_2]);
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameterf", [__arg_0, __arg_1, __arg_2]);
 
-  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0]);
+  texParameteri_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0]);
 
-  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1]);
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1]);
 
-  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "texParameteri", [__arg_0, __arg_1, __arg_2]);
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texParameteri", [__arg_0, __arg_1, __arg_2]);
 
-  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", []);
+  uniform1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", []);
 
-  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0]);
+  uniform1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0]);
 
-  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1f", [__arg_0, __arg_1]);
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1f", [__arg_0, __arg_1]);
 
-  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", []);
+  uniform1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", []);
 
-  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0]);
+  uniform1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0]);
 
-  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1fv", [__arg_0, __arg_1]);
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1fv", [__arg_0, __arg_1]);
 
-  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", []);
+  uniform1i_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", []);
 
-  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0]);
+  uniform1i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0]);
 
-  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1i", [__arg_0, __arg_1]);
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1i", [__arg_0, __arg_1]);
 
-  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", []);
+  uniform1iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", []);
 
-  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0]);
+  uniform1iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0]);
 
-  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform1iv", [__arg_0, __arg_1]);
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform1iv", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0]);
+  uniform2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0]);
 
-  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1]);
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1]);
 
-  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2f", [__arg_0, __arg_1, __arg_2]);
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", []);
+  uniform2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", []);
 
-  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0]);
+  uniform2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0]);
 
-  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2fv", [__arg_0, __arg_1]);
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2fv", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0]);
+  uniform2i_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0]);
 
-  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1]);
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1]);
 
-  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform2i", [__arg_0, __arg_1, __arg_2]);
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", []);
+  uniform2iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", []);
 
-  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0]);
+  uniform2iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0]);
 
-  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform2iv", [__arg_0, __arg_1]);
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform2iv", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1]);
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1]);
 
-  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2]);
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", []);
+  uniform3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", []);
 
-  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0]);
+  uniform3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0]);
 
-  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3fv", [__arg_0, __arg_1]);
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3fv", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1]);
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1]);
 
-  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2]);
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", []);
+  uniform3iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", []);
 
-  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0]);
+  uniform3iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0]);
 
-  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform3iv", [__arg_0, __arg_1]);
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform3iv", [__arg_0, __arg_1]);
 
-  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2]);
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", []);
+  uniform4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", []);
 
-  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0]);
+  uniform4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0]);
 
-  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4fv", [__arg_0, __arg_1]);
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4fv", [__arg_0, __arg_1]);
 
-  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2]);
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2]);
 
-  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", []);
+  uniform4iv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", []);
 
-  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0]);
+  uniform4iv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0]);
 
-  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniform4iv", [__arg_0, __arg_1]);
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniform4iv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0]);
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0]);
 
-  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1]);
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1]);
 
-  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0]);
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0]);
 
-  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1]);
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1]);
 
-  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
 
-  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0]);
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0]);
 
-  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1]);
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1]);
 
-  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
 
-  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", []);
+  useProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", []);
 
-  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "useProgram", [__arg_0]);
+  useProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "useProgram", [__arg_0]);
 
-  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", []);
+  validateProgram_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", []);
 
-  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "validateProgram", [__arg_0]);
+  validateProgram_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "validateProgram", [__arg_0]);
 
-  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", []);
+  vertexAttrib1f_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", []);
 
-  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0]);
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0]);
 
-  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1f", [__arg_0, __arg_1]);
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1f", [__arg_0, __arg_1]);
 
-  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", []);
+  vertexAttrib1fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", []);
 
-  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0]);
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0]);
 
-  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib1fv", [__arg_0, __arg_1]);
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib1fv", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0]);
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0]);
 
-  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1]);
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1]);
 
-  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", []);
+  vertexAttrib2fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", []);
 
-  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0]);
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0]);
 
-  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib2fv", [__arg_0, __arg_1]);
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib2fv", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1]);
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1]);
 
-  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", []);
+  vertexAttrib3fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", []);
 
-  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0]);
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0]);
 
-  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib3fv", [__arg_0, __arg_1]);
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib3fv", [__arg_0, __arg_1]);
 
-  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
 
-  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", []);
+  vertexAttrib4fv_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", []);
 
-  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0]);
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0]);
 
-  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttrib4fv", [__arg_0, __arg_1]);
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttrib4fv", [__arg_0, __arg_1]);
 
-  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1]);
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1]);
 
-  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2]);
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2]);
 
-  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebGLRenderingContextBase */, "viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
@@ -21687,11 +21687,11 @@
 class BlinkWebGLShaderPrecisionFormat {
   static final instance = new BlinkWebGLShaderPrecisionFormat();
 
-  precision_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "precision");
+  precision_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLShaderPrecisionFormat */, "precision");
 
-  rangeMax_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rangeMax");
+  rangeMax_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLShaderPrecisionFormat */, "rangeMax");
 
-  rangeMin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "rangeMin");
+  rangeMin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebGLShaderPrecisionFormat */, "rangeMin");
 
 }
 
@@ -21728,1085 +21728,1085 @@
 class BlinkWebKitCSSMatrix {
   static final instance = new BlinkWebKitCSSMatrix();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebKitCSSMatrix"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("WebKitCSSMatrix");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebKitCSSMatrix"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("WebKitCSSMatrix", [__arg_0]);
 
-  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "a");
+  a_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "a");
 
-  a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
+  a_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "a", __arg_0);
 
-  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "b");
+  b_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "b");
 
-  b_Setter_(mthis, __arg_0) => mthis["b"] = __arg_0;
+  b_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "b", __arg_0);
 
-  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "c");
+  c_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "c");
 
-  c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
+  c_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "c", __arg_0);
 
-  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "d");
+  d_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "d");
 
-  d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
+  d_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "d", __arg_0);
 
-  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "e");
+  e_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "e");
 
-  e_Setter_(mthis, __arg_0) => mthis["e"] = __arg_0;
+  e_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "e", __arg_0);
 
-  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "f");
+  f_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "f");
 
-  f_Setter_(mthis, __arg_0) => mthis["f"] = __arg_0;
+  f_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "f", __arg_0);
 
-  m11_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m11");
+  m11_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m11");
 
-  m11_Setter_(mthis, __arg_0) => mthis["m11"] = __arg_0;
+  m11_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m11", __arg_0);
 
-  m12_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m12");
+  m12_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m12");
 
-  m12_Setter_(mthis, __arg_0) => mthis["m12"] = __arg_0;
+  m12_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m12", __arg_0);
 
-  m13_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m13");
+  m13_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m13");
 
-  m13_Setter_(mthis, __arg_0) => mthis["m13"] = __arg_0;
+  m13_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m13", __arg_0);
 
-  m14_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m14");
+  m14_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m14");
 
-  m14_Setter_(mthis, __arg_0) => mthis["m14"] = __arg_0;
+  m14_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m14", __arg_0);
 
-  m21_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m21");
+  m21_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m21");
 
-  m21_Setter_(mthis, __arg_0) => mthis["m21"] = __arg_0;
+  m21_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m21", __arg_0);
 
-  m22_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m22");
+  m22_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m22");
 
-  m22_Setter_(mthis, __arg_0) => mthis["m22"] = __arg_0;
+  m22_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m22", __arg_0);
 
-  m23_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m23");
+  m23_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m23");
 
-  m23_Setter_(mthis, __arg_0) => mthis["m23"] = __arg_0;
+  m23_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m23", __arg_0);
 
-  m24_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m24");
+  m24_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m24");
 
-  m24_Setter_(mthis, __arg_0) => mthis["m24"] = __arg_0;
+  m24_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m24", __arg_0);
 
-  m31_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m31");
+  m31_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m31");
 
-  m31_Setter_(mthis, __arg_0) => mthis["m31"] = __arg_0;
+  m31_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m31", __arg_0);
 
-  m32_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m32");
+  m32_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m32");
 
-  m32_Setter_(mthis, __arg_0) => mthis["m32"] = __arg_0;
+  m32_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m32", __arg_0);
 
-  m33_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m33");
+  m33_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m33");
 
-  m33_Setter_(mthis, __arg_0) => mthis["m33"] = __arg_0;
+  m33_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m33", __arg_0);
 
-  m34_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m34");
+  m34_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m34");
 
-  m34_Setter_(mthis, __arg_0) => mthis["m34"] = __arg_0;
+  m34_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m34", __arg_0);
 
-  m41_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m41");
+  m41_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m41");
 
-  m41_Setter_(mthis, __arg_0) => mthis["m41"] = __arg_0;
+  m41_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m41", __arg_0);
 
-  m42_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m42");
+  m42_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m42");
 
-  m42_Setter_(mthis, __arg_0) => mthis["m42"] = __arg_0;
+  m42_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m42", __arg_0);
 
-  m43_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m43");
+  m43_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m43");
 
-  m43_Setter_(mthis, __arg_0) => mthis["m43"] = __arg_0;
+  m43_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m43", __arg_0);
 
-  m44_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "m44");
+  m44_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebKitCSSMatrix */, "m44");
 
-  m44_Setter_(mthis, __arg_0) => mthis["m44"] = __arg_0;
+  m44_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebKitCSSMatrix */, "m44", __arg_0);
 
-  inverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "inverse", []);
+  inverse_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "inverse", []);
 
-  multiply_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "multiply", []);
+  multiply_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "multiply", []);
 
-  multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "multiply", [__arg_0]);
+  multiply_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "multiply", [__arg_0]);
 
-  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0]);
+  rotate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "rotate", [__arg_0]);
 
-  rotate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0, __arg_1]);
+  rotate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "rotate", [__arg_0, __arg_1]);
 
-  rotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rotate", [__arg_0, __arg_1, __arg_2]);
+  rotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "rotate", [__arg_0, __arg_1, __arg_2]);
 
-  rotateAxisAngle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1]);
+  rotateAxisAngle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "rotateAxisAngle", [__arg_0, __arg_1]);
 
-  rotateAxisAngle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2]);
+  rotateAxisAngle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2]);
 
-  rotateAxisAngle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  rotateAxisAngle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "rotateAxisAngle", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0]);
+  scale_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "scale", [__arg_0]);
 
-  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1]);
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "scale", [__arg_0, __arg_1]);
 
-  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scale", [__arg_0, __arg_1, __arg_2]);
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "scale", [__arg_0, __arg_1, __arg_2]);
 
-  setMatrixValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setMatrixValue", []);
+  setMatrixValue_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "setMatrixValue", []);
 
-  setMatrixValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setMatrixValue", [__arg_0]);
+  setMatrixValue_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "setMatrixValue", [__arg_0]);
 
-  skewX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "skewX", []);
+  skewX_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "skewX", []);
 
-  skewX_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "skewX", [__arg_0]);
+  skewX_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "skewX", [__arg_0]);
 
-  skewY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "skewY", []);
+  skewY_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "skewY", []);
 
-  skewY_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "skewY", [__arg_0]);
+  skewY_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "skewY", [__arg_0]);
 
-  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0]);
+  translate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "translate", [__arg_0]);
 
-  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1]);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "translate", [__arg_0, __arg_1]);
 
-  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "translate", [__arg_0, __arg_1, __arg_2]);
+  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WebKitCSSMatrix */, "translate", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkWebSocket extends BlinkEventTarget {
   static final instance = new BlinkWebSocket();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebSocket"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("WebSocket");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebSocket"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("WebSocket", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WebSocket"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("WebSocket", [__arg_0, __arg_1]);
 
-  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "binaryType");
+  binaryType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "binaryType");
 
-  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
+  binaryType_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebSocket */, "binaryType", __arg_0);
 
-  bufferedAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "bufferedAmount");
+  bufferedAmount_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "bufferedAmount");
 
-  extensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "extensions");
+  extensions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "extensions");
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebSocket */, "onclose", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebSocket */, "onerror", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebSocket */, "onmessage", __arg_0);
 
-  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onopen");
+  onopen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "onopen");
 
-  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
+  onopen_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WebSocket */, "onopen", __arg_0);
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "protocol");
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "readyState");
 
-  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "url");
+  url_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WebSocket */, "url");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebSocket */, "close", []);
 
-  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0]);
+  close_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebSocket */, "close", [__arg_0]);
 
-  close_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "close", [__arg_0, __arg_1]);
+  close_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WebSocket */, "close", [__arg_0, __arg_1]);
 
-  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
+  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WebSocket */, "send", []);
 
-  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
+  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WebSocket */, "send", [__arg_0]);
 
 }
 
 class BlinkWheelEvent extends BlinkMouseEvent {
   static final instance = new BlinkWheelEvent();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WheelEvent"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("WheelEvent");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WheelEvent"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("WheelEvent", [__arg_0]);
 
-  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "WheelEvent"), [__arg_0, __arg_1]);
+  constructorCallback_2_(__arg_0, __arg_1) => Blink_JsNative_DomException.callConstructor("WheelEvent", [__arg_0, __arg_1]);
 
-  deltaMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaMode");
+  deltaMode_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WheelEvent */, "deltaMode");
 
-  deltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaX");
+  deltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WheelEvent */, "deltaX");
 
-  deltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaY");
+  deltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WheelEvent */, "deltaY");
 
-  deltaZ_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "deltaZ");
+  deltaZ_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WheelEvent */, "deltaZ");
 
-  wheelDelta_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wheelDelta");
+  wheelDelta_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WheelEvent */, "wheelDelta");
 
-  wheelDeltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wheelDeltaX");
+  wheelDeltaX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WheelEvent */, "wheelDeltaX");
 
-  wheelDeltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "wheelDeltaY");
+  wheelDeltaY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WheelEvent */, "wheelDeltaY");
 
 }
 
 class BlinkWindow extends BlinkEventTarget {
   static final instance = new BlinkWindow();
 
-  applicationCache_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "applicationCache");
+  applicationCache_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "applicationCache");
 
-  caches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "caches");
+  caches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "caches");
 
-  clientInformation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "clientInformation");
+  clientInformation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "clientInformation");
 
-  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "closed");
+  closed_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "closed");
 
-  console_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "console");
+  console_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "console");
 
-  crypto_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crypto");
+  crypto_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "crypto");
 
-  defaultStatus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultStatus");
+  defaultStatus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "defaultStatus");
 
-  defaultStatus_Setter_(mthis, __arg_0) => mthis["defaultStatus"] = __arg_0;
+  defaultStatus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "defaultStatus", __arg_0);
 
-  defaultstatus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "defaultstatus");
+  defaultstatus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "defaultstatus");
 
-  defaultstatus_Setter_(mthis, __arg_0) => mthis["defaultstatus"] = __arg_0;
+  defaultstatus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "defaultstatus", __arg_0);
 
-  devicePixelRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "devicePixelRatio");
+  devicePixelRatio_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "devicePixelRatio");
 
-  document_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "document");
+  document_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "document");
 
-  event_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "event");
+  event_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "event");
 
-  event_Setter_(mthis, __arg_0) => mthis["event"] = __arg_0;
+  event_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "event", __arg_0);
 
-  frameElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frameElement");
+  frameElement_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "frameElement");
 
-  frames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "frames");
+  frames_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "frames");
 
-  history_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "history");
+  history_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "history");
 
-  indexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexedDB");
+  indexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "indexedDB");
 
-  innerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerHeight");
+  innerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "innerHeight");
 
-  innerWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "innerWidth");
+  innerWidth_Getter_(mthis) native "Blink_Getter_Window_innerWidth";
 
-  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "length");
+  length_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "length");
 
-  localStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "localStorage");
+  localStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "localStorage");
 
-  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
+  location_Getter_(mthis) native "Blink_Getter_Window_location";
 
-  locationbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "locationbar");
+  locationbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "locationbar");
 
-  menubar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "menubar");
+  menubar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "menubar");
 
-  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "name");
+  name_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "name");
 
-  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
+  name_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "name", __arg_0);
 
-  navigator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigator");
+  navigator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "navigator");
 
-  offscreenBuffering_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "offscreenBuffering");
+  offscreenBuffering_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "offscreenBuffering");
 
-  onanimationend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onanimationend");
+  onanimationend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onanimationend");
 
-  onanimationend_Setter_(mthis, __arg_0) => mthis["onanimationend"] = __arg_0;
+  onanimationend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onanimationend", __arg_0);
 
-  onanimationiteration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onanimationiteration");
+  onanimationiteration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onanimationiteration");
 
-  onanimationiteration_Setter_(mthis, __arg_0) => mthis["onanimationiteration"] = __arg_0;
+  onanimationiteration_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onanimationiteration", __arg_0);
 
-  onanimationstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onanimationstart");
+  onanimationstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onanimationstart");
 
-  onanimationstart_Setter_(mthis, __arg_0) => mthis["onanimationstart"] = __arg_0;
+  onanimationstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onanimationstart", __arg_0);
 
-  ondevicelight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondevicelight");
+  ondevicelight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ondevicelight");
 
-  ondevicelight_Setter_(mthis, __arg_0) => mthis["ondevicelight"] = __arg_0;
+  ondevicelight_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ondevicelight", __arg_0);
 
-  ondevicemotion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondevicemotion");
+  ondevicemotion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ondevicemotion");
 
-  ondevicemotion_Setter_(mthis, __arg_0) => mthis["ondevicemotion"] = __arg_0;
+  ondevicemotion_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ondevicemotion", __arg_0);
 
-  ondeviceorientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondeviceorientation");
+  ondeviceorientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ondeviceorientation");
 
-  ondeviceorientation_Setter_(mthis, __arg_0) => mthis["ondeviceorientation"] = __arg_0;
+  ondeviceorientation_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ondeviceorientation", __arg_0);
 
-  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onorientationchange");
+  onorientationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onorientationchange");
 
-  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
+  onorientationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onorientationchange", __arg_0);
 
-  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsearch");
+  onsearch_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onsearch");
 
-  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
+  onsearch_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onsearch", __arg_0);
 
-  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchcancel");
+  ontouchcancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ontouchcancel");
 
-  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
+  ontouchcancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ontouchcancel", __arg_0);
 
-  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchend");
+  ontouchend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ontouchend");
 
-  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
+  ontouchend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ontouchend", __arg_0);
 
-  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchmove");
+  ontouchmove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ontouchmove");
 
-  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
+  ontouchmove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ontouchmove", __arg_0);
 
-  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontouchstart");
+  ontouchstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ontouchstart");
 
-  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
+  ontouchstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ontouchstart", __arg_0);
 
-  ontransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontransitionend");
+  ontransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "ontransitionend");
 
-  ontransitionend_Setter_(mthis, __arg_0) => mthis["ontransitionend"] = __arg_0;
+  ontransitionend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "ontransitionend", __arg_0);
 
-  onwebkitanimationend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationend");
+  onwebkitanimationend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onwebkitanimationend");
 
-  onwebkitanimationend_Setter_(mthis, __arg_0) => mthis["onwebkitanimationend"] = __arg_0;
+  onwebkitanimationend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onwebkitanimationend", __arg_0);
 
-  onwebkitanimationiteration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationiteration");
+  onwebkitanimationiteration_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onwebkitanimationiteration");
 
-  onwebkitanimationiteration_Setter_(mthis, __arg_0) => mthis["onwebkitanimationiteration"] = __arg_0;
+  onwebkitanimationiteration_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onwebkitanimationiteration", __arg_0);
 
-  onwebkitanimationstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitanimationstart");
+  onwebkitanimationstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onwebkitanimationstart");
 
-  onwebkitanimationstart_Setter_(mthis, __arg_0) => mthis["onwebkitanimationstart"] = __arg_0;
+  onwebkitanimationstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onwebkitanimationstart", __arg_0);
 
-  onwebkittransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkittransitionend");
+  onwebkittransitionend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onwebkittransitionend");
 
-  onwebkittransitionend_Setter_(mthis, __arg_0) => mthis["onwebkittransitionend"] = __arg_0;
+  onwebkittransitionend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onwebkittransitionend", __arg_0);
 
-  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwheel");
+  onwheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "onwheel");
 
-  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
+  onwheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "onwheel", __arg_0);
 
-  opener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "opener");
+  opener_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "opener");
 
-  opener_Setter_(mthis, __arg_0) => mthis["opener"] = __arg_0;
+  opener_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "opener", __arg_0);
 
-  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "orientation");
+  orientation_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "orientation");
 
-  outerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerHeight");
+  outerHeight_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "outerHeight");
 
-  outerWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "outerWidth");
+  outerWidth_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "outerWidth");
 
-  pageXOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageXOffset");
+  pageXOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "pageXOffset");
 
-  pageYOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pageYOffset");
+  pageYOffset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "pageYOffset");
 
-  parent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "parent");
+  parent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "parent");
 
-  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "performance");
+  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "performance");
 
-  personalbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "personalbar");
+  personalbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "personalbar");
 
-  screen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screen");
+  screen_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "screen");
 
-  screenLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenLeft");
+  screenLeft_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "screenLeft");
 
-  screenTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenTop");
+  screenTop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "screenTop");
 
-  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenX");
+  screenX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "screenX");
 
-  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "screenY");
+  screenY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "screenY");
 
-  scrollX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollX");
+  scrollX_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "scrollX");
 
-  scrollY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollY");
+  scrollY_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "scrollY");
 
-  scrollbars_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "scrollbars");
+  scrollbars_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "scrollbars");
 
-  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "self");
+  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "self");
 
-  sessionStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "sessionStorage");
+  sessionStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "sessionStorage");
 
-  speechSynthesis_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "speechSynthesis");
+  speechSynthesis_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "speechSynthesis");
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "status");
 
-  status_Setter_(mthis, __arg_0) => mthis["status"] = __arg_0;
+  status_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Window */, "status", __arg_0);
 
-  statusbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusbar");
+  statusbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "statusbar");
 
-  styleMedia_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "styleMedia");
+  styleMedia_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "styleMedia");
 
-  toolbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "toolbar");
+  toolbar_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "toolbar");
 
-  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "top");
+  top_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "top");
 
-  webkitIndexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitIndexedDB");
+  webkitIndexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "webkitIndexedDB");
 
-  webkitStorageInfo_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitStorageInfo");
+  webkitStorageInfo_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "webkitStorageInfo");
 
-  window_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "window");
+  window_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Window */, "window");
 
-  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "__getter__", [__arg_0]);
+  $__getter___Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "__getter__", [__arg_0]);
 
-  alert_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "alert", []);
+  alert_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "alert", []);
 
-  alert_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "alert", [__arg_0]);
+  alert_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "alert", [__arg_0]);
 
-  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "blur", []);
+  blur_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "blur", []);
 
-  cancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", []);
+  cancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "cancelAnimationFrame", []);
 
-  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "cancelAnimationFrame", [__arg_0]);
+  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "cancelAnimationFrame", [__arg_0]);
 
-  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "captureEvents", []);
+  captureEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "captureEvents", []);
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "close", []);
 
-  confirm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "confirm", []);
+  confirm_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "confirm", []);
 
-  confirm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "confirm", [__arg_0]);
+  confirm_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "confirm", [__arg_0]);
 
-  createImageBitmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", []);
+  createImageBitmap_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "createImageBitmap", []);
 
-  createImageBitmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0]);
+  createImageBitmap_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "createImageBitmap", [__arg_0]);
 
-  createImageBitmap_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1]);
+  createImageBitmap_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "createImageBitmap", [__arg_0, __arg_1]);
 
-  createImageBitmap_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2]);
+  createImageBitmap_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "createImageBitmap", [__arg_0, __arg_1, __arg_2]);
 
-  createImageBitmap_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  createImageBitmap_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  createImageBitmap_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  createImageBitmap_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fetch", []);
+  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "fetch", []);
 
-  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0]);
+  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "fetch", [__arg_0]);
 
-  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0, __arg_1]);
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "fetch", [__arg_0, __arg_1]);
 
-  find_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  find_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  find_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
+  find_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  find_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
+  find_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "focus", []);
 
-  getComputedStyle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", []);
+  getComputedStyle_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "getComputedStyle", []);
 
-  getComputedStyle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", [__arg_0]);
+  getComputedStyle_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "getComputedStyle", [__arg_0]);
 
-  getComputedStyle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getComputedStyle", [__arg_0, __arg_1]);
+  getComputedStyle_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "getComputedStyle", [__arg_0, __arg_1]);
 
-  getMatchedCSSRules_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", []);
+  getMatchedCSSRules_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "getMatchedCSSRules", []);
 
-  getMatchedCSSRules_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", [__arg_0]);
+  getMatchedCSSRules_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "getMatchedCSSRules", [__arg_0]);
 
-  getMatchedCSSRules_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getMatchedCSSRules", [__arg_0, __arg_1]);
+  getMatchedCSSRules_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "getMatchedCSSRules", [__arg_0, __arg_1]);
 
-  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getSelection", []);
+  getSelection_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "getSelection", []);
 
-  matchMedia_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "matchMedia", []);
+  matchMedia_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "matchMedia", []);
 
-  matchMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "matchMedia", [__arg_0]);
+  matchMedia_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "matchMedia", [__arg_0]);
 
-  moveBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", []);
+  moveBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "moveBy", []);
 
-  moveBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", [__arg_0]);
+  moveBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "moveBy", [__arg_0]);
 
-  moveBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveBy", [__arg_0, __arg_1]);
+  moveBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "moveBy", [__arg_0, __arg_1]);
 
-  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", []);
+  moveTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "moveTo", []);
 
-  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0]);
+  moveTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "moveTo", [__arg_0]);
 
-  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "moveTo", [__arg_0, __arg_1]);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "moveTo", [__arg_0, __arg_1]);
 
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "open", []);
 
-  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
+  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "open", [__arg_0]);
 
-  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1]);
+  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "open", [__arg_0, __arg_1]);
 
-  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1, __arg_2]);
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "open", [__arg_0, __arg_1, __arg_2]);
 
-  openDatabase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1]);
+  openDatabase_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "openDatabase", [__arg_0, __arg_1]);
 
-  openDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2]);
+  openDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "openDatabase", [__arg_0, __arg_1, __arg_2]);
 
-  openDatabase_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  openDatabase_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  openDatabase_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  openDatabase_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "postMessage", [__arg_0, __arg_1]);
 
-  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1, __arg_2]);
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "postMessage", [__arg_0, __arg_1, __arg_2]);
 
-  print_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "print", []);
+  print_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "print", []);
 
-  prompt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "prompt", []);
+  prompt_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "prompt", []);
 
-  prompt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "prompt", [__arg_0]);
+  prompt_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "prompt", [__arg_0]);
 
-  prompt_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "prompt", [__arg_0, __arg_1]);
+  prompt_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "prompt", [__arg_0, __arg_1]);
 
-  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "releaseEvents", []);
+  releaseEvents_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "releaseEvents", []);
 
-  requestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", []);
+  requestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "requestAnimationFrame", []);
 
-  requestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "requestAnimationFrame", [__arg_0]);
+  requestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "requestAnimationFrame", [__arg_0]);
 
-  resizeBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", []);
+  resizeBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "resizeBy", []);
 
-  resizeBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", [__arg_0]);
+  resizeBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "resizeBy", [__arg_0]);
 
-  resizeBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "resizeBy", [__arg_0, __arg_1]);
+  resizeBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "resizeBy", [__arg_0, __arg_1]);
 
-  resizeTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", []);
+  resizeTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "resizeTo", []);
 
-  resizeTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", [__arg_0]);
+  resizeTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "resizeTo", [__arg_0]);
 
-  resizeTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "resizeTo", [__arg_0, __arg_1]);
+  resizeTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "resizeTo", [__arg_0, __arg_1]);
 
-  scroll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scroll", []);
+  scroll_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scroll", []);
 
-  scroll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0]);
+  scroll_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scroll", [__arg_0]);
 
-  scroll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1]);
+  scroll_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scroll", [__arg_0, __arg_1]);
 
-  scroll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scroll", [__arg_0, __arg_1, __arg_2]);
+  scroll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scroll", [__arg_0, __arg_1, __arg_2]);
 
-  scrollBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", []);
+  scrollBy_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollBy", []);
 
-  scrollBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0]);
+  scrollBy_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollBy", [__arg_0]);
 
-  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1]);
+  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollBy", [__arg_0, __arg_1]);
 
-  scrollBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scrollBy", [__arg_0, __arg_1, __arg_2]);
+  scrollBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollBy", [__arg_0, __arg_1, __arg_2]);
 
-  scrollTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", []);
+  scrollTo_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollTo", []);
 
-  scrollTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0]);
+  scrollTo_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollTo", [__arg_0]);
 
-  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1]);
+  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollTo", [__arg_0, __arg_1]);
 
-  scrollTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "scrollTo", [__arg_0, __arg_1, __arg_2]);
+  scrollTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "scrollTo", [__arg_0, __arg_1, __arg_2]);
 
-  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "stop", []);
+  stop_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "stop", []);
 
-  webkitCancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelAnimationFrame", []);
+  webkitCancelAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitCancelAnimationFrame", []);
 
-  webkitCancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelAnimationFrame", [__arg_0]);
+  webkitCancelAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitCancelAnimationFrame", [__arg_0]);
 
-  webkitCancelRequestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelRequestAnimationFrame", []);
+  webkitCancelRequestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitCancelRequestAnimationFrame", []);
 
-  webkitCancelRequestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitCancelRequestAnimationFrame", [__arg_0]);
+  webkitCancelRequestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitCancelRequestAnimationFrame", [__arg_0]);
 
-  webkitRequestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestAnimationFrame", []);
+  webkitRequestAnimationFrame_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitRequestAnimationFrame", []);
 
-  webkitRequestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestAnimationFrame", [__arg_0]);
+  webkitRequestAnimationFrame_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitRequestAnimationFrame", [__arg_0]);
 
-  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0]);
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitRequestFileSystem", [__arg_0]);
 
-  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1]);
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitRequestFileSystem", [__arg_0, __arg_1]);
 
-  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
 
-  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", []);
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitResolveLocalFileSystemURL", []);
 
-  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0]);
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitResolveLocalFileSystemURL", [__arg_0]);
 
-  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
 
-  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* Window */, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onabort", __arg_0);
 
-  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocomplete");
+  onautocomplete_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocomplete");
 
-  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
+  onautocomplete_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocomplete", __arg_0);
 
-  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onautocompleteerror");
+  onautocompleteerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror");
 
-  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
+  onautocompleteerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onautocompleteerror", __arg_0);
 
-  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onblur");
+  onblur_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onblur");
 
-  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
+  onblur_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onblur", __arg_0);
 
-  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncancel");
+  oncancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncancel");
 
-  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
+  oncancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncancel", __arg_0);
 
-  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplay");
+  oncanplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplay");
 
-  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
+  oncanplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplay", __arg_0);
 
-  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncanplaythrough");
+  oncanplaythrough_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough");
 
-  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
+  oncanplaythrough_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncanplaythrough", __arg_0);
 
-  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onchange");
+  onchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onchange");
 
-  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
+  onchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onchange", __arg_0);
 
-  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclick");
+  onclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclick");
 
-  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
+  onclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclick", __arg_0);
 
-  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onclose");
+  onclose_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onclose");
 
-  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
+  onclose_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onclose", __arg_0);
 
-  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncontextmenu");
+  oncontextmenu_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncontextmenu");
 
-  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
+  oncontextmenu_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncontextmenu", __arg_0);
 
-  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oncuechange");
+  oncuechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oncuechange");
 
-  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
+  oncuechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oncuechange", __arg_0);
 
-  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondblclick");
+  ondblclick_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondblclick");
 
-  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
+  ondblclick_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondblclick", __arg_0);
 
-  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrag");
+  ondrag_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrag");
 
-  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
+  ondrag_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrag", __arg_0);
 
-  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragend");
+  ondragend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragend");
 
-  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
+  ondragend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragend", __arg_0);
 
-  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragenter");
+  ondragenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragenter");
 
-  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
+  ondragenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragenter", __arg_0);
 
-  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragleave");
+  ondragleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragleave");
 
-  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
+  ondragleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragleave", __arg_0);
 
-  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragover");
+  ondragover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragover");
 
-  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
+  ondragover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragover", __arg_0);
 
-  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondragstart");
+  ondragstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondragstart");
 
-  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
+  ondragstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondragstart", __arg_0);
 
-  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondrop");
+  ondrop_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondrop");
 
-  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
+  ondrop_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondrop", __arg_0);
 
-  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ondurationchange");
+  ondurationchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ondurationchange");
 
-  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
+  ondurationchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ondurationchange", __arg_0);
 
-  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onemptied");
+  onemptied_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onemptied");
 
-  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
+  onemptied_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onemptied", __arg_0);
 
-  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onended");
+  onended_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onended");
 
-  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
+  onended_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onended", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onerror", __arg_0);
 
-  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onfocus");
+  onfocus_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onfocus");
 
-  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
+  onfocus_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onfocus", __arg_0);
 
-  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninput");
+  oninput_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninput");
 
-  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
+  oninput_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninput", __arg_0);
 
-  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "oninvalid");
+  oninvalid_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "oninvalid");
 
-  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
+  oninvalid_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "oninvalid", __arg_0);
 
-  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeydown");
+  onkeydown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeydown");
 
-  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
+  onkeydown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeydown", __arg_0);
 
-  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeypress");
+  onkeypress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeypress");
 
-  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
+  onkeypress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeypress", __arg_0);
 
-  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onkeyup");
+  onkeyup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onkeyup");
 
-  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
+  onkeyup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onkeyup", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onload", __arg_0);
 
-  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadeddata");
+  onloadeddata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadeddata");
 
-  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
+  onloadeddata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadeddata", __arg_0);
 
-  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadedmetadata");
+  onloadedmetadata_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata");
 
-  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
+  onloadedmetadata_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadedmetadata", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onloadstart", __arg_0);
 
-  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousedown");
+  onmousedown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousedown");
 
-  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
+  onmousedown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousedown", __arg_0);
 
-  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseenter");
+  onmouseenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseenter");
 
-  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
+  onmouseenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseenter", __arg_0);
 
-  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseleave");
+  onmouseleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseleave");
 
-  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
+  onmouseleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseleave", __arg_0);
 
-  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousemove");
+  onmousemove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousemove");
 
-  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
+  onmousemove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousemove", __arg_0);
 
-  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseout");
+  onmouseout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseout");
 
-  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
+  onmouseout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseout", __arg_0);
 
-  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseover");
+  onmouseover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseover");
 
-  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
+  onmouseover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseover", __arg_0);
 
-  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmouseup");
+  onmouseup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmouseup");
 
-  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
+  onmouseup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmouseup", __arg_0);
 
-  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmousewheel");
+  onmousewheel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onmousewheel");
 
-  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
+  onmousewheel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onmousewheel", __arg_0);
 
-  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpause");
+  onpause_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpause");
 
-  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
+  onpause_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpause", __arg_0);
 
-  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplay");
+  onplay_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplay");
 
-  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
+  onplay_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplay", __arg_0);
 
-  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onplaying");
+  onplaying_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onplaying");
 
-  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
+  onplaying_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onplaying", __arg_0);
 
-  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointercancel");
+  onpointercancel_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointercancel");
 
-  onpointercancel_Setter_(mthis, __arg_0) => mthis["onpointercancel"] = __arg_0;
+  onpointercancel_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointercancel", __arg_0);
 
-  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerdown");
+  onpointerdown_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerdown");
 
-  onpointerdown_Setter_(mthis, __arg_0) => mthis["onpointerdown"] = __arg_0;
+  onpointerdown_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerdown", __arg_0);
 
-  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerenter");
+  onpointerenter_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerenter");
 
-  onpointerenter_Setter_(mthis, __arg_0) => mthis["onpointerenter"] = __arg_0;
+  onpointerenter_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerenter", __arg_0);
 
-  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerleave");
+  onpointerleave_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerleave");
 
-  onpointerleave_Setter_(mthis, __arg_0) => mthis["onpointerleave"] = __arg_0;
+  onpointerleave_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerleave", __arg_0);
 
-  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointermove");
+  onpointermove_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointermove");
 
-  onpointermove_Setter_(mthis, __arg_0) => mthis["onpointermove"] = __arg_0;
+  onpointermove_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointermove", __arg_0);
 
-  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerout");
+  onpointerout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerout");
 
-  onpointerout_Setter_(mthis, __arg_0) => mthis["onpointerout"] = __arg_0;
+  onpointerout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerout", __arg_0);
 
-  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerover");
+  onpointerover_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerover");
 
-  onpointerover_Setter_(mthis, __arg_0) => mthis["onpointerover"] = __arg_0;
+  onpointerover_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerover", __arg_0);
 
-  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpointerup");
+  onpointerup_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onpointerup");
 
-  onpointerup_Setter_(mthis, __arg_0) => mthis["onpointerup"] = __arg_0;
+  onpointerup_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onpointerup", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onprogress", __arg_0);
 
-  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onratechange");
+  onratechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onratechange");
 
-  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
+  onratechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onratechange", __arg_0);
 
-  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreset");
+  onreset_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onreset");
 
-  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
+  onreset_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onreset", __arg_0);
 
-  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onresize");
+  onresize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onresize");
 
-  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
+  onresize_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onresize", __arg_0);
 
-  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onscroll");
+  onscroll_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onscroll");
 
-  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
+  onscroll_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onscroll", __arg_0);
 
-  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeked");
+  onseeked_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeked");
 
-  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
+  onseeked_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeked", __arg_0);
 
-  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onseeking");
+  onseeking_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onseeking");
 
-  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
+  onseeking_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onseeking", __arg_0);
 
-  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onselect");
+  onselect_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onselect");
 
-  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
+  onselect_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onselect", __arg_0);
 
-  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onshow");
+  onshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onshow");
 
-  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
+  onshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onshow", __arg_0);
 
-  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstalled");
+  onstalled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onstalled");
 
-  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
+  onstalled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onstalled", __arg_0);
 
-  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsubmit");
+  onsubmit_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsubmit");
 
-  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
+  onsubmit_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsubmit", __arg_0);
 
-  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onsuspend");
+  onsuspend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onsuspend");
 
-  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
+  onsuspend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onsuspend", __arg_0);
 
-  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeupdate");
+  ontimeupdate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontimeupdate");
 
-  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
+  ontimeupdate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontimeupdate", __arg_0);
 
-  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontoggle");
+  ontoggle_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "ontoggle");
 
-  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
+  ontoggle_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "ontoggle", __arg_0);
 
-  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onvolumechange");
+  onvolumechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onvolumechange");
 
-  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
+  onvolumechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onvolumechange", __arg_0);
 
-  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwaiting");
+  onwaiting_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* GlobalEventHandlers */, "onwaiting");
 
-  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
+  onwaiting_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* GlobalEventHandlers */, "onwaiting", __arg_0);
 
-  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "atob", []);
+  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "atob", []);
 
-  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "atob", [__arg_0]);
+  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "atob", [__arg_0]);
 
-  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "btoa", []);
+  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "btoa", []);
 
-  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "btoa", [__arg_0]);
+  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "btoa", [__arg_0]);
 
-  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onbeforeunload");
 
-  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
+  onbeforeunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onbeforeunload", __arg_0);
 
-  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onhashchange");
 
-  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
+  onhashchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onhashchange", __arg_0);
 
-  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onlanguagechange");
 
-  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
+  onlanguagechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onlanguagechange", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onmessage", __arg_0);
 
-  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onoffline");
 
-  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
+  onoffline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onoffline", __arg_0);
 
-  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "ononline");
 
-  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
+  ononline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "ononline", __arg_0);
 
-  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpagehide");
 
-  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
+  onpagehide_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpagehide", __arg_0);
 
-  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpageshow");
 
-  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
+  onpageshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpageshow", __arg_0);
 
-  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpopstate");
 
-  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+  onpopstate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpopstate", __arg_0);
 
-  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onrejectionhandled");
 
-  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+  onrejectionhandled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onrejectionhandled", __arg_0);
 
-  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onstorage");
 
-  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
+  onstorage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onstorage", __arg_0);
 
-  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunhandledrejection");
 
-  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+  onunhandledrejection_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunhandledrejection", __arg_0);
 
-  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunload");
 
-  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
+  onunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunload", __arg_0);
 
-  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", []);
+  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearInterval", []);
 
-  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", [__arg_0]);
+  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearInterval", [__arg_0]);
 
-  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", []);
+  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearTimeout", []);
 
-  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", [__arg_0]);
+  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearTimeout", [__arg_0]);
 
-  setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", []);
+  setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", []);
 
-  setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0]);
+  setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0]);
 
-  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1]);
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0, __arg_1]);
 
-  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1, __arg_2]);
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0, __arg_1, __arg_2]);
 
-  setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", []);
+  setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", []);
 
-  setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0]);
+  setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0]);
 
-  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1]);
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0, __arg_1]);
 
-  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1, __arg_2]);
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkWindowBase64 {
   static final instance = new BlinkWindowBase64();
 
-  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "atob", []);
+  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "atob", []);
 
-  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "atob", [__arg_0]);
+  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "atob", [__arg_0]);
 
-  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "btoa", []);
+  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "btoa", []);
 
-  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "btoa", [__arg_0]);
+  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "btoa", [__arg_0]);
 
 }
 
 class BlinkWindowClient extends BlinkClient {
   static final instance = new BlinkWindowClient();
 
-  focused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "focused");
+  focused_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowClient */, "focused");
 
-  visibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "visibilityState");
+  visibilityState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowClient */, "visibilityState");
 
-  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "focus", []);
+  focus_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowClient */, "focus", []);
 
 }
 
 class BlinkWindowEventHandlers {
   static final instance = new BlinkWindowEventHandlers();
 
-  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onbeforeunload");
+  onbeforeunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onbeforeunload");
 
-  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
+  onbeforeunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onbeforeunload", __arg_0);
 
-  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onhashchange");
+  onhashchange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onhashchange");
 
-  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
+  onhashchange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onhashchange", __arg_0);
 
-  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onlanguagechange");
+  onlanguagechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onlanguagechange");
 
-  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
+  onlanguagechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onlanguagechange", __arg_0);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onmessage", __arg_0);
 
-  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onoffline");
+  onoffline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onoffline");
 
-  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
+  onoffline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onoffline", __arg_0);
 
-  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ononline");
+  ononline_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "ononline");
 
-  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
+  ononline_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "ononline", __arg_0);
 
-  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpagehide");
+  onpagehide_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpagehide");
 
-  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
+  onpagehide_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpagehide", __arg_0);
 
-  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpageshow");
+  onpageshow_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpageshow");
 
-  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
+  onpageshow_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpageshow", __arg_0);
 
-  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onpopstate");
+  onpopstate_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onpopstate");
 
-  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
+  onpopstate_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onpopstate", __arg_0);
 
-  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onrejectionhandled");
 
-  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+  onrejectionhandled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onrejectionhandled", __arg_0);
 
-  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onstorage");
+  onstorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onstorage");
 
-  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
+  onstorage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onstorage", __arg_0);
 
-  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunhandledrejection");
 
-  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+  onunhandledrejection_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunhandledrejection", __arg_0);
 
-  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunload");
+  onunload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WindowEventHandlers */, "onunload");
 
-  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
+  onunload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WindowEventHandlers */, "onunload", __arg_0);
 
 }
 
 class BlinkWindowTimers {
   static final instance = new BlinkWindowTimers();
 
-  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", []);
+  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearInterval", []);
 
-  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", [__arg_0]);
+  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearInterval", [__arg_0]);
 
-  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", []);
+  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearTimeout", []);
 
-  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", [__arg_0]);
+  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearTimeout", [__arg_0]);
 
-  setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", []);
+  setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", []);
 
-  setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0]);
+  setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0]);
 
-  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1]);
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0, __arg_1]);
 
-  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1, __arg_2]);
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0, __arg_1, __arg_2]);
 
-  setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", []);
+  setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", []);
 
-  setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0]);
+  setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0]);
 
-  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1]);
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0, __arg_1]);
 
-  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1, __arg_2]);
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkWorker extends BlinkEventTarget {
   static final instance = new BlinkWorker();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Worker"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("Worker");
 
-  constructorCallback_1_(__arg_0) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "Worker"), [__arg_0]);
+  constructorCallback_1_(__arg_0) => Blink_JsNative_DomException.callConstructor("Worker", [__arg_0]);
 
-  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onmessage");
+  onmessage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* Worker */, "onmessage");
 
-  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
+  onmessage_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* Worker */, "onmessage", __arg_0);
 
-  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", []);
+  postMessage_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Worker */, "postMessage", []);
 
-  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0]);
+  postMessage_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* Worker */, "postMessage", [__arg_0]);
 
-  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "postMessage", [__arg_0, __arg_1]);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* Worker */, "postMessage", [__arg_0, __arg_1]);
 
-  terminate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "terminate", []);
+  terminate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* Worker */, "terminate", []);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* AbstractWorker */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* AbstractWorker */, "onerror", __arg_0);
 
 }
 
@@ -22818,216 +22818,216 @@
 class BlinkWorkerGlobalScope extends BlinkEventTarget {
   static final instance = new BlinkWorkerGlobalScope();
 
-  caches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "caches");
+  caches_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "caches");
 
-  console_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "console");
+  console_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "console");
 
-  crypto_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "crypto");
+  crypto_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "crypto");
 
-  indexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "indexedDB");
+  indexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "indexedDB");
 
-  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "location");
+  location_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "location");
 
-  navigator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "navigator");
+  navigator_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "navigator");
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WorkerGlobalScope */, "onerror", __arg_0);
 
-  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onrejectionhandled");
+  onrejectionhandled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "onrejectionhandled");
 
-  onrejectionhandled_Setter_(mthis, __arg_0) => mthis["onrejectionhandled"] = __arg_0;
+  onrejectionhandled_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WorkerGlobalScope */, "onrejectionhandled", __arg_0);
 
-  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onunhandledrejection");
+  onunhandledrejection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "onunhandledrejection");
 
-  onunhandledrejection_Setter_(mthis, __arg_0) => mthis["onunhandledrejection"] = __arg_0;
+  onunhandledrejection_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WorkerGlobalScope */, "onunhandledrejection", __arg_0);
 
-  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "performance");
+  performance_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "performance");
 
-  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "self");
+  self_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "self");
 
-  webkitIndexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitIndexedDB");
+  webkitIndexedDB_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerGlobalScope */, "webkitIndexedDB");
 
-  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "close", []);
+  close_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "close", []);
 
-  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "fetch", []);
+  fetch_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "fetch", []);
 
-  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0]);
+  fetch_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "fetch", [__arg_0]);
 
-  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "fetch", [__arg_0, __arg_1]);
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "fetch", [__arg_0, __arg_1]);
 
-  importScripts_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "importScripts", []);
+  importScripts_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "importScripts", []);
 
-  importScripts_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "importScripts", [__arg_0]);
+  importScripts_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "importScripts", [__arg_0]);
 
-  webkitRequestFileSystem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", []);
+  webkitRequestFileSystem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystem", []);
 
-  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0]);
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystem", [__arg_0]);
 
-  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1]);
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystem", [__arg_0, __arg_1]);
 
-  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
 
-  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  webkitRequestFileSystemSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", []);
+  webkitRequestFileSystemSync_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystemSync", []);
 
-  webkitRequestFileSystemSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", [__arg_0]);
+  webkitRequestFileSystemSync_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystemSync", [__arg_0]);
 
-  webkitRequestFileSystemSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitRequestFileSystemSync", [__arg_0, __arg_1]);
+  webkitRequestFileSystemSync_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitRequestFileSystemSync", [__arg_0, __arg_1]);
 
-  webkitResolveLocalFileSystemSyncURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemSyncURL", []);
+  webkitResolveLocalFileSystemSyncURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitResolveLocalFileSystemSyncURL", []);
 
-  webkitResolveLocalFileSystemSyncURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemSyncURL", [__arg_0]);
+  webkitResolveLocalFileSystemSyncURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitResolveLocalFileSystemSyncURL", [__arg_0]);
 
-  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", []);
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitResolveLocalFileSystemURL", []);
 
-  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0]);
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitResolveLocalFileSystemURL", [__arg_0]);
 
-  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
 
-  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WorkerGlobalScope */, "webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
 
-  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "atob", []);
+  atob_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "atob", []);
 
-  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "atob", [__arg_0]);
+  atob_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "atob", [__arg_0]);
 
-  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "btoa", []);
+  btoa_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "btoa", []);
 
-  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "btoa", [__arg_0]);
+  btoa_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowBase64 */, "btoa", [__arg_0]);
 
-  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", []);
+  clearInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearInterval", []);
 
-  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearInterval", [__arg_0]);
+  clearInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearInterval", [__arg_0]);
 
-  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", []);
+  clearTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearTimeout", []);
 
-  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearTimeout", [__arg_0]);
+  clearTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "clearTimeout", [__arg_0]);
 
-  setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", []);
+  setInterval_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", []);
 
-  setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0]);
+  setInterval_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0]);
 
-  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1]);
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0, __arg_1]);
 
-  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setInterval", [__arg_0, __arg_1, __arg_2]);
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setInterval", [__arg_0, __arg_1, __arg_2]);
 
-  setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", []);
+  setTimeout_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", []);
 
-  setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0]);
+  setTimeout_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0]);
 
-  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1]);
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0, __arg_1]);
 
-  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setTimeout", [__arg_0, __arg_1, __arg_2]);
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WindowTimers */, "setTimeout", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkWorkerLocation {
   static final instance = new BlinkWorkerLocation();
 
-  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hash");
+  hash_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "hash");
 
-  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "host");
+  host_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "host");
 
-  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hostname");
+  hostname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "hostname");
 
-  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "href");
+  href_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "href");
 
-  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "origin");
+  origin_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "origin");
 
-  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "pathname");
+  pathname_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "pathname");
 
-  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "port");
+  port_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "port");
 
-  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "protocol");
+  protocol_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "protocol");
 
-  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "search");
+  search_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* URLUtilsReadOnly */, "search");
 
-  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "toString", []);
+  toString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* URLUtilsReadOnly */, "toString", []);
 
 }
 
 class BlinkWorkerNavigator {
   static final instance = new BlinkWorkerNavigator();
 
-  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "connection");
+  connection_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerNavigator */, "connection");
 
-  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "geofencing");
+  geofencing_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerNavigator */, "geofencing");
 
-  permissions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "permissions");
+  permissions_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerNavigator */, "permissions");
 
-  services_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "services");
+  services_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerNavigator */, "services");
 
-  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitPersistentStorage");
+  webkitPersistentStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerNavigator */, "webkitPersistentStorage");
 
-  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "webkitTemporaryStorage");
+  webkitTemporaryStorage_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerNavigator */, "webkitTemporaryStorage");
 
-  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "hardwareConcurrency");
+  hardwareConcurrency_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorCPU */, "hardwareConcurrency");
 
-  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appCodeName");
+  appCodeName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appCodeName");
 
-  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appName");
+  appName_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appName");
 
-  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "appVersion");
+  appVersion_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "appVersion");
 
-  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "dartEnabled");
+  dartEnabled_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "dartEnabled");
 
-  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "platform");
+  platform_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "platform");
 
-  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "product");
+  product_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "product");
 
-  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "userAgent");
+  userAgent_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorID */, "userAgent");
 
-  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onLine");
+  onLine_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* NavigatorOnLine */, "onLine");
 
 }
 
 class BlinkWorkerPerformance extends BlinkEventTarget {
   static final instance = new BlinkWorkerPerformance();
 
-  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "memory");
+  memory_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerPerformance */, "memory");
 
-  onwebkitresourcetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onwebkitresourcetimingbufferfull");
+  onwebkitresourcetimingbufferfull_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* WorkerPerformance */, "onwebkitresourcetimingbufferfull");
 
-  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onwebkitresourcetimingbufferfull"] = __arg_0;
+  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* WorkerPerformance */, "onwebkitresourcetimingbufferfull", __arg_0);
 
-  clearMarks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", []);
+  clearMarks_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "clearMarks", []);
 
-  clearMarks_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMarks", [__arg_0]);
+  clearMarks_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "clearMarks", [__arg_0]);
 
-  clearMeasures_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearMeasures", []);
+  clearMeasures_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "clearMeasures", []);
 
-  clearMeasures_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "clearMeasures", [__arg_0]);
+  clearMeasures_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "clearMeasures", [__arg_0]);
 
-  getEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntries", []);
+  getEntries_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "getEntries", []);
 
-  getEntriesByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", []);
+  getEntriesByName_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "getEntriesByName", []);
 
-  getEntriesByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", [__arg_0]);
+  getEntriesByName_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "getEntriesByName", [__arg_0]);
 
-  getEntriesByName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByName", [__arg_0, __arg_1]);
+  getEntriesByName_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "getEntriesByName", [__arg_0, __arg_1]);
 
-  getEntriesByType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByType", []);
+  getEntriesByType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "getEntriesByType", []);
 
-  getEntriesByType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getEntriesByType", [__arg_0]);
+  getEntriesByType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "getEntriesByType", [__arg_0]);
 
-  mark_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "mark", []);
+  mark_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "mark", []);
 
-  mark_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "mark", [__arg_0]);
+  mark_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "mark", [__arg_0]);
 
-  measure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0]);
+  measure_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "measure", [__arg_0]);
 
-  measure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1]);
+  measure_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "measure", [__arg_0, __arg_1]);
 
-  measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "measure", [__arg_0, __arg_1, __arg_2]);
+  measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "measure", [__arg_0, __arg_1, __arg_2]);
 
-  now_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "now", []);
+  now_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "now", []);
 
-  webkitClearResourceTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitClearResourceTimings", []);
+  webkitClearResourceTimings_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "webkitClearResourceTimings", []);
 
-  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "webkitSetResourceTimingBufferSize", []);
+  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "webkitSetResourceTimingBufferSize", []);
 
-  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "webkitSetResourceTimingBufferSize", [__arg_0]);
+  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* WorkerPerformance */, "webkitSetResourceTimingBufferSize", [__arg_0]);
 
 }
 
@@ -23039,115 +23039,115 @@
 class BlinkXMLHttpRequest extends BlinkXMLHttpRequestEventTarget {
   static final instance = new BlinkXMLHttpRequest();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "XMLHttpRequest"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("XMLHttpRequest");
 
-  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onreadystatechange");
+  onreadystatechange_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "onreadystatechange");
 
-  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
+  onreadystatechange_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequest */, "onreadystatechange", __arg_0);
 
-  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "readyState");
+  readyState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "readyState");
 
-  response_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "response");
+  response_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "response");
 
-  responseText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseText");
+  responseText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "responseText");
 
-  responseType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseType");
+  responseType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "responseType");
 
-  responseType_Setter_(mthis, __arg_0) => mthis["responseType"] = __arg_0;
+  responseType_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequest */, "responseType", __arg_0);
 
-  responseURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseURL");
+  responseURL_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "responseURL");
 
-  responseXML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "responseXML");
+  responseXML_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "responseXML");
 
-  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "status");
+  status_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "status");
 
-  statusText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "statusText");
+  statusText_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "statusText");
 
-  timeout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "timeout");
+  timeout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "timeout");
 
-  timeout_Setter_(mthis, __arg_0) => mthis["timeout"] = __arg_0;
+  timeout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequest */, "timeout", __arg_0);
 
-  upload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "upload");
+  upload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "upload");
 
-  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "withCredentials");
+  withCredentials_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequest */, "withCredentials");
 
-  withCredentials_Setter_(mthis, __arg_0) => mthis["withCredentials"] = __arg_0;
+  withCredentials_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequest */, "withCredentials", __arg_0);
 
-  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "abort", []);
+  abort_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "abort", []);
 
-  getAllResponseHeaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getAllResponseHeaders", []);
+  getAllResponseHeaders_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "getAllResponseHeaders", []);
 
-  getResponseHeader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getResponseHeader", []);
+  getResponseHeader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "getResponseHeader", []);
 
-  getResponseHeader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getResponseHeader", [__arg_0]);
+  getResponseHeader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "getResponseHeader", [__arg_0]);
 
-  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "open", []);
+  open_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "open", []);
 
-  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0]);
+  open_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "open", [__arg_0]);
 
-  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1]);
+  open_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "open", [__arg_0, __arg_1]);
 
-  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1, __arg_2]);
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "open", [__arg_0, __arg_1, __arg_2]);
 
-  open_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  open_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "open", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  open_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "open", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  open_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "open", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  overrideMimeType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "overrideMimeType", []);
+  overrideMimeType_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "overrideMimeType", []);
 
-  overrideMimeType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "overrideMimeType", [__arg_0]);
+  overrideMimeType_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "overrideMimeType", [__arg_0]);
 
-  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "send", []);
+  send_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "send", []);
 
-  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "send", [__arg_0]);
+  send_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "send", [__arg_0]);
 
-  setRequestHeader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "setRequestHeader", []);
+  setRequestHeader_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "setRequestHeader", []);
 
-  setRequestHeader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setRequestHeader", [__arg_0]);
+  setRequestHeader_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "setRequestHeader", [__arg_0]);
 
-  setRequestHeader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setRequestHeader", [__arg_0, __arg_1]);
+  setRequestHeader_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XMLHttpRequest */, "setRequestHeader", [__arg_0, __arg_1]);
 
 }
 
 class BlinkXMLHttpRequestEventTarget extends BlinkEventTarget {
   static final instance = new BlinkXMLHttpRequestEventTarget();
 
-  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onabort");
+  onabort_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestEventTarget */, "onabort");
 
-  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
+  onabort_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequestEventTarget */, "onabort", __arg_0);
 
-  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onerror");
+  onerror_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestEventTarget */, "onerror");
 
-  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
+  onerror_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequestEventTarget */, "onerror", __arg_0);
 
-  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onload");
+  onload_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestEventTarget */, "onload");
 
-  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
+  onload_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequestEventTarget */, "onload", __arg_0);
 
-  onloadend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadend");
+  onloadend_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestEventTarget */, "onloadend");
 
-  onloadend_Setter_(mthis, __arg_0) => mthis["onloadend"] = __arg_0;
+  onloadend_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequestEventTarget */, "onloadend", __arg_0);
 
-  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onloadstart");
+  onloadstart_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestEventTarget */, "onloadstart");
 
-  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
+  onloadstart_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequestEventTarget */, "onloadstart", __arg_0);
 
-  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "onprogress");
+  onprogress_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestEventTarget */, "onprogress");
 
-  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
+  onprogress_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequestEventTarget */, "onprogress", __arg_0);
 
-  ontimeout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "ontimeout");
+  ontimeout_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestEventTarget */, "ontimeout");
 
-  ontimeout_Setter_(mthis, __arg_0) => mthis["ontimeout"] = __arg_0;
+  ontimeout_Setter_(mthis, __arg_0) => Blink_JsNative_DomException.setProperty(mthis /* XMLHttpRequestEventTarget */, "ontimeout", __arg_0);
 
 }
 
 class BlinkXMLHttpRequestProgressEvent extends BlinkProgressEvent {
   static final instance = new BlinkXMLHttpRequestProgressEvent();
 
-  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "position");
+  position_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestProgressEvent */, "position");
 
-  totalSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "totalSize");
+  totalSize_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XMLHttpRequestProgressEvent */, "totalSize");
 
 }
 
@@ -23159,128 +23159,128 @@
 class BlinkXMLSerializer {
   static final instance = new BlinkXMLSerializer();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "XMLSerializer"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("XMLSerializer");
 
-  serializeToString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "serializeToString", []);
+  serializeToString_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XMLSerializer */, "serializeToString", []);
 
-  serializeToString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "serializeToString", [__arg_0]);
+  serializeToString_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XMLSerializer */, "serializeToString", [__arg_0]);
 
 }
 
 class BlinkXPathEvaluator {
   static final instance = new BlinkXPathEvaluator();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "XPathEvaluator"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("XPathEvaluator");
 
-  createExpression_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", []);
+  createExpression_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "createExpression", []);
 
-  createExpression_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", [__arg_0]);
+  createExpression_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "createExpression", [__arg_0]);
 
-  createExpression_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "createExpression", [__arg_0, __arg_1]);
+  createExpression_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "createExpression", [__arg_0, __arg_1]);
 
-  createNSResolver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "createNSResolver", []);
+  createNSResolver_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "createNSResolver", []);
 
-  createNSResolver_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "createNSResolver", [__arg_0]);
+  createNSResolver_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "createNSResolver", [__arg_0]);
 
-  evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0]);
+  evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "evaluate", [__arg_0]);
 
-  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1]);
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "evaluate", [__arg_0, __arg_1]);
 
-  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2]);
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "evaluate", [__arg_0, __arg_1, __arg_2]);
 
-  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3]);
+  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
+  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => Blink_JsNative_DomException.callMethod(mthis /* XPathEvaluator */, "evaluate", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkXPathExpression {
   static final instance = new BlinkXPathExpression();
 
-  evaluate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", []);
+  evaluate_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XPathExpression */, "evaluate", []);
 
-  evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0]);
+  evaluate_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XPathExpression */, "evaluate", [__arg_0]);
 
-  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1]);
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XPathExpression */, "evaluate", [__arg_0, __arg_1]);
 
-  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "evaluate", [__arg_0, __arg_1, __arg_2]);
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* XPathExpression */, "evaluate", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkXPathNSResolver {
   static final instance = new BlinkXPathNSResolver();
 
-  lookupNamespaceURI_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "lookupNamespaceURI", []);
+  lookupNamespaceURI_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XPathNSResolver */, "lookupNamespaceURI", []);
 
-  lookupNamespaceURI_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "lookupNamespaceURI", [__arg_0]);
+  lookupNamespaceURI_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XPathNSResolver */, "lookupNamespaceURI", [__arg_0]);
 
 }
 
 class BlinkXPathResult {
   static final instance = new BlinkXPathResult();
 
-  booleanValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "booleanValue");
+  booleanValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XPathResult */, "booleanValue");
 
-  invalidIteratorState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "invalidIteratorState");
+  invalidIteratorState_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XPathResult */, "invalidIteratorState");
 
-  numberValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "numberValue");
+  numberValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XPathResult */, "numberValue");
 
-  resultType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "resultType");
+  resultType_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XPathResult */, "resultType");
 
-  singleNodeValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "singleNodeValue");
+  singleNodeValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XPathResult */, "singleNodeValue");
 
-  snapshotLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "snapshotLength");
+  snapshotLength_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XPathResult */, "snapshotLength");
 
-  stringValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "stringValue");
+  stringValue_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis /* XPathResult */, "stringValue");
 
-  iterateNext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "iterateNext", []);
+  iterateNext_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XPathResult */, "iterateNext", []);
 
-  snapshotItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "snapshotItem", []);
+  snapshotItem_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XPathResult */, "snapshotItem", []);
 
-  snapshotItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "snapshotItem", [__arg_0]);
+  snapshotItem_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XPathResult */, "snapshotItem", [__arg_0]);
 
 }
 
 class BlinkXSLTProcessor {
   static final instance = new BlinkXSLTProcessor();
 
-  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "XSLTProcessor"), []);
+  constructorCallback_0_() => Blink_JsNative_DomException.callConstructor0("XSLTProcessor");
 
-  clearParameters_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "clearParameters", []);
+  clearParameters_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "clearParameters", []);
 
-  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", []);
+  getParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "getParameter", []);
 
-  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0]);
+  getParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "getParameter", [__arg_0]);
 
-  getParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "getParameter", [__arg_0, __arg_1]);
+  getParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "getParameter", [__arg_0, __arg_1]);
 
-  importStylesheet_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "importStylesheet", []);
+  importStylesheet_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "importStylesheet", []);
 
-  importStylesheet_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "importStylesheet", [__arg_0]);
+  importStylesheet_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "importStylesheet", [__arg_0]);
 
-  removeParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "removeParameter", []);
+  removeParameter_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "removeParameter", []);
 
-  removeParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "removeParameter", [__arg_0]);
+  removeParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "removeParameter", [__arg_0]);
 
-  removeParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "removeParameter", [__arg_0, __arg_1]);
+  removeParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "removeParameter", [__arg_0, __arg_1]);
 
-  reset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "reset", []);
+  reset_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "reset", []);
 
-  setParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "setParameter", [__arg_0]);
+  setParameter_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "setParameter", [__arg_0]);
 
-  setParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "setParameter", [__arg_0, __arg_1]);
+  setParameter_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "setParameter", [__arg_0, __arg_1]);
 
-  setParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis, "setParameter", [__arg_0, __arg_1, __arg_2]);
+  setParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "setParameter", [__arg_0, __arg_1, __arg_2]);
 
-  transformToDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transformToDocument", []);
+  transformToDocument_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "transformToDocument", []);
 
-  transformToDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformToDocument", [__arg_0]);
+  transformToDocument_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "transformToDocument", [__arg_0]);
 
-  transformToFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "transformToFragment", []);
+  transformToFragment_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "transformToFragment", []);
 
-  transformToFragment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "transformToFragment", [__arg_0]);
+  transformToFragment_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "transformToFragment", [__arg_0]);
 
-  transformToFragment_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "transformToFragment", [__arg_0, __arg_1]);
+  transformToFragment_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis /* XSLTProcessor */, "transformToFragment", [__arg_0, __arg_1]);
 
 }
 
@@ -23297,13 +23297,14 @@
 
   static register(document, tag, customType, extendsTagName) native "Utils_register";
 
-  static createElement(document, tagName) native "Utils_createElement";
+  // Defines an interceptor if there is an appropriate JavaScript prototype to define it on.
+  // In any case, returns a typed JS wrapper compatibile with dart:html and the new
+  // typed JS Interop.
+  static defineInterceptorCustomElement(jsObject, Type type) native "Utils_defineInterceptorCustomElement";
+  static setInstanceInterceptor(o, Type type, {bool customElement: false}) native "Utils_setInstanceInterceptor";
 
-  static constructElement(element_type, jsObject) native "Utils_constructor_create";
-
+  // This method will throw if the element isn't actually a real Element.
   static initializeCustomElement(element) native "Utils_initializeCustomElement";
-
-  static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
 }
 
 class Blink_DOMWindowCrossFrame {
@@ -23353,9 +23354,63 @@
 }
 
 // Calls through JsNative but returns DomException instead of error strings.
+class Stats {
+  Stats(this.name) {
+    counts = new Map<String, int>();
+  }
+
+  String name;
+  Map<String, int> counts;
+  clear() {
+    counts.clear();
+  }
+
+  track(String v) {
+    counts[v] = counts.putIfAbsent(v, ()=> 0) + 1;
+  }
+  toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('================');
+    sb.write('$name ${counts.length}');
+    var keys = counts.keys.toList();
+    keys.sort((a,b) => counts[b].compareTo(counts[a]));
+    for (var key in keys) {
+      print("$key => ${counts[key]}");
+    }
+    sb.write('---------------');
+    sb.write('================');
+    return sb;
+  }
+}
+
+bool TRACK_STATS = true;
+dumpStats() {
+  print("------------ STATS ----------------");
+  print(Blink_JsNative_DomException.getPropertyStats.toString()); 
+  print(Blink_JsNative_DomException.setPropertyStats.toString());
+  print(Blink_JsNative_DomException.callMethodStats.toString());
+  print(Blink_JsNative_DomException.constructorStats.toString());
+  print("-----------------------------------");
+}
+
+clearStats() {
+  Blink_JsNative_DomException.getPropertyStats.clear();
+  Blink_JsNative_DomException.setPropertyStats.clear();
+  Blink_JsNative_DomException.callMethodStats.clear();  
+  Blink_JsNative_DomException.constructorStats.clear();  
+}
+
 class Blink_JsNative_DomException {
-  static getProperty(js.JsObject o, name) {
+  static var getPropertyStats = new Stats('get property');
+  static var setPropertyStats = new Stats('set property');
+  static var callMethodStats = new Stats('call method');
+  static var constructorStats = new Stats('constructor');
+
+  static var constructors = new Map<String, dynamic>();
+
+  static getProperty(o, String name) {
     try {
+      if (TRACK_STATS) getPropertyStats.track(name);
       return js.JsNative.getProperty(o, name);
     } catch (e) {
       // Re-throw any errors (returned as a string) as a DomException.
@@ -23363,8 +23418,51 @@
     }
   }
 
-  static callMethod(js.JsObject o, String method, List args) {
+  static propertyQuery(o, String name) {
     try {
+      if (TRACK_STATS) getPropertyStats.track('__propertyQuery__');
+      return js.JsNative.getProperty(o, name);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static callConstructor0(String name) {
+    try {
+      if (TRACK_STATS) constructorStats.track(name);
+      var constructor = constructors.putIfAbsent(name, () => js.context[name]);
+      return js.JsNative.callConstructor0(constructor);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static callConstructor(String name, List args) {
+    try {
+      if (TRACK_STATS) constructorStats.track(name);
+      var constructor = constructors.putIfAbsent(name, () => js.context[name]);
+      return js.JsNative.callConstructor(constructor, args);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static setProperty(o, String name, value) {
+    try {
+      if (TRACK_STATS) setPropertyStats.track(name);
+      return js.JsNative.setProperty(o, name, value);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static callMethod(o, String method, List args) {
+    try {
+      if (TRACK_STATS) callMethodStats.track(method);
       return js.JsNative.callMethod(o, method, args);
     } catch (e) {
       // Re-throw any errors (returned as a string) as a DomException.
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 4976562..7d2e968 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -1953,13 +1953,17 @@
     // Replace the patterns with a regular expression wildcard.
     // Note: in a perfect world, one would use "(.*)", but not in
     // JavaScript, "." does not match newlines.
-    String pattern = JS('String',
-                        r"#.replace('\\$arguments\\$', '((?:x|[^x])*)')"
-                        r".replace('\\$argumentsExpr\\$',  '((?:x|[^x])*)')"
-                        r".replace('\\$expr\\$',  '((?:x|[^x])*)')"
-                        r".replace('\\$method\\$',  '((?:x|[^x])*)')"
-                        r".replace('\\$receiver\\$',  '((?:x|[^x])*)')",
-                        message);
+    String pattern = JS(
+        'String',
+        r"#.replace(new RegExp('\\\\\\$arguments\\\\\\$', 'g'), "
+            r"'((?:x|[^x])*)')"
+        r".replace(new RegExp('\\\\\\$argumentsExpr\\\\\\$', 'g'),  "
+            r"'((?:x|[^x])*)')"
+        r".replace(new RegExp('\\\\\\$expr\\\\\\$', 'g'),  '((?:x|[^x])*)')"
+        r".replace(new RegExp('\\\\\\$method\\\\\\$', 'g'),  '((?:x|[^x])*)')"
+        r".replace(new RegExp('\\\\\\$receiver\\\\\\$', 'g'),  "
+            r"'((?:x|[^x])*)')",
+        message);
 
     return new TypeErrorDecoder(arguments,
                                 argumentsExpr,
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 8ca10c9..a8e71f6 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -191,7 +191,7 @@
     _resultOrListeners = source;
   }
 
-  Future then(f(T value), { Function onError }) {
+  Future/*<S>*/ then/*<S>*/(f(T value), { Function onError }) {
     Zone currentZone = Zone.current;
     if (!identical(currentZone, _ROOT_ZONE)) {
       f = currentZone.registerUnaryCallback(f);
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index b69c6fc..89565e1 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -532,7 +532,7 @@
    * If a broadcast stream is listened to more than once, each subscription
    * will individually call `convert` and expand the events.
    */
-  Stream/*<S>*/ expand(Iterable/*<S>*/ convert(T value)) {
+  Stream/*<S>*/ expand/*<S>*/(Iterable/*<S>*/ convert(T value)) {
     return new _ExpandStream<T, dynamic/*=S*/>(this, convert);
   }
 
@@ -566,7 +566,8 @@
    * The `streamTransformer` can decide whether it wants to return a
    * broadcast stream or not.
    */
-  Stream transform(StreamTransformer<T, dynamic> streamTransformer) {
+  Stream/*<S>*/ transform/*<S>*/(
+      StreamTransformer<T, dynamic/*=S*/ > streamTransformer) {
     return streamTransformer.bind(this);
   }
 
@@ -1696,7 +1697,7 @@
    */
   const factory StreamTransformer(
       StreamSubscription<T> transformer(Stream<S> stream, bool cancelOnError))
-      = _StreamSubscriptionTransformer;
+      = _StreamSubscriptionTransformer<S, T>;
 
   /**
    * Creates a [StreamTransformer] that delegates events to the given functions.
@@ -1713,7 +1714,7 @@
       void handleData(S data, EventSink<T> sink),
       void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
       void handleDone(EventSink<T> sink)})
-          = _StreamHandlerTransformer;
+          = _StreamHandlerTransformer<S, T>;
 
   /**
    * Transform the incoming [stream]'s events.
diff --git a/sdk/lib/collection/set.dart b/sdk/lib/collection/set.dart
index 309355c..4dd32cb 100644
--- a/sdk/lib/collection/set.dart
+++ b/sdk/lib/collection/set.dart
@@ -120,8 +120,8 @@
     return result;
   }
 
-  Iterable map(f(E element)) =>
-      new EfficientLengthMappedIterable<E, dynamic>(this, f);
+  Iterable/*<T>*/ map/*<T>*/(/*=T*/f(E element)) =>
+      new EfficientLengthMappedIterable<E, dynamic/*=T*/>(this, f);
 
   E get single {
     if (length > 1) throw IterableElementError.tooMany();
@@ -138,8 +138,8 @@
 
   Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
 
-  Iterable expand(Iterable f(E element)) =>
-      new ExpandIterable<E, dynamic>(this, f);
+  Iterable/*<T>*/ expand/*<T>*/(Iterable/*<T>*/ f(E element)) =>
+      new ExpandIterable<E, dynamic/*=T*/>(this, f);
 
   void forEach(void f(E element)) {
     for (E element in this) f(element);
@@ -157,8 +157,8 @@
     return value;
   }
 
-  dynamic fold(var initialValue,
-               dynamic combine(var previousValue, E element)) {
+  dynamic/*=T*/ fold/*<T>*/(var/*=T*/ initialValue,
+      dynamic/*=T*/ combine(var/*=T*/ previousValue, E element)) {
     var value = initialValue;
     for (E element in this) value = combine(value, element);
     return value;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 7b17154..50e16be 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -123,9 +123,6 @@
   throw new UnimplementedError();
 }
 
-/// Dartium functions that are a NOOP in dart2js.
-unwrap_jso(dartClass_instance) => dartClass_instance;
-wrap_jso(jsObject) => jsObject;
 createCustomUpgrader(Type customElementClass, $this) => $this;
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index bbb5d14..b54fc76 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -30,7 +30,6 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:indexed_db' show indexed_dbBlinkMap;
-import 'dart:indexed_db' show indexed_dbBlinkFunctionMap;
 import 'dart:isolate';
 import 'dart:js' as js;
 import "dart:convert";
@@ -40,16 +39,13 @@
 import 'dart:typed_data';
 import 'dart:web_gl' as gl;
 import 'dart:web_gl' show web_glBlinkMap;
-import 'dart:web_gl' show web_glBlinkFunctionMap;
 import 'dart:web_sql';
 import 'dart:svg' as svg;
 import 'dart:svg' show svgBlinkMap;
-import 'dart:svg' show svgBlinkFunctionMap;
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
 import 'dart:web_audio' show web_audioBlinkMap;
-import 'dart:web_audio' show web_audioBlinkFunctionMap;
 import 'dart:_blink' as _blink;
 import 'dart:developer';
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -90,7 +86,7 @@
   if (_window != null) {
     return _window;
   }
-  _window = wrap_jso(js.JsNative.getProperty(js.context, 'window'));
+  _window = js.JsNative.toTypedObject(js.context);
   return _window;
 }
 
@@ -129,460 +125,468 @@
   'JsObject': () => js.JsObject,
   'JsFunction': () => js.JsFunction,
   'JsArray': () => js.JsArray,
-  'AbstractWorker': () => AbstractWorker,
-  'Animation': () => Animation,
-  'AnimationEffectReadOnly': () => AnimationEffectReadOnly,
-  'AnimationEffectTiming': () => AnimationEffectTiming,
-  'AnimationEvent': () => AnimationEvent,
-  'AnimationPlayerEvent': () => AnimationPlayerEvent,
-  'AnimationTimeline': () => AnimationTimeline,
-  'AppBannerPromptResult': () => AppBannerPromptResult,
-  'ApplicationCache': () => ApplicationCache,
-  'ApplicationCacheErrorEvent': () => ApplicationCacheErrorEvent,
-  'Attr': () => _Attr,
-  'AudioTrack': () => AudioTrack,
-  'AudioTrackList': () => AudioTrackList,
-  'AutocompleteErrorEvent': () => AutocompleteErrorEvent,
-  'BarProp': () => BarProp,
-  'BatteryManager': () => BatteryManager,
-  'BeforeInstallPromptEvent': () => BeforeInstallPromptEvent,
-  'BeforeUnloadEvent': () => BeforeUnloadEvent,
-  'Blob': () => Blob,
-  'Bluetooth': () => Bluetooth,
-  'BluetoothDevice': () => BluetoothDevice,
-  'BluetoothGATTCharacteristic': () => BluetoothGattCharacteristic,
-  'BluetoothGATTRemoteServer': () => BluetoothGattRemoteServer,
-  'BluetoothGATTService': () => BluetoothGattService,
-  'BluetoothUUID': () => BluetoothUuid,
-  'Body': () => Body,
-  'CDATASection': () => CDataSection,
-  'CHROMIUMValuebuffer': () => ChromiumValuebuffer,
-  'CSS': () => Css,
-  'CSSCharsetRule': () => CssCharsetRule,
-  'CSSFontFaceRule': () => CssFontFaceRule,
-  'CSSGroupingRule': () => CssGroupingRule,
-  'CSSImportRule': () => CssImportRule,
-  'CSSKeyframeRule': () => CssKeyframeRule,
-  'CSSKeyframesRule': () => CssKeyframesRule,
-  'CSSMediaRule': () => CssMediaRule,
-  'CSSPageRule': () => CssPageRule,
-  'CSSRule': () => CssRule,
-  'CSSRuleList': () => _CssRuleList,
-  'CSSStyleDeclaration': () => CssStyleDeclaration,
-  'CSSStyleRule': () => CssStyleRule,
-  'CSSStyleSheet': () => CssStyleSheet,
-  'CSSSupportsRule': () => CssSupportsRule,
-  'CSSViewportRule': () => CssViewportRule,
-  'Cache': () => _Cache,
-  'CacheStorage': () => CacheStorage,
-  'CanvasGradient': () => CanvasGradient,
-  'CanvasPathMethods': () => _CanvasPathMethods,
-  'CanvasPattern': () => CanvasPattern,
-  'CanvasRenderingContext2D': () => CanvasRenderingContext2D,
-  'CharacterData': () => CharacterData,
-  'ChildNode': () => ChildNode,
-  'CircularGeofencingRegion': () => CircularGeofencingRegion,
-  'Client': () => Client,
-  'ClientRect': () => _ClientRect,
-  'ClientRectList': () => _ClientRectList,
-  'Clients': () => Clients,
-  'ClipboardEvent': () => ClipboardEvent,
-  'CloseEvent': () => CloseEvent,
-  'Comment': () => Comment,
-  'CompositionEvent': () => CompositionEvent,
-  'CompositorProxy': () => CompositorProxy,
-  'CompositorWorker': () => CompositorWorker,
-  'CompositorWorkerGlobalScope': () => CompositorWorkerGlobalScope,
-  'Console': () => Console,
-  'ConsoleBase': () => ConsoleBase,
-  'Coordinates': () => Coordinates,
-  'Credential': () => Credential,
-  'CredentialsContainer': () => CredentialsContainer,
-  'CrossOriginConnectEvent': () => CrossOriginConnectEvent,
-  'CrossOriginServiceWorkerClient': () => CrossOriginServiceWorkerClient,
-  'Crypto': () => Crypto,
-  'CryptoKey': () => CryptoKey,
-  'CustomEvent': () => CustomEvent,
-  'DOMError': () => DomError,
-  'DOMException': () => DomException,
-  'DOMFileSystem': () => FileSystem,
-  'DOMFileSystemSync': () => _DOMFileSystemSync,
-  'DOMImplementation': () => DomImplementation,
-  'DOMMatrix': () => DomMatrix,
-  'DOMMatrixReadOnly': () => DomMatrixReadOnly,
-  'DOMParser': () => DomParser,
-  'DOMPoint': () => DomPoint,
-  'DOMPointReadOnly': () => DomPointReadOnly,
-  'DOMRect': () => _DomRect,
-  'DOMRectReadOnly': () => DomRectReadOnly,
-  'DOMSettableTokenList': () => DomSettableTokenList,
-  'DOMStringList': () => DomStringList,
-  'DOMStringMap': () => DomStringMap,
-  'DOMTokenList': () => DomTokenList,
-  'DataTransfer': () => DataTransfer,
-  'DataTransferItem': () => DataTransferItem,
-  'DataTransferItemList': () => DataTransferItemList,
-  'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope,
-  'DefaultSessionStartEvent': () => DefaultSessionStartEvent,
-  'DeprecatedStorageInfo': () => DeprecatedStorageInfo,
-  'DeprecatedStorageQuota': () => DeprecatedStorageQuota,
-  'DeviceAcceleration': () => DeviceAcceleration,
-  'DeviceLightEvent': () => DeviceLightEvent,
-  'DeviceMotionEvent': () => DeviceMotionEvent,
-  'DeviceOrientationEvent': () => DeviceOrientationEvent,
-  'DeviceRotationRate': () => DeviceRotationRate,
-  'DirectoryEntry': () => DirectoryEntry,
-  'DirectoryEntrySync': () => _DirectoryEntrySync,
-  'DirectoryReader': () => DirectoryReader,
-  'DirectoryReaderSync': () => _DirectoryReaderSync,
-  'Document': () => Document,
-  'DocumentFragment': () => DocumentFragment,
-  'DocumentType': () => _DocumentType,
-  'EffectModel': () => EffectModel,
-  'Element': () => Element,
-  'Entry': () => Entry,
-  'EntrySync': () => _EntrySync,
-  'ErrorEvent': () => ErrorEvent,
-  'Event': () => Event,
-  'EventSource': () => EventSource,
-  'EventTarget': () => EventTarget,
-  'ExtendableEvent': () => ExtendableEvent,
-  'FederatedCredential': () => FederatedCredential,
-  'FetchEvent': () => FetchEvent,
-  'File': () => File,
-  'FileEntry': () => FileEntry,
-  'FileEntrySync': () => _FileEntrySync,
-  'FileError': () => FileError,
-  'FileList': () => FileList,
-  'FileReader': () => FileReader,
-  'FileReaderSync': () => _FileReaderSync,
-  'FileWriter': () => FileWriter,
-  'FileWriterSync': () => _FileWriterSync,
-  'FocusEvent': () => FocusEvent,
-  'FontFace': () => FontFace,
-  'FontFaceSet': () => FontFaceSet,
-  'FontFaceSetLoadEvent': () => FontFaceSetLoadEvent,
-  'FormData': () => FormData,
-  'Gamepad': () => Gamepad,
-  'GamepadButton': () => GamepadButton,
-  'GamepadEvent': () => GamepadEvent,
-  'GamepadList': () => _GamepadList,
-  'Geofencing': () => Geofencing,
-  'GeofencingEvent': () => GeofencingEvent,
-  'GeofencingRegion': () => GeofencingRegion,
-  'Geolocation': () => Geolocation,
-  'Geoposition': () => Geoposition,
-  'GlobalEventHandlers': () => GlobalEventHandlers,
-  'HMDVRDevice': () => HmdvrDevice,
-  'HTMLAllCollection': () => _HTMLAllCollection,
-  'HTMLAnchorElement': () => AnchorElement,
-  'HTMLAppletElement': () => _HTMLAppletElement,
-  'HTMLAreaElement': () => AreaElement,
-  'HTMLAudioElement': () => AudioElement,
-  'HTMLBRElement': () => BRElement,
-  'HTMLBaseElement': () => BaseElement,
-  'HTMLBodyElement': () => BodyElement,
-  'HTMLButtonElement': () => ButtonElement,
-  'HTMLCanvasElement': () => CanvasElement,
-  'HTMLCollection': () => HtmlCollection,
-  'HTMLContentElement': () => ContentElement,
-  'HTMLDListElement': () => DListElement,
-  'HTMLDataListElement': () => DataListElement,
-  'HTMLDetailsElement': () => DetailsElement,
-  'HTMLDialogElement': () => DialogElement,
-  'HTMLDirectoryElement': () => _HTMLDirectoryElement,
-  'HTMLDivElement': () => DivElement,
-  'HTMLDocument': () => HtmlDocument,
-  'HTMLElement': () => HtmlElement,
-  'HTMLEmbedElement': () => EmbedElement,
-  'HTMLFieldSetElement': () => FieldSetElement,
-  'HTMLFontElement': () => _HTMLFontElement,
-  'HTMLFormControlsCollection': () => HtmlFormControlsCollection,
-  'HTMLFormElement': () => FormElement,
-  'HTMLFrameElement': () => _HTMLFrameElement,
-  'HTMLFrameSetElement': () => _HTMLFrameSetElement,
-  'HTMLHRElement': () => HRElement,
-  'HTMLHeadElement': () => HeadElement,
-  'HTMLHeadingElement': () => HeadingElement,
-  'HTMLHtmlElement': () => HtmlHtmlElement,
-  'HTMLIFrameElement': () => IFrameElement,
-  'HTMLImageElement': () => ImageElement,
-  'HTMLInputElement': () => InputElement,
-  'HTMLKeygenElement': () => KeygenElement,
-  'HTMLLIElement': () => LIElement,
-  'HTMLLabelElement': () => LabelElement,
-  'HTMLLegendElement': () => LegendElement,
-  'HTMLLinkElement': () => LinkElement,
-  'HTMLMapElement': () => MapElement,
-  'HTMLMarqueeElement': () => _HTMLMarqueeElement,
-  'HTMLMediaElement': () => MediaElement,
-  'HTMLMenuElement': () => MenuElement,
-  'HTMLMenuItemElement': () => MenuItemElement,
-  'HTMLMetaElement': () => MetaElement,
-  'HTMLMeterElement': () => MeterElement,
-  'HTMLModElement': () => ModElement,
-  'HTMLOListElement': () => OListElement,
-  'HTMLObjectElement': () => ObjectElement,
-  'HTMLOptGroupElement': () => OptGroupElement,
-  'HTMLOptionElement': () => OptionElement,
-  'HTMLOptionsCollection': () => HtmlOptionsCollection,
-  'HTMLOutputElement': () => OutputElement,
-  'HTMLParagraphElement': () => ParagraphElement,
-  'HTMLParamElement': () => ParamElement,
-  'HTMLPictureElement': () => PictureElement,
-  'HTMLPreElement': () => PreElement,
-  'HTMLProgressElement': () => ProgressElement,
-  'HTMLQuoteElement': () => QuoteElement,
-  'HTMLScriptElement': () => ScriptElement,
-  'HTMLSelectElement': () => SelectElement,
-  'HTMLShadowElement': () => ShadowElement,
-  'HTMLSourceElement': () => SourceElement,
-  'HTMLSpanElement': () => SpanElement,
-  'HTMLStyleElement': () => StyleElement,
-  'HTMLTableCaptionElement': () => TableCaptionElement,
-  'HTMLTableCellElement': () => TableCellElement,
-  'HTMLTableColElement': () => TableColElement,
-  'HTMLTableElement': () => TableElement,
-  'HTMLTableRowElement': () => TableRowElement,
-  'HTMLTableSectionElement': () => TableSectionElement,
-  'HTMLTemplateElement': () => TemplateElement,
-  'HTMLTextAreaElement': () => TextAreaElement,
-  'HTMLTitleElement': () => TitleElement,
-  'HTMLTrackElement': () => TrackElement,
-  'HTMLUListElement': () => UListElement,
-  'HTMLUnknownElement': () => UnknownElement,
-  'HTMLVideoElement': () => VideoElement,
-  'HashChangeEvent': () => HashChangeEvent,
-  'Headers': () => Headers,
-  'History': () => History,
-  'ImageBitmap': () => ImageBitmap,
-  'ImageData': () => ImageData,
-  'InjectedScriptHost': () => InjectedScriptHost,
-  'InputDevice': () => InputDevice,
-  'Iterator': () => DomIterator,
-  'KeyboardEvent': () => KeyboardEvent,
-  'KeyframeEffect': () => KeyframeEffect,
-  'Location': () => Location,
-  'MIDIAccess': () => MidiAccess,
-  'MIDIConnectionEvent': () => MidiConnectionEvent,
-  'MIDIInput': () => MidiInput,
-  'MIDIInputMap': () => MidiInputMap,
-  'MIDIMessageEvent': () => MidiMessageEvent,
-  'MIDIOutput': () => MidiOutput,
-  'MIDIOutputMap': () => MidiOutputMap,
-  'MIDIPort': () => MidiPort,
-  'MediaController': () => MediaController,
-  'MediaDeviceInfo': () => MediaDeviceInfo,
-  'MediaDevices': () => MediaDevices,
-  'MediaEncryptedEvent': () => MediaEncryptedEvent,
-  'MediaError': () => MediaError,
-  'MediaKeyError': () => MediaKeyError,
-  'MediaKeyEvent': () => MediaKeyEvent,
-  'MediaKeyMessageEvent': () => MediaKeyMessageEvent,
-  'MediaKeySession': () => MediaKeySession,
-  'MediaKeyStatusMap': () => MediaKeyStatusMap,
-  'MediaKeySystemAccess': () => MediaKeySystemAccess,
-  'MediaKeys': () => MediaKeys,
-  'MediaList': () => MediaList,
-  'MediaQueryList': () => MediaQueryList,
-  'MediaQueryListEvent': () => MediaQueryListEvent,
-  'MediaSession': () => MediaSession,
-  'MediaSource': () => MediaSource,
-  'MediaStream': () => MediaStream,
-  'MediaStreamEvent': () => MediaStreamEvent,
-  'MediaStreamTrack': () => MediaStreamTrack,
-  'MediaStreamTrackEvent': () => MediaStreamTrackEvent,
-  'MemoryInfo': () => MemoryInfo,
-  'MessageChannel': () => MessageChannel,
-  'MessageEvent': () => MessageEvent,
-  'MessagePort': () => MessagePort,
-  'Metadata': () => Metadata,
-  'MimeType': () => MimeType,
-  'MimeTypeArray': () => MimeTypeArray,
-  'MouseEvent': () => MouseEvent,
-  'MutationEvent': () => _MutationEvent,
-  'MutationObserver': () => MutationObserver,
-  'MutationRecord': () => MutationRecord,
-  'NamedNodeMap': () => _NamedNodeMap,
-  'Navigator': () => Navigator,
-  'NavigatorCPU': () => NavigatorCpu,
-  'NavigatorID': () => NavigatorID,
-  'NavigatorLanguage': () => NavigatorLanguage,
-  'NavigatorOnLine': () => NavigatorOnLine,
-  'NavigatorStorageUtils': () => NavigatorStorageUtils,
-  'NavigatorUserMediaError': () => NavigatorUserMediaError,
-  'NetworkInformation': () => NetworkInformation,
-  'Node': () => Node,
-  'NodeFilter': () => NodeFilter,
-  'NodeIterator': () => NodeIterator,
-  'NodeList': () => NodeList,
-  'NonDocumentTypeChildNode': () => NonDocumentTypeChildNode,
-  'NonElementParentNode': () => NonElementParentNode,
-  'Notification': () => Notification,
-  'NotificationEvent': () => NotificationEvent,
-  'PagePopupController': () => _PagePopupController,
-  'PageTransitionEvent': () => PageTransitionEvent,
-  'ParentNode': () => ParentNode,
-  'PasswordCredential': () => PasswordCredential,
-  'Path2D': () => Path2D,
-  'Performance': () => Performance,
-  'PerformanceCompositeTiming': () => PerformanceCompositeTiming,
-  'PerformanceEntry': () => PerformanceEntry,
-  'PerformanceMark': () => PerformanceMark,
-  'PerformanceMeasure': () => PerformanceMeasure,
-  'PerformanceNavigation': () => PerformanceNavigation,
-  'PerformanceRenderTiming': () => PerformanceRenderTiming,
-  'PerformanceResourceTiming': () => PerformanceResourceTiming,
-  'PerformanceTiming': () => PerformanceTiming,
-  'PeriodicSyncEvent': () => PeriodicSyncEvent,
-  'PeriodicSyncManager': () => PeriodicSyncManager,
-  'PeriodicSyncRegistration': () => PeriodicSyncRegistration,
-  'PermissionStatus': () => PermissionStatus,
-  'Permissions': () => Permissions,
-  'Plugin': () => Plugin,
-  'PluginArray': () => PluginArray,
-  'PluginPlaceholderElement': () => PluginPlaceholderElement,
-  'PointerEvent': () => PointerEvent,
-  'PopStateEvent': () => PopStateEvent,
-  'PositionError': () => PositionError,
-  'PositionSensorVRDevice': () => PositionSensorVRDevice,
-  'Presentation': () => Presentation,
-  'PresentationAvailability': () => PresentationAvailability,
-  'PresentationSession': () => PresentationSession,
-  'ProcessingInstruction': () => ProcessingInstruction,
-  'ProgressEvent': () => ProgressEvent,
-  'PromiseRejectionEvent': () => PromiseRejectionEvent,
-  'PushEvent': () => PushEvent,
-  'PushManager': () => PushManager,
-  'PushMessageData': () => PushMessageData,
-  'PushSubscription': () => PushSubscription,
-  'RTCDTMFSender': () => RtcDtmfSender,
-  'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent,
-  'RTCDataChannel': () => RtcDataChannel,
-  'RTCDataChannelEvent': () => RtcDataChannelEvent,
-  'RTCIceCandidate': () => RtcIceCandidate,
-  'RTCIceCandidateEvent': () => RtcIceCandidateEvent,
-  'RTCPeerConnection': () => RtcPeerConnection,
-  'RTCSessionDescription': () => RtcSessionDescription,
-  'RTCStatsReport': () => RtcStatsReport,
-  'RTCStatsResponse': () => RtcStatsResponse,
-  'RadioNodeList': () => _RadioNodeList,
-  'Range': () => Range,
-  'ReadableByteStream': () => ReadableByteStream,
-  'ReadableByteStreamReader': () => ReadableByteStreamReader,
-  'ReadableStream': () => ReadableStream,
-  'ReadableStreamReader': () => ReadableStreamReader,
-  'RelatedEvent': () => RelatedEvent,
-  'Request': () => _Request,
-  'ResourceProgressEvent': () => ResourceProgressEvent,
-  'Response': () => _Response,
-  'Screen': () => Screen,
-  'ScreenOrientation': () => ScreenOrientation,
-  'ScrollState': () => ScrollState,
-  'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent,
-  'Selection': () => Selection,
-  'ServicePort': () => ServicePort,
-  'ServicePortCollection': () => ServicePortCollection,
-  'ServicePortConnectEvent': () => ServicePortConnectEvent,
-  'ServiceWorker': () => _ServiceWorker,
-  'ServiceWorkerContainer': () => ServiceWorkerContainer,
-  'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope,
-  'ServiceWorkerMessageEvent': () => ServiceWorkerMessageEvent,
-  'ServiceWorkerRegistration': () => ServiceWorkerRegistration,
-  'ShadowRoot': () => ShadowRoot,
-  'SharedArrayBuffer': () => SharedArrayBuffer,
-  'SharedWorker': () => SharedWorker,
-  'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope,
-  'SourceBuffer': () => SourceBuffer,
-  'SourceBufferList': () => SourceBufferList,
-  'SourceInfo': () => SourceInfo,
-  'SpeechGrammar': () => SpeechGrammar,
-  'SpeechGrammarList': () => SpeechGrammarList,
-  'SpeechRecognition': () => SpeechRecognition,
-  'SpeechRecognitionAlternative': () => SpeechRecognitionAlternative,
-  'SpeechRecognitionError': () => SpeechRecognitionError,
-  'SpeechRecognitionEvent': () => SpeechRecognitionEvent,
-  'SpeechRecognitionResult': () => SpeechRecognitionResult,
-  'SpeechRecognitionResultList': () => _SpeechRecognitionResultList,
-  'SpeechSynthesis': () => SpeechSynthesis,
-  'SpeechSynthesisEvent': () => SpeechSynthesisEvent,
-  'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance,
-  'SpeechSynthesisVoice': () => SpeechSynthesisVoice,
-  'StashedMessagePort': () => StashedMessagePort,
-  'StashedPortCollection': () => StashedPortCollection,
-  'Storage': () => Storage,
-  'StorageEvent': () => StorageEvent,
-  'StorageInfo': () => StorageInfo,
-  'StorageQuota': () => StorageQuota,
-  'Stream': () => FileStream,
-  'StyleMedia': () => StyleMedia,
-  'StyleSheet': () => StyleSheet,
-  'StyleSheetList': () => _StyleSheetList,
-  'SubtleCrypto': () => _SubtleCrypto,
-  'SyncEvent': () => SyncEvent,
-  'SyncManager': () => SyncManager,
-  'SyncRegistration': () => SyncRegistration,
-  'Text': () => Text,
-  'TextEvent': () => TextEvent,
-  'TextMetrics': () => TextMetrics,
-  'TextTrack': () => TextTrack,
-  'TextTrackCue': () => TextTrackCue,
-  'TextTrackCueList': () => TextTrackCueList,
-  'TextTrackList': () => TextTrackList,
-  'TimeRanges': () => TimeRanges,
-  'Touch': () => Touch,
-  'TouchEvent': () => TouchEvent,
-  'TouchList': () => TouchList,
-  'TrackDefault': () => TrackDefault,
-  'TrackDefaultList': () => TrackDefaultList,
-  'TrackEvent': () => TrackEvent,
-  'TransitionEvent': () => TransitionEvent,
-  'TreeWalker': () => TreeWalker,
-  'UIEvent': () => UIEvent,
-  'URL': () => Url,
-  'URLUtils': () => UrlUtils,
-  'URLUtilsReadOnly': () => UrlUtilsReadOnly,
-  'VRDevice': () => VRDevice,
-  'VREyeParameters': () => VREyeParameters,
-  'VRFieldOfView': () => VRFieldOfView,
-  'VRPositionState': () => VRPositionState,
-  'VTTCue': () => VttCue,
-  'VTTRegion': () => VttRegion,
-  'VTTRegionList': () => VttRegionList,
-  'ValidityState': () => ValidityState,
-  'VideoPlaybackQuality': () => VideoPlaybackQuality,
-  'VideoTrack': () => VideoTrack,
-  'VideoTrackList': () => VideoTrackList,
-  'WebKitCSSMatrix': () => _WebKitCSSMatrix,
-  'WebSocket': () => WebSocket,
-  'WheelEvent': () => WheelEvent,
-  'Window': () => Window,
-  'WindowBase64': () => WindowBase64,
-  'WindowClient': () => WindowClient,
-  'WindowEventHandlers': () => WindowEventHandlers,
-  'WindowTimers': () => _WindowTimers,
-  'Worker': () => Worker,
-  'WorkerConsole': () => WorkerConsole,
-  'WorkerGlobalScope': () => WorkerGlobalScope,
-  'WorkerLocation': () => _WorkerLocation,
-  'WorkerNavigator': () => _WorkerNavigator,
-  'WorkerPerformance': () => WorkerPerformance,
-  'XMLDocument': () => XmlDocument,
-  'XMLHttpRequest': () => HttpRequest,
-  'XMLHttpRequestEventTarget': () => HttpRequestEventTarget,
-  'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent,
-  'XMLHttpRequestUpload': () => HttpRequestUpload,
-  'XMLSerializer': () => XmlSerializer,
-  'XPathEvaluator': () => XPathEvaluator,
-  'XPathExpression': () => XPathExpression,
-  'XPathNSResolver': () => XPathNSResolver,
-  'XPathResult': () => XPathResult,
-  'XSLTProcessor': () => XsltProcessor,
+  // We have to call .instanceRuntimeType as these classes have a private
+  // implementation class defined dynamically at runtime via a patch file.
+  'JSObject': () => js.JSObject.instanceRuntimeType,
+  'JSFunction': () => js.JSFunction.instanceRuntimeType,
+  'JSArray': () => js.JSArray.instanceRuntimeType,
+  'AbstractWorker': () => AbstractWorker.instanceRuntimeType,
+  'Animation': () => Animation.instanceRuntimeType,
+  'AnimationEffectReadOnly': () => AnimationEffectReadOnly.instanceRuntimeType,
+  'AnimationEffectTiming': () => AnimationEffectTiming.instanceRuntimeType,
+  'AnimationEvent': () => AnimationEvent.instanceRuntimeType,
+  'AnimationPlayerEvent': () => AnimationPlayerEvent.instanceRuntimeType,
+  'AnimationTimeline': () => AnimationTimeline.instanceRuntimeType,
+  'AppBannerPromptResult': () => AppBannerPromptResult.instanceRuntimeType,
+  'ApplicationCache': () => ApplicationCache.instanceRuntimeType,
+  'ApplicationCacheErrorEvent': () => ApplicationCacheErrorEvent.instanceRuntimeType,
+  'Attr': () => _Attr.instanceRuntimeType,
+  'AudioTrack': () => AudioTrack.instanceRuntimeType,
+  'AudioTrackList': () => AudioTrackList.instanceRuntimeType,
+  'AutocompleteErrorEvent': () => AutocompleteErrorEvent.instanceRuntimeType,
+  'BarProp': () => BarProp.instanceRuntimeType,
+  'BatteryManager': () => BatteryManager.instanceRuntimeType,
+  'BeforeInstallPromptEvent': () => BeforeInstallPromptEvent.instanceRuntimeType,
+  'BeforeUnloadEvent': () => BeforeUnloadEvent.instanceRuntimeType,
+  'Blob': () => Blob.instanceRuntimeType,
+  'Bluetooth': () => Bluetooth.instanceRuntimeType,
+  'BluetoothDevice': () => BluetoothDevice.instanceRuntimeType,
+  'BluetoothGATTCharacteristic': () => BluetoothGattCharacteristic.instanceRuntimeType,
+  'BluetoothGATTRemoteServer': () => BluetoothGattRemoteServer.instanceRuntimeType,
+  'BluetoothGATTService': () => BluetoothGattService.instanceRuntimeType,
+  'BluetoothUUID': () => BluetoothUuid.instanceRuntimeType,
+  'Body': () => Body.instanceRuntimeType,
+  'CDATASection': () => CDataSection.instanceRuntimeType,
+  'CHROMIUMValuebuffer': () => ChromiumValuebuffer.instanceRuntimeType,
+  'CSS': () => Css.instanceRuntimeType,
+  'CSSCharsetRule': () => CssCharsetRule.instanceRuntimeType,
+  'CSSFontFaceRule': () => CssFontFaceRule.instanceRuntimeType,
+  'CSSGroupingRule': () => CssGroupingRule.instanceRuntimeType,
+  'CSSImportRule': () => CssImportRule.instanceRuntimeType,
+  'CSSKeyframeRule': () => CssKeyframeRule.instanceRuntimeType,
+  'CSSKeyframesRule': () => CssKeyframesRule.instanceRuntimeType,
+  'CSSMediaRule': () => CssMediaRule.instanceRuntimeType,
+  'CSSPageRule': () => CssPageRule.instanceRuntimeType,
+  'CSSRule': () => CssRule.instanceRuntimeType,
+  'CSSRuleList': () => _CssRuleList.instanceRuntimeType,
+  'CSSStyleDeclaration': () => CssStyleDeclaration.instanceRuntimeType,
+  'CSSStyleRule': () => CssStyleRule.instanceRuntimeType,
+  'CSSStyleSheet': () => CssStyleSheet.instanceRuntimeType,
+  'CSSSupportsRule': () => CssSupportsRule.instanceRuntimeType,
+  'CSSViewportRule': () => CssViewportRule.instanceRuntimeType,
+  'Cache': () => _Cache.instanceRuntimeType,
+  'CacheStorage': () => CacheStorage.instanceRuntimeType,
+  'CanvasGradient': () => CanvasGradient.instanceRuntimeType,
+  'CanvasPathMethods': () => _CanvasPathMethods.instanceRuntimeType,
+  'CanvasPattern': () => CanvasPattern.instanceRuntimeType,
+  'CanvasRenderingContext2D': () => CanvasRenderingContext2D.instanceRuntimeType,
+  'CharacterData': () => CharacterData.instanceRuntimeType,
+  'ChildNode': () => ChildNode.instanceRuntimeType,
+  'CircularGeofencingRegion': () => CircularGeofencingRegion.instanceRuntimeType,
+  'Client': () => Client.instanceRuntimeType,
+  'ClientRect': () => _ClientRect.instanceRuntimeType,
+  'ClientRectList': () => _ClientRectList.instanceRuntimeType,
+  'Clients': () => Clients.instanceRuntimeType,
+  'ClipboardEvent': () => ClipboardEvent.instanceRuntimeType,
+  'CloseEvent': () => CloseEvent.instanceRuntimeType,
+  'Comment': () => Comment.instanceRuntimeType,
+  'CompositionEvent': () => CompositionEvent.instanceRuntimeType,
+  'CompositorProxy': () => CompositorProxy.instanceRuntimeType,
+  'CompositorWorker': () => CompositorWorker.instanceRuntimeType,
+  'CompositorWorkerGlobalScope': () => CompositorWorkerGlobalScope.instanceRuntimeType,
+  'Console': () => Console.instanceRuntimeType,
+  'ConsoleBase': () => ConsoleBase.instanceRuntimeType,
+  'Coordinates': () => Coordinates.instanceRuntimeType,
+  'Credential': () => Credential.instanceRuntimeType,
+  'CredentialsContainer': () => CredentialsContainer.instanceRuntimeType,
+  'CrossOriginConnectEvent': () => CrossOriginConnectEvent.instanceRuntimeType,
+  'CrossOriginServiceWorkerClient': () => CrossOriginServiceWorkerClient.instanceRuntimeType,
+  'Crypto': () => Crypto.instanceRuntimeType,
+  'CryptoKey': () => CryptoKey.instanceRuntimeType,
+  'CustomEvent': () => CustomEvent.instanceRuntimeType,
+  'DOMError': () => DomError.instanceRuntimeType,
+  'DOMException': () => DomException.instanceRuntimeType,
+  'DOMFileSystem': () => FileSystem.instanceRuntimeType,
+  'DOMFileSystemSync': () => _DOMFileSystemSync.instanceRuntimeType,
+  'DOMImplementation': () => DomImplementation.instanceRuntimeType,
+  'DOMMatrix': () => DomMatrix.instanceRuntimeType,
+  'DOMMatrixReadOnly': () => DomMatrixReadOnly.instanceRuntimeType,
+  'DOMParser': () => DomParser.instanceRuntimeType,
+  'DOMPoint': () => DomPoint.instanceRuntimeType,
+  'DOMPointReadOnly': () => DomPointReadOnly.instanceRuntimeType,
+  'DOMRect': () => _DomRect.instanceRuntimeType,
+  'DOMRectReadOnly': () => DomRectReadOnly.instanceRuntimeType,
+  'DOMSettableTokenList': () => DomSettableTokenList.instanceRuntimeType,
+  'DOMStringList': () => DomStringList.instanceRuntimeType,
+  'DOMStringMap': () => DomStringMap.instanceRuntimeType,
+  'DOMTokenList': () => DomTokenList.instanceRuntimeType,
+  'DataTransfer': () => DataTransfer.instanceRuntimeType,
+  'DataTransferItem': () => DataTransferItem.instanceRuntimeType,
+  'DataTransferItemList': () => DataTransferItemList.instanceRuntimeType,
+  'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope.instanceRuntimeType,
+  'DefaultSessionStartEvent': () => DefaultSessionStartEvent.instanceRuntimeType,
+  'DeprecatedStorageInfo': () => DeprecatedStorageInfo.instanceRuntimeType,
+  'DeprecatedStorageQuota': () => DeprecatedStorageQuota.instanceRuntimeType,
+  'DeviceAcceleration': () => DeviceAcceleration.instanceRuntimeType,
+  'DeviceLightEvent': () => DeviceLightEvent.instanceRuntimeType,
+  'DeviceMotionEvent': () => DeviceMotionEvent.instanceRuntimeType,
+  'DeviceOrientationEvent': () => DeviceOrientationEvent.instanceRuntimeType,
+  'DeviceRotationRate': () => DeviceRotationRate.instanceRuntimeType,
+  'DirectoryEntry': () => DirectoryEntry.instanceRuntimeType,
+  'DirectoryEntrySync': () => _DirectoryEntrySync.instanceRuntimeType,
+  'DirectoryReader': () => DirectoryReader.instanceRuntimeType,
+  'DirectoryReaderSync': () => _DirectoryReaderSync.instanceRuntimeType,
+  'Document': () => Document.instanceRuntimeType,
+  'DocumentFragment': () => DocumentFragment.instanceRuntimeType,
+  'DocumentType': () => _DocumentType.instanceRuntimeType,
+  'EffectModel': () => EffectModel.instanceRuntimeType,
+  'Element': () => Element.instanceRuntimeType,
+  'Entry': () => Entry.instanceRuntimeType,
+  'EntrySync': () => _EntrySync.instanceRuntimeType,
+  'ErrorEvent': () => ErrorEvent.instanceRuntimeType,
+  'Event': () => Event.instanceRuntimeType,
+  'EventSource': () => EventSource.instanceRuntimeType,
+  'EventTarget': () => EventTarget.instanceRuntimeType,
+  'ExtendableEvent': () => ExtendableEvent.instanceRuntimeType,
+  'FederatedCredential': () => FederatedCredential.instanceRuntimeType,
+  'FetchEvent': () => FetchEvent.instanceRuntimeType,
+  'File': () => File.instanceRuntimeType,
+  'FileEntry': () => FileEntry.instanceRuntimeType,
+  'FileEntrySync': () => _FileEntrySync.instanceRuntimeType,
+  'FileError': () => FileError.instanceRuntimeType,
+  'FileList': () => FileList.instanceRuntimeType,
+  'FileReader': () => FileReader.instanceRuntimeType,
+  'FileReaderSync': () => _FileReaderSync.instanceRuntimeType,
+  'FileWriter': () => FileWriter.instanceRuntimeType,
+  'FileWriterSync': () => _FileWriterSync.instanceRuntimeType,
+  'FocusEvent': () => FocusEvent.instanceRuntimeType,
+  'FontFace': () => FontFace.instanceRuntimeType,
+  'FontFaceSet': () => FontFaceSet.instanceRuntimeType,
+  'FontFaceSetLoadEvent': () => FontFaceSetLoadEvent.instanceRuntimeType,
+  'FormData': () => FormData.instanceRuntimeType,
+  'Gamepad': () => Gamepad.instanceRuntimeType,
+  'GamepadButton': () => GamepadButton.instanceRuntimeType,
+  'GamepadEvent': () => GamepadEvent.instanceRuntimeType,
+  'GamepadList': () => _GamepadList.instanceRuntimeType,
+  'Geofencing': () => Geofencing.instanceRuntimeType,
+  'GeofencingEvent': () => GeofencingEvent.instanceRuntimeType,
+  'GeofencingRegion': () => GeofencingRegion.instanceRuntimeType,
+  'Geolocation': () => Geolocation.instanceRuntimeType,
+  'Geoposition': () => Geoposition.instanceRuntimeType,
+  'GlobalEventHandlers': () => GlobalEventHandlers.instanceRuntimeType,
+  'HMDVRDevice': () => HmdvrDevice.instanceRuntimeType,
+  'HTMLAllCollection': () => _HTMLAllCollection.instanceRuntimeType,
+  'HTMLAnchorElement': () => AnchorElement.instanceRuntimeType,
+  'HTMLAppletElement': () => _HTMLAppletElement.instanceRuntimeType,
+  'HTMLAreaElement': () => AreaElement.instanceRuntimeType,
+  'HTMLAudioElement': () => AudioElement.instanceRuntimeType,
+  'HTMLBRElement': () => BRElement.instanceRuntimeType,
+  'HTMLBaseElement': () => BaseElement.instanceRuntimeType,
+  'HTMLBodyElement': () => BodyElement.instanceRuntimeType,
+  'HTMLButtonElement': () => ButtonElement.instanceRuntimeType,
+  'HTMLCanvasElement': () => CanvasElement.instanceRuntimeType,
+  'HTMLCollection': () => HtmlCollection.instanceRuntimeType,
+  'HTMLContentElement': () => ContentElement.instanceRuntimeType,
+  'HTMLDListElement': () => DListElement.instanceRuntimeType,
+  'HTMLDataListElement': () => DataListElement.instanceRuntimeType,
+  'HTMLDetailsElement': () => DetailsElement.instanceRuntimeType,
+  'HTMLDialogElement': () => DialogElement.instanceRuntimeType,
+  'HTMLDirectoryElement': () => _HTMLDirectoryElement.instanceRuntimeType,
+  'HTMLDivElement': () => DivElement.instanceRuntimeType,
+  'HTMLDocument': () => HtmlDocument.instanceRuntimeType,
+  'HTMLElement': () => HtmlElement.instanceRuntimeType,
+  'HTMLEmbedElement': () => EmbedElement.instanceRuntimeType,
+  'HTMLFieldSetElement': () => FieldSetElement.instanceRuntimeType,
+  'HTMLFontElement': () => _HTMLFontElement.instanceRuntimeType,
+  'HTMLFormControlsCollection': () => HtmlFormControlsCollection.instanceRuntimeType,
+  'HTMLFormElement': () => FormElement.instanceRuntimeType,
+  'HTMLFrameElement': () => _HTMLFrameElement.instanceRuntimeType,
+  'HTMLFrameSetElement': () => _HTMLFrameSetElement.instanceRuntimeType,
+  'HTMLHRElement': () => HRElement.instanceRuntimeType,
+  'HTMLHeadElement': () => HeadElement.instanceRuntimeType,
+  'HTMLHeadingElement': () => HeadingElement.instanceRuntimeType,
+  'HTMLHtmlElement': () => HtmlHtmlElement.instanceRuntimeType,
+  'HTMLIFrameElement': () => IFrameElement.instanceRuntimeType,
+  'HTMLImageElement': () => ImageElement.instanceRuntimeType,
+  'HTMLInputElement': () => InputElement.instanceRuntimeType,
+  'HTMLKeygenElement': () => KeygenElement.instanceRuntimeType,
+  'HTMLLIElement': () => LIElement.instanceRuntimeType,
+  'HTMLLabelElement': () => LabelElement.instanceRuntimeType,
+  'HTMLLegendElement': () => LegendElement.instanceRuntimeType,
+  'HTMLLinkElement': () => LinkElement.instanceRuntimeType,
+  'HTMLMapElement': () => MapElement.instanceRuntimeType,
+  'HTMLMarqueeElement': () => _HTMLMarqueeElement.instanceRuntimeType,
+  'HTMLMediaElement': () => MediaElement.instanceRuntimeType,
+  'HTMLMenuElement': () => MenuElement.instanceRuntimeType,
+  'HTMLMenuItemElement': () => MenuItemElement.instanceRuntimeType,
+  'HTMLMetaElement': () => MetaElement.instanceRuntimeType,
+  'HTMLMeterElement': () => MeterElement.instanceRuntimeType,
+  'HTMLModElement': () => ModElement.instanceRuntimeType,
+  'HTMLOListElement': () => OListElement.instanceRuntimeType,
+  'HTMLObjectElement': () => ObjectElement.instanceRuntimeType,
+  'HTMLOptGroupElement': () => OptGroupElement.instanceRuntimeType,
+  'HTMLOptionElement': () => OptionElement.instanceRuntimeType,
+  'HTMLOptionsCollection': () => HtmlOptionsCollection.instanceRuntimeType,
+  'HTMLOutputElement': () => OutputElement.instanceRuntimeType,
+  'HTMLParagraphElement': () => ParagraphElement.instanceRuntimeType,
+  'HTMLParamElement': () => ParamElement.instanceRuntimeType,
+  'HTMLPictureElement': () => PictureElement.instanceRuntimeType,
+  'HTMLPreElement': () => PreElement.instanceRuntimeType,
+  'HTMLProgressElement': () => ProgressElement.instanceRuntimeType,
+  'HTMLQuoteElement': () => QuoteElement.instanceRuntimeType,
+  'HTMLScriptElement': () => ScriptElement.instanceRuntimeType,
+  'HTMLSelectElement': () => SelectElement.instanceRuntimeType,
+  'HTMLShadowElement': () => ShadowElement.instanceRuntimeType,
+  'HTMLSourceElement': () => SourceElement.instanceRuntimeType,
+  'HTMLSpanElement': () => SpanElement.instanceRuntimeType,
+  'HTMLStyleElement': () => StyleElement.instanceRuntimeType,
+  'HTMLTableCaptionElement': () => TableCaptionElement.instanceRuntimeType,
+  'HTMLTableCellElement': () => TableCellElement.instanceRuntimeType,
+  'HTMLTableColElement': () => TableColElement.instanceRuntimeType,
+  'HTMLTableElement': () => TableElement.instanceRuntimeType,
+  'HTMLTableRowElement': () => TableRowElement.instanceRuntimeType,
+  'HTMLTableSectionElement': () => TableSectionElement.instanceRuntimeType,
+  'HTMLTemplateElement': () => TemplateElement.instanceRuntimeType,
+  'HTMLTextAreaElement': () => TextAreaElement.instanceRuntimeType,
+  'HTMLTitleElement': () => TitleElement.instanceRuntimeType,
+  'HTMLTrackElement': () => TrackElement.instanceRuntimeType,
+  'HTMLUListElement': () => UListElement.instanceRuntimeType,
+  'HTMLUnknownElement': () => UnknownElement.instanceRuntimeType,
+  'HTMLVideoElement': () => VideoElement.instanceRuntimeType,
+  'HashChangeEvent': () => HashChangeEvent.instanceRuntimeType,
+  'Headers': () => Headers.instanceRuntimeType,
+  'History': () => History.instanceRuntimeType,
+  'ImageBitmap': () => ImageBitmap.instanceRuntimeType,
+  'ImageData': () => ImageData.instanceRuntimeType,
+  'InjectedScriptHost': () => InjectedScriptHost.instanceRuntimeType,
+  'InputDevice': () => InputDevice.instanceRuntimeType,
+  'Iterator': () => DomIterator.instanceRuntimeType,
+  'KeyboardEvent': () => KeyboardEvent.instanceRuntimeType,
+  'KeyframeEffect': () => KeyframeEffect.instanceRuntimeType,
+  'Location': () => Location.instanceRuntimeType,
+  'MIDIAccess': () => MidiAccess.instanceRuntimeType,
+  'MIDIConnectionEvent': () => MidiConnectionEvent.instanceRuntimeType,
+  'MIDIInput': () => MidiInput.instanceRuntimeType,
+  'MIDIInputMap': () => MidiInputMap.instanceRuntimeType,
+  'MIDIMessageEvent': () => MidiMessageEvent.instanceRuntimeType,
+  'MIDIOutput': () => MidiOutput.instanceRuntimeType,
+  'MIDIOutputMap': () => MidiOutputMap.instanceRuntimeType,
+  'MIDIPort': () => MidiPort.instanceRuntimeType,
+  'MediaController': () => MediaController.instanceRuntimeType,
+  'MediaDeviceInfo': () => MediaDeviceInfo.instanceRuntimeType,
+  'MediaDevices': () => MediaDevices.instanceRuntimeType,
+  'MediaEncryptedEvent': () => MediaEncryptedEvent.instanceRuntimeType,
+  'MediaError': () => MediaError.instanceRuntimeType,
+  'MediaKeyError': () => MediaKeyError.instanceRuntimeType,
+  'MediaKeyEvent': () => MediaKeyEvent.instanceRuntimeType,
+  'MediaKeyMessageEvent': () => MediaKeyMessageEvent.instanceRuntimeType,
+  'MediaKeySession': () => MediaKeySession.instanceRuntimeType,
+  'MediaKeyStatusMap': () => MediaKeyStatusMap.instanceRuntimeType,
+  'MediaKeySystemAccess': () => MediaKeySystemAccess.instanceRuntimeType,
+  'MediaKeys': () => MediaKeys.instanceRuntimeType,
+  'MediaList': () => MediaList.instanceRuntimeType,
+  'MediaQueryList': () => MediaQueryList.instanceRuntimeType,
+  'MediaQueryListEvent': () => MediaQueryListEvent.instanceRuntimeType,
+  'MediaSession': () => MediaSession.instanceRuntimeType,
+  'MediaSource': () => MediaSource.instanceRuntimeType,
+  'MediaStream': () => MediaStream.instanceRuntimeType,
+  'MediaStreamEvent': () => MediaStreamEvent.instanceRuntimeType,
+  'MediaStreamTrack': () => MediaStreamTrack.instanceRuntimeType,
+  'MediaStreamTrackEvent': () => MediaStreamTrackEvent.instanceRuntimeType,
+  'MemoryInfo': () => MemoryInfo.instanceRuntimeType,
+  'MessageChannel': () => MessageChannel.instanceRuntimeType,
+  'MessageEvent': () => MessageEvent.instanceRuntimeType,
+  'MessagePort': () => MessagePort.instanceRuntimeType,
+  'Metadata': () => Metadata.instanceRuntimeType,
+  'MimeType': () => MimeType.instanceRuntimeType,
+  'MimeTypeArray': () => MimeTypeArray.instanceRuntimeType,
+  'MouseEvent': () => MouseEvent.instanceRuntimeType,
+  'MutationEvent': () => _MutationEvent.instanceRuntimeType,
+  'MutationObserver': () => MutationObserver.instanceRuntimeType,
+  'MutationRecord': () => MutationRecord.instanceRuntimeType,
+  'NamedNodeMap': () => _NamedNodeMap.instanceRuntimeType,
+  'Navigator': () => Navigator.instanceRuntimeType,
+  'NavigatorCPU': () => NavigatorCpu.instanceRuntimeType,
+  'NavigatorID': () => NavigatorID.instanceRuntimeType,
+  'NavigatorLanguage': () => NavigatorLanguage.instanceRuntimeType,
+  'NavigatorOnLine': () => NavigatorOnLine.instanceRuntimeType,
+  'NavigatorStorageUtils': () => NavigatorStorageUtils.instanceRuntimeType,
+  'NavigatorUserMediaError': () => NavigatorUserMediaError.instanceRuntimeType,
+  'NetworkInformation': () => NetworkInformation.instanceRuntimeType,
+  'Node': () => Node.instanceRuntimeType,
+  'NodeFilter': () => NodeFilter.instanceRuntimeType,
+  'NodeIterator': () => NodeIterator.instanceRuntimeType,
+  'NodeList': () => NodeList.instanceRuntimeType,
+  'NonDocumentTypeChildNode': () => NonDocumentTypeChildNode.instanceRuntimeType,
+  'NonElementParentNode': () => NonElementParentNode.instanceRuntimeType,
+  'Notification': () => Notification.instanceRuntimeType,
+  'NotificationEvent': () => NotificationEvent.instanceRuntimeType,
+  'PagePopupController': () => _PagePopupController.instanceRuntimeType,
+  'PageTransitionEvent': () => PageTransitionEvent.instanceRuntimeType,
+  'ParentNode': () => ParentNode.instanceRuntimeType,
+  'PasswordCredential': () => PasswordCredential.instanceRuntimeType,
+  'Path2D': () => Path2D.instanceRuntimeType,
+  'Performance': () => Performance.instanceRuntimeType,
+  'PerformanceCompositeTiming': () => PerformanceCompositeTiming.instanceRuntimeType,
+  'PerformanceEntry': () => PerformanceEntry.instanceRuntimeType,
+  'PerformanceMark': () => PerformanceMark.instanceRuntimeType,
+  'PerformanceMeasure': () => PerformanceMeasure.instanceRuntimeType,
+  'PerformanceNavigation': () => PerformanceNavigation.instanceRuntimeType,
+  'PerformanceRenderTiming': () => PerformanceRenderTiming.instanceRuntimeType,
+  'PerformanceResourceTiming': () => PerformanceResourceTiming.instanceRuntimeType,
+  'PerformanceTiming': () => PerformanceTiming.instanceRuntimeType,
+  'PeriodicSyncEvent': () => PeriodicSyncEvent.instanceRuntimeType,
+  'PeriodicSyncManager': () => PeriodicSyncManager.instanceRuntimeType,
+  'PeriodicSyncRegistration': () => PeriodicSyncRegistration.instanceRuntimeType,
+  'PermissionStatus': () => PermissionStatus.instanceRuntimeType,
+  'Permissions': () => Permissions.instanceRuntimeType,
+  'Plugin': () => Plugin.instanceRuntimeType,
+  'PluginArray': () => PluginArray.instanceRuntimeType,
+  'PluginPlaceholderElement': () => PluginPlaceholderElement.instanceRuntimeType,
+  'PointerEvent': () => PointerEvent.instanceRuntimeType,
+  'PopStateEvent': () => PopStateEvent.instanceRuntimeType,
+  'PositionError': () => PositionError.instanceRuntimeType,
+  'PositionSensorVRDevice': () => PositionSensorVRDevice.instanceRuntimeType,
+  'Presentation': () => Presentation.instanceRuntimeType,
+  'PresentationAvailability': () => PresentationAvailability.instanceRuntimeType,
+  'PresentationSession': () => PresentationSession.instanceRuntimeType,
+  'ProcessingInstruction': () => ProcessingInstruction.instanceRuntimeType,
+  'ProgressEvent': () => ProgressEvent.instanceRuntimeType,
+  'PromiseRejectionEvent': () => PromiseRejectionEvent.instanceRuntimeType,
+  'PushEvent': () => PushEvent.instanceRuntimeType,
+  'PushManager': () => PushManager.instanceRuntimeType,
+  'PushMessageData': () => PushMessageData.instanceRuntimeType,
+  'PushSubscription': () => PushSubscription.instanceRuntimeType,
+  'RTCDTMFSender': () => RtcDtmfSender.instanceRuntimeType,
+  'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent.instanceRuntimeType,
+  'RTCDataChannel': () => RtcDataChannel.instanceRuntimeType,
+  'RTCDataChannelEvent': () => RtcDataChannelEvent.instanceRuntimeType,
+  'RTCIceCandidate': () => RtcIceCandidate.instanceRuntimeType,
+  'RTCIceCandidateEvent': () => RtcIceCandidateEvent.instanceRuntimeType,
+  'RTCPeerConnection': () => RtcPeerConnection.instanceRuntimeType,
+  'RTCSessionDescription': () => RtcSessionDescription.instanceRuntimeType,
+  'RTCStatsReport': () => RtcStatsReport.instanceRuntimeType,
+  'RTCStatsResponse': () => RtcStatsResponse.instanceRuntimeType,
+  'RadioNodeList': () => _RadioNodeList.instanceRuntimeType,
+  'Range': () => Range.instanceRuntimeType,
+  'ReadableByteStream': () => ReadableByteStream.instanceRuntimeType,
+  'ReadableByteStreamReader': () => ReadableByteStreamReader.instanceRuntimeType,
+  'ReadableStream': () => ReadableStream.instanceRuntimeType,
+  'ReadableStreamReader': () => ReadableStreamReader.instanceRuntimeType,
+  'RelatedEvent': () => RelatedEvent.instanceRuntimeType,
+  'Request': () => _Request.instanceRuntimeType,
+  'ResourceProgressEvent': () => ResourceProgressEvent.instanceRuntimeType,
+  'Response': () => _Response.instanceRuntimeType,
+  'Screen': () => Screen.instanceRuntimeType,
+  'ScreenOrientation': () => ScreenOrientation.instanceRuntimeType,
+  'ScrollState': () => ScrollState.instanceRuntimeType,
+  'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent.instanceRuntimeType,
+  'Selection': () => Selection.instanceRuntimeType,
+  'ServicePort': () => ServicePort.instanceRuntimeType,
+  'ServicePortCollection': () => ServicePortCollection.instanceRuntimeType,
+  'ServicePortConnectEvent': () => ServicePortConnectEvent.instanceRuntimeType,
+  'ServiceWorker': () => _ServiceWorker.instanceRuntimeType,
+  'ServiceWorkerContainer': () => ServiceWorkerContainer.instanceRuntimeType,
+  'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope.instanceRuntimeType,
+  'ServiceWorkerMessageEvent': () => ServiceWorkerMessageEvent.instanceRuntimeType,
+  'ServiceWorkerRegistration': () => ServiceWorkerRegistration.instanceRuntimeType,
+  'ShadowRoot': () => ShadowRoot.instanceRuntimeType,
+  'SharedArrayBuffer': () => SharedArrayBuffer.instanceRuntimeType,
+  'SharedWorker': () => SharedWorker.instanceRuntimeType,
+  'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope.instanceRuntimeType,
+  'SourceBuffer': () => SourceBuffer.instanceRuntimeType,
+  'SourceBufferList': () => SourceBufferList.instanceRuntimeType,
+  'SourceInfo': () => SourceInfo.instanceRuntimeType,
+  'SpeechGrammar': () => SpeechGrammar.instanceRuntimeType,
+  'SpeechGrammarList': () => SpeechGrammarList.instanceRuntimeType,
+  'SpeechRecognition': () => SpeechRecognition.instanceRuntimeType,
+  'SpeechRecognitionAlternative': () => SpeechRecognitionAlternative.instanceRuntimeType,
+  'SpeechRecognitionError': () => SpeechRecognitionError.instanceRuntimeType,
+  'SpeechRecognitionEvent': () => SpeechRecognitionEvent.instanceRuntimeType,
+  'SpeechRecognitionResult': () => SpeechRecognitionResult.instanceRuntimeType,
+  'SpeechRecognitionResultList': () => _SpeechRecognitionResultList.instanceRuntimeType,
+  'SpeechSynthesis': () => SpeechSynthesis.instanceRuntimeType,
+  'SpeechSynthesisEvent': () => SpeechSynthesisEvent.instanceRuntimeType,
+  'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance.instanceRuntimeType,
+  'SpeechSynthesisVoice': () => SpeechSynthesisVoice.instanceRuntimeType,
+  'StashedMessagePort': () => StashedMessagePort.instanceRuntimeType,
+  'StashedPortCollection': () => StashedPortCollection.instanceRuntimeType,
+  'Storage': () => Storage.instanceRuntimeType,
+  'StorageEvent': () => StorageEvent.instanceRuntimeType,
+  'StorageInfo': () => StorageInfo.instanceRuntimeType,
+  'StorageQuota': () => StorageQuota.instanceRuntimeType,
+  'Stream': () => FileStream.instanceRuntimeType,
+  'StyleMedia': () => StyleMedia.instanceRuntimeType,
+  'StyleSheet': () => StyleSheet.instanceRuntimeType,
+  'StyleSheetList': () => _StyleSheetList.instanceRuntimeType,
+  'SubtleCrypto': () => _SubtleCrypto.instanceRuntimeType,
+  'SyncEvent': () => SyncEvent.instanceRuntimeType,
+  'SyncManager': () => SyncManager.instanceRuntimeType,
+  'SyncRegistration': () => SyncRegistration.instanceRuntimeType,
+  'Text': () => Text.instanceRuntimeType,
+  'TextEvent': () => TextEvent.instanceRuntimeType,
+  'TextMetrics': () => TextMetrics.instanceRuntimeType,
+  'TextTrack': () => TextTrack.instanceRuntimeType,
+  'TextTrackCue': () => TextTrackCue.instanceRuntimeType,
+  'TextTrackCueList': () => TextTrackCueList.instanceRuntimeType,
+  'TextTrackList': () => TextTrackList.instanceRuntimeType,
+  'TimeRanges': () => TimeRanges.instanceRuntimeType,
+  'Touch': () => Touch.instanceRuntimeType,
+  'TouchEvent': () => TouchEvent.instanceRuntimeType,
+  'TouchList': () => TouchList.instanceRuntimeType,
+  'TrackDefault': () => TrackDefault.instanceRuntimeType,
+  'TrackDefaultList': () => TrackDefaultList.instanceRuntimeType,
+  'TrackEvent': () => TrackEvent.instanceRuntimeType,
+  'TransitionEvent': () => TransitionEvent.instanceRuntimeType,
+  'TreeWalker': () => TreeWalker.instanceRuntimeType,
+  'UIEvent': () => UIEvent.instanceRuntimeType,
+  'URL': () => Url.instanceRuntimeType,
+  'URLUtils': () => UrlUtils.instanceRuntimeType,
+  'URLUtilsReadOnly': () => UrlUtilsReadOnly.instanceRuntimeType,
+  'VRDevice': () => VRDevice.instanceRuntimeType,
+  'VREyeParameters': () => VREyeParameters.instanceRuntimeType,
+  'VRFieldOfView': () => VRFieldOfView.instanceRuntimeType,
+  'VRPositionState': () => VRPositionState.instanceRuntimeType,
+  'VTTCue': () => VttCue.instanceRuntimeType,
+  'VTTRegion': () => VttRegion.instanceRuntimeType,
+  'VTTRegionList': () => VttRegionList.instanceRuntimeType,
+  'ValidityState': () => ValidityState.instanceRuntimeType,
+  'VideoPlaybackQuality': () => VideoPlaybackQuality.instanceRuntimeType,
+  'VideoTrack': () => VideoTrack.instanceRuntimeType,
+  'VideoTrackList': () => VideoTrackList.instanceRuntimeType,
+  'WebKitCSSMatrix': () => _WebKitCSSMatrix.instanceRuntimeType,
+  'WebSocket': () => WebSocket.instanceRuntimeType,
+  'WheelEvent': () => WheelEvent.instanceRuntimeType,
+  'Window': () => Window.instanceRuntimeType,
+  'WindowBase64': () => WindowBase64.instanceRuntimeType,
+  'WindowClient': () => WindowClient.instanceRuntimeType,
+  'WindowEventHandlers': () => WindowEventHandlers.instanceRuntimeType,
+  'WindowTimers': () => _WindowTimers.instanceRuntimeType,
+  'Worker': () => Worker.instanceRuntimeType,
+  'WorkerConsole': () => WorkerConsole.instanceRuntimeType,
+  'WorkerGlobalScope': () => WorkerGlobalScope.instanceRuntimeType,
+  'WorkerLocation': () => _WorkerLocation.instanceRuntimeType,
+  'WorkerNavigator': () => _WorkerNavigator.instanceRuntimeType,
+  'WorkerPerformance': () => WorkerPerformance.instanceRuntimeType,
+  'XMLDocument': () => XmlDocument.instanceRuntimeType,
+  'XMLHttpRequest': () => HttpRequest.instanceRuntimeType,
+  'XMLHttpRequestEventTarget': () => HttpRequestEventTarget.instanceRuntimeType,
+  'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent.instanceRuntimeType,
+  'XMLHttpRequestUpload': () => HttpRequestUpload.instanceRuntimeType,
+  'XMLSerializer': () => XmlSerializer.instanceRuntimeType,
+  'XPathEvaluator': () => XPathEvaluator.instanceRuntimeType,
+  'XPathExpression': () => XPathExpression.instanceRuntimeType,
+  'XPathNSResolver': () => XPathNSResolver.instanceRuntimeType,
+  'XPathResult': () => XPathResult.instanceRuntimeType,
+  'XSLTProcessor': () => XsltProcessor.instanceRuntimeType,
 
 };
 
 // TODO(leafp): We may want to move this elsewhere if html becomes
 // a package to avoid dartium depending on pkg:html.
+@Deprecated("Internal Use Only")
+getHtmlCreateType(String key) => _getType(key);
+
 Type _getType(String key) {
   var result;
 
@@ -669,534 +673,12 @@
   return null;
 }
 
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final htmlBlinkFunctionMap = {
-  'Animation': () => Animation.internalCreateAnimation,
-  'AnimationEffectReadOnly': () => AnimationEffectReadOnly.internalCreateAnimationEffectReadOnly,
-  'AnimationEffectTiming': () => AnimationEffectTiming.internalCreateAnimationEffectTiming,
-  'AnimationEvent': () => AnimationEvent.internalCreateAnimationEvent,
-  'AnimationPlayerEvent': () => AnimationPlayerEvent.internalCreateAnimationPlayerEvent,
-  'AnimationTimeline': () => AnimationTimeline.internalCreateAnimationTimeline,
-  'AppBannerPromptResult': () => AppBannerPromptResult.internalCreateAppBannerPromptResult,
-  'ApplicationCache': () => ApplicationCache.internalCreateApplicationCache,
-  'ApplicationCacheErrorEvent': () => ApplicationCacheErrorEvent.internalCreateApplicationCacheErrorEvent,
-  'Attr': () => _Attr.internalCreate_Attr,
-  'AudioTrack': () => AudioTrack.internalCreateAudioTrack,
-  'AudioTrackList': () => AudioTrackList.internalCreateAudioTrackList,
-  'AutocompleteErrorEvent': () => AutocompleteErrorEvent.internalCreateAutocompleteErrorEvent,
-  'BarProp': () => BarProp.internalCreateBarProp,
-  'BatteryManager': () => BatteryManager.internalCreateBatteryManager,
-  'BeforeInstallPromptEvent': () => BeforeInstallPromptEvent.internalCreateBeforeInstallPromptEvent,
-  'BeforeUnloadEvent': () => BeforeUnloadEvent.internalCreateBeforeUnloadEvent,
-  'Blob': () => Blob.internalCreateBlob,
-  'Bluetooth': () => Bluetooth.internalCreateBluetooth,
-  'BluetoothDevice': () => BluetoothDevice.internalCreateBluetoothDevice,
-  'BluetoothGATTCharacteristic': () => BluetoothGattCharacteristic.internalCreateBluetoothGattCharacteristic,
-  'BluetoothGATTRemoteServer': () => BluetoothGattRemoteServer.internalCreateBluetoothGattRemoteServer,
-  'BluetoothGATTService': () => BluetoothGattService.internalCreateBluetoothGattService,
-  'BluetoothUUID': () => BluetoothUuid.internalCreateBluetoothUuid,
-  'Body': () => Body.internalCreateBody,
-  'CDATASection': () => CDataSection.internalCreateCDataSection,
-  'CHROMIUMValuebuffer': () => ChromiumValuebuffer.internalCreateChromiumValuebuffer,
-  'CSS': () => Css.internalCreateCss,
-  'CSSCharsetRule': () => CssCharsetRule.internalCreateCssCharsetRule,
-  'CSSFontFaceRule': () => CssFontFaceRule.internalCreateCssFontFaceRule,
-  'CSSGroupingRule': () => CssGroupingRule.internalCreateCssGroupingRule,
-  'CSSImportRule': () => CssImportRule.internalCreateCssImportRule,
-  'CSSKeyframeRule': () => CssKeyframeRule.internalCreateCssKeyframeRule,
-  'CSSKeyframesRule': () => CssKeyframesRule.internalCreateCssKeyframesRule,
-  'CSSMediaRule': () => CssMediaRule.internalCreateCssMediaRule,
-  'CSSPageRule': () => CssPageRule.internalCreateCssPageRule,
-  'CSSRule': () => CssRule.internalCreateCssRule,
-  'CSSRuleList': () => _CssRuleList.internalCreate_CssRuleList,
-  'CSSStyleDeclaration': () => CssStyleDeclaration.internalCreateCssStyleDeclaration,
-  'CSSStyleRule': () => CssStyleRule.internalCreateCssStyleRule,
-  'CSSStyleSheet': () => CssStyleSheet.internalCreateCssStyleSheet,
-  'CSSSupportsRule': () => CssSupportsRule.internalCreateCssSupportsRule,
-  'CSSViewportRule': () => CssViewportRule.internalCreateCssViewportRule,
-  'Cache': () => _Cache.internalCreate_Cache,
-  'CacheStorage': () => CacheStorage.internalCreateCacheStorage,
-  'CanvasGradient': () => CanvasGradient.internalCreateCanvasGradient,
-  'CanvasPattern': () => CanvasPattern.internalCreateCanvasPattern,
-  'CanvasRenderingContext2D': () => CanvasRenderingContext2D.internalCreateCanvasRenderingContext2D,
-  'CharacterData': () => CharacterData.internalCreateCharacterData,
-  'CircularGeofencingRegion': () => CircularGeofencingRegion.internalCreateCircularGeofencingRegion,
-  'Client': () => Client.internalCreateClient,
-  'ClientRect': () => _ClientRect.internalCreate_ClientRect,
-  'ClientRectList': () => _ClientRectList.internalCreate_ClientRectList,
-  'Clients': () => Clients.internalCreateClients,
-  'ClipboardEvent': () => ClipboardEvent.internalCreateClipboardEvent,
-  'CloseEvent': () => CloseEvent.internalCreateCloseEvent,
-  'Comment': () => Comment.internalCreateComment,
-  'CompositionEvent': () => CompositionEvent.internalCreateCompositionEvent,
-  'CompositorProxy': () => CompositorProxy.internalCreateCompositorProxy,
-  'CompositorWorker': () => CompositorWorker.internalCreateCompositorWorker,
-  'CompositorWorkerGlobalScope': () => CompositorWorkerGlobalScope.internalCreateCompositorWorkerGlobalScope,
-  'Console': () => Console.internalCreateConsole,
-  'ConsoleBase': () => ConsoleBase.internalCreateConsoleBase,
-  'Coordinates': () => Coordinates.internalCreateCoordinates,
-  'Credential': () => Credential.internalCreateCredential,
-  'CredentialsContainer': () => CredentialsContainer.internalCreateCredentialsContainer,
-  'CrossOriginConnectEvent': () => CrossOriginConnectEvent.internalCreateCrossOriginConnectEvent,
-  'CrossOriginServiceWorkerClient': () => CrossOriginServiceWorkerClient.internalCreateCrossOriginServiceWorkerClient,
-  'Crypto': () => Crypto.internalCreateCrypto,
-  'CryptoKey': () => CryptoKey.internalCreateCryptoKey,
-  'CustomEvent': () => CustomEvent.internalCreateCustomEvent,
-  'DOMError': () => DomError.internalCreateDomError,
-  'DOMException': () => DomException.internalCreateDomException,
-  'DOMFileSystem': () => FileSystem.internalCreateFileSystem,
-  'DOMFileSystemSync': () => _DOMFileSystemSync.internalCreate_DOMFileSystemSync,
-  'DOMImplementation': () => DomImplementation.internalCreateDomImplementation,
-  'DOMMatrix': () => DomMatrix.internalCreateDomMatrix,
-  'DOMMatrixReadOnly': () => DomMatrixReadOnly.internalCreateDomMatrixReadOnly,
-  'DOMParser': () => DomParser.internalCreateDomParser,
-  'DOMPoint': () => DomPoint.internalCreateDomPoint,
-  'DOMPointReadOnly': () => DomPointReadOnly.internalCreateDomPointReadOnly,
-  'DOMRect': () => _DomRect.internalCreate_DomRect,
-  'DOMRectReadOnly': () => DomRectReadOnly.internalCreateDomRectReadOnly,
-  'DOMSettableTokenList': () => DomSettableTokenList.internalCreateDomSettableTokenList,
-  'DOMStringList': () => DomStringList.internalCreateDomStringList,
-  'DOMTokenList': () => DomTokenList.internalCreateDomTokenList,
-  'DataTransfer': () => DataTransfer.internalCreateDataTransfer,
-  'DataTransferItem': () => DataTransferItem.internalCreateDataTransferItem,
-  'DataTransferItemList': () => DataTransferItemList.internalCreateDataTransferItemList,
-  'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope.internalCreateDedicatedWorkerGlobalScope,
-  'DefaultSessionStartEvent': () => DefaultSessionStartEvent.internalCreateDefaultSessionStartEvent,
-  'DeprecatedStorageInfo': () => DeprecatedStorageInfo.internalCreateDeprecatedStorageInfo,
-  'DeprecatedStorageQuota': () => DeprecatedStorageQuota.internalCreateDeprecatedStorageQuota,
-  'DeviceAcceleration': () => DeviceAcceleration.internalCreateDeviceAcceleration,
-  'DeviceLightEvent': () => DeviceLightEvent.internalCreateDeviceLightEvent,
-  'DeviceMotionEvent': () => DeviceMotionEvent.internalCreateDeviceMotionEvent,
-  'DeviceOrientationEvent': () => DeviceOrientationEvent.internalCreateDeviceOrientationEvent,
-  'DeviceRotationRate': () => DeviceRotationRate.internalCreateDeviceRotationRate,
-  'DirectoryEntry': () => DirectoryEntry.internalCreateDirectoryEntry,
-  'DirectoryEntrySync': () => _DirectoryEntrySync.internalCreate_DirectoryEntrySync,
-  'DirectoryReader': () => DirectoryReader.internalCreateDirectoryReader,
-  'DirectoryReaderSync': () => _DirectoryReaderSync.internalCreate_DirectoryReaderSync,
-  'Document': () => Document.internalCreateDocument,
-  'DocumentFragment': () => DocumentFragment.internalCreateDocumentFragment,
-  'DocumentType': () => _DocumentType.internalCreate_DocumentType,
-  'EffectModel': () => EffectModel.internalCreateEffectModel,
-  'Element': () => Element.internalCreateElement,
-  'Entry': () => Entry.internalCreateEntry,
-  'EntrySync': () => _EntrySync.internalCreate_EntrySync,
-  'ErrorEvent': () => ErrorEvent.internalCreateErrorEvent,
-  'Event': () => Event.internalCreateEvent,
-  'EventSource': () => EventSource.internalCreateEventSource,
-  'EventTarget': () => EventTarget.internalCreateEventTarget,
-  'ExtendableEvent': () => ExtendableEvent.internalCreateExtendableEvent,
-  'FederatedCredential': () => FederatedCredential.internalCreateFederatedCredential,
-  'FetchEvent': () => FetchEvent.internalCreateFetchEvent,
-  'File': () => File.internalCreateFile,
-  'FileEntry': () => FileEntry.internalCreateFileEntry,
-  'FileEntrySync': () => _FileEntrySync.internalCreate_FileEntrySync,
-  'FileError': () => FileError.internalCreateFileError,
-  'FileList': () => FileList.internalCreateFileList,
-  'FileReader': () => FileReader.internalCreateFileReader,
-  'FileReaderSync': () => _FileReaderSync.internalCreate_FileReaderSync,
-  'FileWriter': () => FileWriter.internalCreateFileWriter,
-  'FileWriterSync': () => _FileWriterSync.internalCreate_FileWriterSync,
-  'FocusEvent': () => FocusEvent.internalCreateFocusEvent,
-  'FontFace': () => FontFace.internalCreateFontFace,
-  'FontFaceSet': () => FontFaceSet.internalCreateFontFaceSet,
-  'FontFaceSetLoadEvent': () => FontFaceSetLoadEvent.internalCreateFontFaceSetLoadEvent,
-  'FormData': () => FormData.internalCreateFormData,
-  'Gamepad': () => Gamepad.internalCreateGamepad,
-  'GamepadButton': () => GamepadButton.internalCreateGamepadButton,
-  'GamepadEvent': () => GamepadEvent.internalCreateGamepadEvent,
-  'GamepadList': () => _GamepadList.internalCreate_GamepadList,
-  'Geofencing': () => Geofencing.internalCreateGeofencing,
-  'GeofencingEvent': () => GeofencingEvent.internalCreateGeofencingEvent,
-  'GeofencingRegion': () => GeofencingRegion.internalCreateGeofencingRegion,
-  'Geolocation': () => Geolocation.internalCreateGeolocation,
-  'Geoposition': () => Geoposition.internalCreateGeoposition,
-  'HMDVRDevice': () => HmdvrDevice.internalCreateHmdvrDevice,
-  'HTMLAllCollection': () => _HTMLAllCollection.internalCreate_HTMLAllCollection,
-  'HTMLAnchorElement': () => AnchorElement.internalCreateAnchorElement,
-  'HTMLAppletElement': () => _HTMLAppletElement.internalCreate_HTMLAppletElement,
-  'HTMLAreaElement': () => AreaElement.internalCreateAreaElement,
-  'HTMLAudioElement': () => AudioElement.internalCreateAudioElement,
-  'HTMLBRElement': () => BRElement.internalCreateBRElement,
-  'HTMLBaseElement': () => BaseElement.internalCreateBaseElement,
-  'HTMLBodyElement': () => BodyElement.internalCreateBodyElement,
-  'HTMLButtonElement': () => ButtonElement.internalCreateButtonElement,
-  'HTMLCanvasElement': () => CanvasElement.internalCreateCanvasElement,
-  'HTMLCollection': () => HtmlCollection.internalCreateHtmlCollection,
-  'HTMLContentElement': () => ContentElement.internalCreateContentElement,
-  'HTMLDListElement': () => DListElement.internalCreateDListElement,
-  'HTMLDataListElement': () => DataListElement.internalCreateDataListElement,
-  'HTMLDetailsElement': () => DetailsElement.internalCreateDetailsElement,
-  'HTMLDialogElement': () => DialogElement.internalCreateDialogElement,
-  'HTMLDirectoryElement': () => _HTMLDirectoryElement.internalCreate_HTMLDirectoryElement,
-  'HTMLDivElement': () => DivElement.internalCreateDivElement,
-  'HTMLDocument': () => HtmlDocument.internalCreateHtmlDocument,
-  'HTMLElement': () => HtmlElement.internalCreateHtmlElement,
-  'HTMLEmbedElement': () => EmbedElement.internalCreateEmbedElement,
-  'HTMLFieldSetElement': () => FieldSetElement.internalCreateFieldSetElement,
-  'HTMLFontElement': () => _HTMLFontElement.internalCreate_HTMLFontElement,
-  'HTMLFormControlsCollection': () => HtmlFormControlsCollection.internalCreateHtmlFormControlsCollection,
-  'HTMLFormElement': () => FormElement.internalCreateFormElement,
-  'HTMLFrameElement': () => _HTMLFrameElement.internalCreate_HTMLFrameElement,
-  'HTMLFrameSetElement': () => _HTMLFrameSetElement.internalCreate_HTMLFrameSetElement,
-  'HTMLHRElement': () => HRElement.internalCreateHRElement,
-  'HTMLHeadElement': () => HeadElement.internalCreateHeadElement,
-  'HTMLHeadingElement': () => HeadingElement.internalCreateHeadingElement,
-  'HTMLHtmlElement': () => HtmlHtmlElement.internalCreateHtmlHtmlElement,
-  'HTMLIFrameElement': () => IFrameElement.internalCreateIFrameElement,
-  'HTMLImageElement': () => ImageElement.internalCreateImageElement,
-  'HTMLInputElement': () => InputElement.internalCreateInputElement,
-  'HTMLKeygenElement': () => KeygenElement.internalCreateKeygenElement,
-  'HTMLLIElement': () => LIElement.internalCreateLIElement,
-  'HTMLLabelElement': () => LabelElement.internalCreateLabelElement,
-  'HTMLLegendElement': () => LegendElement.internalCreateLegendElement,
-  'HTMLLinkElement': () => LinkElement.internalCreateLinkElement,
-  'HTMLMapElement': () => MapElement.internalCreateMapElement,
-  'HTMLMarqueeElement': () => _HTMLMarqueeElement.internalCreate_HTMLMarqueeElement,
-  'HTMLMediaElement': () => MediaElement.internalCreateMediaElement,
-  'HTMLMenuElement': () => MenuElement.internalCreateMenuElement,
-  'HTMLMenuItemElement': () => MenuItemElement.internalCreateMenuItemElement,
-  'HTMLMetaElement': () => MetaElement.internalCreateMetaElement,
-  'HTMLMeterElement': () => MeterElement.internalCreateMeterElement,
-  'HTMLModElement': () => ModElement.internalCreateModElement,
-  'HTMLOListElement': () => OListElement.internalCreateOListElement,
-  'HTMLObjectElement': () => ObjectElement.internalCreateObjectElement,
-  'HTMLOptGroupElement': () => OptGroupElement.internalCreateOptGroupElement,
-  'HTMLOptionElement': () => OptionElement.internalCreateOptionElement,
-  'HTMLOptionsCollection': () => HtmlOptionsCollection.internalCreateHtmlOptionsCollection,
-  'HTMLOutputElement': () => OutputElement.internalCreateOutputElement,
-  'HTMLParagraphElement': () => ParagraphElement.internalCreateParagraphElement,
-  'HTMLParamElement': () => ParamElement.internalCreateParamElement,
-  'HTMLPictureElement': () => PictureElement.internalCreatePictureElement,
-  'HTMLPreElement': () => PreElement.internalCreatePreElement,
-  'HTMLProgressElement': () => ProgressElement.internalCreateProgressElement,
-  'HTMLQuoteElement': () => QuoteElement.internalCreateQuoteElement,
-  'HTMLScriptElement': () => ScriptElement.internalCreateScriptElement,
-  'HTMLSelectElement': () => SelectElement.internalCreateSelectElement,
-  'HTMLShadowElement': () => ShadowElement.internalCreateShadowElement,
-  'HTMLSourceElement': () => SourceElement.internalCreateSourceElement,
-  'HTMLSpanElement': () => SpanElement.internalCreateSpanElement,
-  'HTMLStyleElement': () => StyleElement.internalCreateStyleElement,
-  'HTMLTableCaptionElement': () => TableCaptionElement.internalCreateTableCaptionElement,
-  'HTMLTableCellElement': () => TableCellElement.internalCreateTableCellElement,
-  'HTMLTableColElement': () => TableColElement.internalCreateTableColElement,
-  'HTMLTableElement': () => TableElement.internalCreateTableElement,
-  'HTMLTableRowElement': () => TableRowElement.internalCreateTableRowElement,
-  'HTMLTableSectionElement': () => TableSectionElement.internalCreateTableSectionElement,
-  'HTMLTemplateElement': () => TemplateElement.internalCreateTemplateElement,
-  'HTMLTextAreaElement': () => TextAreaElement.internalCreateTextAreaElement,
-  'HTMLTitleElement': () => TitleElement.internalCreateTitleElement,
-  'HTMLTrackElement': () => TrackElement.internalCreateTrackElement,
-  'HTMLUListElement': () => UListElement.internalCreateUListElement,
-  'HTMLUnknownElement': () => UnknownElement.internalCreateUnknownElement,
-  'HTMLVideoElement': () => VideoElement.internalCreateVideoElement,
-  'HashChangeEvent': () => HashChangeEvent.internalCreateHashChangeEvent,
-  'Headers': () => Headers.internalCreateHeaders,
-  'History': () => History.internalCreateHistory,
-  'ImageBitmap': () => ImageBitmap.internalCreateImageBitmap,
-  'ImageData': () => ImageData.internalCreateImageData,
-  'InjectedScriptHost': () => InjectedScriptHost.internalCreateInjectedScriptHost,
-  'InputDevice': () => InputDevice.internalCreateInputDevice,
-  'Iterator': () => DomIterator.internalCreateDomIterator,
-  'KeyboardEvent': () => KeyboardEvent.internalCreateKeyboardEvent,
-  'KeyframeEffect': () => KeyframeEffect.internalCreateKeyframeEffect,
-  'Location': () => Location.internalCreateLocation,
-  'MIDIAccess': () => MidiAccess.internalCreateMidiAccess,
-  'MIDIConnectionEvent': () => MidiConnectionEvent.internalCreateMidiConnectionEvent,
-  'MIDIInput': () => MidiInput.internalCreateMidiInput,
-  'MIDIInputMap': () => MidiInputMap.internalCreateMidiInputMap,
-  'MIDIMessageEvent': () => MidiMessageEvent.internalCreateMidiMessageEvent,
-  'MIDIOutput': () => MidiOutput.internalCreateMidiOutput,
-  'MIDIOutputMap': () => MidiOutputMap.internalCreateMidiOutputMap,
-  'MIDIPort': () => MidiPort.internalCreateMidiPort,
-  'MediaController': () => MediaController.internalCreateMediaController,
-  'MediaDeviceInfo': () => MediaDeviceInfo.internalCreateMediaDeviceInfo,
-  'MediaDevices': () => MediaDevices.internalCreateMediaDevices,
-  'MediaEncryptedEvent': () => MediaEncryptedEvent.internalCreateMediaEncryptedEvent,
-  'MediaError': () => MediaError.internalCreateMediaError,
-  'MediaKeyError': () => MediaKeyError.internalCreateMediaKeyError,
-  'MediaKeyEvent': () => MediaKeyEvent.internalCreateMediaKeyEvent,
-  'MediaKeyMessageEvent': () => MediaKeyMessageEvent.internalCreateMediaKeyMessageEvent,
-  'MediaKeySession': () => MediaKeySession.internalCreateMediaKeySession,
-  'MediaKeyStatusMap': () => MediaKeyStatusMap.internalCreateMediaKeyStatusMap,
-  'MediaKeySystemAccess': () => MediaKeySystemAccess.internalCreateMediaKeySystemAccess,
-  'MediaKeys': () => MediaKeys.internalCreateMediaKeys,
-  'MediaList': () => MediaList.internalCreateMediaList,
-  'MediaQueryList': () => MediaQueryList.internalCreateMediaQueryList,
-  'MediaQueryListEvent': () => MediaQueryListEvent.internalCreateMediaQueryListEvent,
-  'MediaSession': () => MediaSession.internalCreateMediaSession,
-  'MediaSource': () => MediaSource.internalCreateMediaSource,
-  'MediaStream': () => MediaStream.internalCreateMediaStream,
-  'MediaStreamEvent': () => MediaStreamEvent.internalCreateMediaStreamEvent,
-  'MediaStreamTrack': () => MediaStreamTrack.internalCreateMediaStreamTrack,
-  'MediaStreamTrackEvent': () => MediaStreamTrackEvent.internalCreateMediaStreamTrackEvent,
-  'MemoryInfo': () => MemoryInfo.internalCreateMemoryInfo,
-  'MessageChannel': () => MessageChannel.internalCreateMessageChannel,
-  'MessageEvent': () => MessageEvent.internalCreateMessageEvent,
-  'MessagePort': () => MessagePort.internalCreateMessagePort,
-  'Metadata': () => Metadata.internalCreateMetadata,
-  'MimeType': () => MimeType.internalCreateMimeType,
-  'MimeTypeArray': () => MimeTypeArray.internalCreateMimeTypeArray,
-  'MouseEvent': () => MouseEvent.internalCreateMouseEvent,
-  'MutationEvent': () => _MutationEvent.internalCreate_MutationEvent,
-  'MutationObserver': () => MutationObserver.internalCreateMutationObserver,
-  'MutationRecord': () => MutationRecord.internalCreateMutationRecord,
-  'NamedNodeMap': () => _NamedNodeMap.internalCreate_NamedNodeMap,
-  'Navigator': () => Navigator.internalCreateNavigator,
-  'NavigatorStorageUtils': () => NavigatorStorageUtils.internalCreateNavigatorStorageUtils,
-  'NavigatorUserMediaError': () => NavigatorUserMediaError.internalCreateNavigatorUserMediaError,
-  'NetworkInformation': () => NetworkInformation.internalCreateNetworkInformation,
-  'Node': () => Node.internalCreateNode,
-  'NodeFilter': () => NodeFilter.internalCreateNodeFilter,
-  'NodeIterator': () => NodeIterator.internalCreateNodeIterator,
-  'NodeList': () => NodeList.internalCreateNodeList,
-  'NonDocumentTypeChildNode': () => NonDocumentTypeChildNode.internalCreateNonDocumentTypeChildNode,
-  'NonElementParentNode': () => NonElementParentNode.internalCreateNonElementParentNode,
-  'Notification': () => Notification.internalCreateNotification,
-  'NotificationEvent': () => NotificationEvent.internalCreateNotificationEvent,
-  'PagePopupController': () => _PagePopupController.internalCreate_PagePopupController,
-  'PageTransitionEvent': () => PageTransitionEvent.internalCreatePageTransitionEvent,
-  'PasswordCredential': () => PasswordCredential.internalCreatePasswordCredential,
-  'Path2D': () => Path2D.internalCreatePath2D,
-  'Performance': () => Performance.internalCreatePerformance,
-  'PerformanceCompositeTiming': () => PerformanceCompositeTiming.internalCreatePerformanceCompositeTiming,
-  'PerformanceEntry': () => PerformanceEntry.internalCreatePerformanceEntry,
-  'PerformanceMark': () => PerformanceMark.internalCreatePerformanceMark,
-  'PerformanceMeasure': () => PerformanceMeasure.internalCreatePerformanceMeasure,
-  'PerformanceNavigation': () => PerformanceNavigation.internalCreatePerformanceNavigation,
-  'PerformanceRenderTiming': () => PerformanceRenderTiming.internalCreatePerformanceRenderTiming,
-  'PerformanceResourceTiming': () => PerformanceResourceTiming.internalCreatePerformanceResourceTiming,
-  'PerformanceTiming': () => PerformanceTiming.internalCreatePerformanceTiming,
-  'PeriodicSyncEvent': () => PeriodicSyncEvent.internalCreatePeriodicSyncEvent,
-  'PeriodicSyncManager': () => PeriodicSyncManager.internalCreatePeriodicSyncManager,
-  'PeriodicSyncRegistration': () => PeriodicSyncRegistration.internalCreatePeriodicSyncRegistration,
-  'PermissionStatus': () => PermissionStatus.internalCreatePermissionStatus,
-  'Permissions': () => Permissions.internalCreatePermissions,
-  'Plugin': () => Plugin.internalCreatePlugin,
-  'PluginArray': () => PluginArray.internalCreatePluginArray,
-  'PluginPlaceholderElement': () => PluginPlaceholderElement.internalCreatePluginPlaceholderElement,
-  'PointerEvent': () => PointerEvent.internalCreatePointerEvent,
-  'PopStateEvent': () => PopStateEvent.internalCreatePopStateEvent,
-  'PositionError': () => PositionError.internalCreatePositionError,
-  'PositionSensorVRDevice': () => PositionSensorVRDevice.internalCreatePositionSensorVRDevice,
-  'Presentation': () => Presentation.internalCreatePresentation,
-  'PresentationAvailability': () => PresentationAvailability.internalCreatePresentationAvailability,
-  'PresentationSession': () => PresentationSession.internalCreatePresentationSession,
-  'ProcessingInstruction': () => ProcessingInstruction.internalCreateProcessingInstruction,
-  'ProgressEvent': () => ProgressEvent.internalCreateProgressEvent,
-  'PromiseRejectionEvent': () => PromiseRejectionEvent.internalCreatePromiseRejectionEvent,
-  'PushEvent': () => PushEvent.internalCreatePushEvent,
-  'PushManager': () => PushManager.internalCreatePushManager,
-  'PushMessageData': () => PushMessageData.internalCreatePushMessageData,
-  'PushSubscription': () => PushSubscription.internalCreatePushSubscription,
-  'RTCDTMFSender': () => RtcDtmfSender.internalCreateRtcDtmfSender,
-  'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent.internalCreateRtcDtmfToneChangeEvent,
-  'RTCDataChannel': () => RtcDataChannel.internalCreateRtcDataChannel,
-  'RTCDataChannelEvent': () => RtcDataChannelEvent.internalCreateRtcDataChannelEvent,
-  'RTCIceCandidate': () => RtcIceCandidate.internalCreateRtcIceCandidate,
-  'RTCIceCandidateEvent': () => RtcIceCandidateEvent.internalCreateRtcIceCandidateEvent,
-  'RTCPeerConnection': () => RtcPeerConnection.internalCreateRtcPeerConnection,
-  'RTCSessionDescription': () => RtcSessionDescription.internalCreateRtcSessionDescription,
-  'RTCStatsReport': () => RtcStatsReport.internalCreateRtcStatsReport,
-  'RTCStatsResponse': () => RtcStatsResponse.internalCreateRtcStatsResponse,
-  'RadioNodeList': () => _RadioNodeList.internalCreate_RadioNodeList,
-  'Range': () => Range.internalCreateRange,
-  'ReadableByteStream': () => ReadableByteStream.internalCreateReadableByteStream,
-  'ReadableByteStreamReader': () => ReadableByteStreamReader.internalCreateReadableByteStreamReader,
-  'ReadableStream': () => ReadableStream.internalCreateReadableStream,
-  'ReadableStreamReader': () => ReadableStreamReader.internalCreateReadableStreamReader,
-  'RelatedEvent': () => RelatedEvent.internalCreateRelatedEvent,
-  'Request': () => _Request.internalCreate_Request,
-  'ResourceProgressEvent': () => ResourceProgressEvent.internalCreateResourceProgressEvent,
-  'Response': () => _Response.internalCreate_Response,
-  'Screen': () => Screen.internalCreateScreen,
-  'ScreenOrientation': () => ScreenOrientation.internalCreateScreenOrientation,
-  'ScrollState': () => ScrollState.internalCreateScrollState,
-  'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent.internalCreateSecurityPolicyViolationEvent,
-  'Selection': () => Selection.internalCreateSelection,
-  'ServicePort': () => ServicePort.internalCreateServicePort,
-  'ServicePortCollection': () => ServicePortCollection.internalCreateServicePortCollection,
-  'ServicePortConnectEvent': () => ServicePortConnectEvent.internalCreateServicePortConnectEvent,
-  'ServiceWorker': () => _ServiceWorker.internalCreate_ServiceWorker,
-  'ServiceWorkerContainer': () => ServiceWorkerContainer.internalCreateServiceWorkerContainer,
-  'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope.internalCreateServiceWorkerGlobalScope,
-  'ServiceWorkerMessageEvent': () => ServiceWorkerMessageEvent.internalCreateServiceWorkerMessageEvent,
-  'ServiceWorkerRegistration': () => ServiceWorkerRegistration.internalCreateServiceWorkerRegistration,
-  'ShadowRoot': () => ShadowRoot.internalCreateShadowRoot,
-  'SharedArrayBuffer': () => SharedArrayBuffer.internalCreateSharedArrayBuffer,
-  'SharedWorker': () => SharedWorker.internalCreateSharedWorker,
-  'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope.internalCreateSharedWorkerGlobalScope,
-  'SourceBuffer': () => SourceBuffer.internalCreateSourceBuffer,
-  'SourceBufferList': () => SourceBufferList.internalCreateSourceBufferList,
-  'SourceInfo': () => SourceInfo.internalCreateSourceInfo,
-  'SpeechGrammar': () => SpeechGrammar.internalCreateSpeechGrammar,
-  'SpeechGrammarList': () => SpeechGrammarList.internalCreateSpeechGrammarList,
-  'SpeechRecognition': () => SpeechRecognition.internalCreateSpeechRecognition,
-  'SpeechRecognitionAlternative': () => SpeechRecognitionAlternative.internalCreateSpeechRecognitionAlternative,
-  'SpeechRecognitionError': () => SpeechRecognitionError.internalCreateSpeechRecognitionError,
-  'SpeechRecognitionEvent': () => SpeechRecognitionEvent.internalCreateSpeechRecognitionEvent,
-  'SpeechRecognitionResult': () => SpeechRecognitionResult.internalCreateSpeechRecognitionResult,
-  'SpeechRecognitionResultList': () => _SpeechRecognitionResultList.internalCreate_SpeechRecognitionResultList,
-  'SpeechSynthesis': () => SpeechSynthesis.internalCreateSpeechSynthesis,
-  'SpeechSynthesisEvent': () => SpeechSynthesisEvent.internalCreateSpeechSynthesisEvent,
-  'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance.internalCreateSpeechSynthesisUtterance,
-  'SpeechSynthesisVoice': () => SpeechSynthesisVoice.internalCreateSpeechSynthesisVoice,
-  'StashedMessagePort': () => StashedMessagePort.internalCreateStashedMessagePort,
-  'StashedPortCollection': () => StashedPortCollection.internalCreateStashedPortCollection,
-  'Storage': () => Storage.internalCreateStorage,
-  'StorageEvent': () => StorageEvent.internalCreateStorageEvent,
-  'StorageInfo': () => StorageInfo.internalCreateStorageInfo,
-  'StorageQuota': () => StorageQuota.internalCreateStorageQuota,
-  'Stream': () => FileStream.internalCreateFileStream,
-  'StyleMedia': () => StyleMedia.internalCreateStyleMedia,
-  'StyleSheet': () => StyleSheet.internalCreateStyleSheet,
-  'StyleSheetList': () => _StyleSheetList.internalCreate_StyleSheetList,
-  'SubtleCrypto': () => _SubtleCrypto.internalCreate_SubtleCrypto,
-  'SyncEvent': () => SyncEvent.internalCreateSyncEvent,
-  'SyncManager': () => SyncManager.internalCreateSyncManager,
-  'SyncRegistration': () => SyncRegistration.internalCreateSyncRegistration,
-  'Text': () => Text.internalCreateText,
-  'TextEvent': () => TextEvent.internalCreateTextEvent,
-  'TextMetrics': () => TextMetrics.internalCreateTextMetrics,
-  'TextTrack': () => TextTrack.internalCreateTextTrack,
-  'TextTrackCue': () => TextTrackCue.internalCreateTextTrackCue,
-  'TextTrackCueList': () => TextTrackCueList.internalCreateTextTrackCueList,
-  'TextTrackList': () => TextTrackList.internalCreateTextTrackList,
-  'TimeRanges': () => TimeRanges.internalCreateTimeRanges,
-  'Touch': () => Touch.internalCreateTouch,
-  'TouchEvent': () => TouchEvent.internalCreateTouchEvent,
-  'TouchList': () => TouchList.internalCreateTouchList,
-  'TrackDefault': () => TrackDefault.internalCreateTrackDefault,
-  'TrackDefaultList': () => TrackDefaultList.internalCreateTrackDefaultList,
-  'TrackEvent': () => TrackEvent.internalCreateTrackEvent,
-  'TransitionEvent': () => TransitionEvent.internalCreateTransitionEvent,
-  'TreeWalker': () => TreeWalker.internalCreateTreeWalker,
-  'UIEvent': () => UIEvent.internalCreateUIEvent,
-  'URL': () => Url.internalCreateUrl,
-  'VRDevice': () => VRDevice.internalCreateVRDevice,
-  'VREyeParameters': () => VREyeParameters.internalCreateVREyeParameters,
-  'VRFieldOfView': () => VRFieldOfView.internalCreateVRFieldOfView,
-  'VRPositionState': () => VRPositionState.internalCreateVRPositionState,
-  'VTTCue': () => VttCue.internalCreateVttCue,
-  'VTTRegion': () => VttRegion.internalCreateVttRegion,
-  'VTTRegionList': () => VttRegionList.internalCreateVttRegionList,
-  'ValidityState': () => ValidityState.internalCreateValidityState,
-  'VideoPlaybackQuality': () => VideoPlaybackQuality.internalCreateVideoPlaybackQuality,
-  'VideoTrack': () => VideoTrack.internalCreateVideoTrack,
-  'VideoTrackList': () => VideoTrackList.internalCreateVideoTrackList,
-  'WebKitCSSMatrix': () => _WebKitCSSMatrix.internalCreate_WebKitCSSMatrix,
-  'WebSocket': () => WebSocket.internalCreateWebSocket,
-  'WheelEvent': () => WheelEvent.internalCreateWheelEvent,
-  'Window': () => Window.internalCreateWindow,
-  'WindowClient': () => WindowClient.internalCreateWindowClient,
-  'Worker': () => Worker.internalCreateWorker,
-  'WorkerConsole': () => WorkerConsole.internalCreateWorkerConsole,
-  'WorkerGlobalScope': () => WorkerGlobalScope.internalCreateWorkerGlobalScope,
-  'WorkerLocation': () => _WorkerLocation.internalCreate_WorkerLocation,
-  'WorkerNavigator': () => _WorkerNavigator.internalCreate_WorkerNavigator,
-  'WorkerPerformance': () => WorkerPerformance.internalCreateWorkerPerformance,
-  'XMLDocument': () => XmlDocument.internalCreateXmlDocument,
-  'XMLHttpRequest': () => HttpRequest.internalCreateHttpRequest,
-  'XMLHttpRequestEventTarget': () => HttpRequestEventTarget.internalCreateHttpRequestEventTarget,
-  'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent.internalCreate_XMLHttpRequestProgressEvent,
-  'XMLHttpRequestUpload': () => HttpRequestUpload.internalCreateHttpRequestUpload,
-  'XMLSerializer': () => XmlSerializer.internalCreateXmlSerializer,
-  'XPathEvaluator': () => XPathEvaluator.internalCreateXPathEvaluator,
-  'XPathExpression': () => XPathExpression.internalCreateXPathExpression,
-  'XPathNSResolver': () => XPathNSResolver.internalCreateXPathNSResolver,
-  'XPathResult': () => XPathResult.internalCreateXPathResult,
-  'XSLTProcessor': () => XsltProcessor.internalCreateXsltProcessor,
-  'polymer-element': () => HtmlElement.internalCreateHtmlElement,
-
-};
-
-// TODO(terry): We may want to move this elsewhere if html becomes
-// a package to avoid dartium depending on pkg:html.
-@Deprecated("Internal Use Only")
-getHtmlCreateFunction(String key) {
-  var result;
-
-  // TODO(vsm): Add Cross Frame and JS types here as well.
-
-  // Check the html library.
-  result = _getHtmlFunction(key);
-  if (result != null) {
-    return result;
+// TODO(jacobr): it would be nice to place this in a consistent place for dart2js and dartium.
+_convertNativeToDart_XHR_Response(o) {
+  if (o is Document) {
+    return o;
   }
-
-  // Check the web gl library.
-  result = _getWebGlFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the indexed db library.
-  result = _getIndexDbFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the web audio library.
-  result = _getWebAudioFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the web sql library.
-  result = _getWebSqlFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the svg library.
-  result = _getSvgFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  return null;
-}
-
-Function _getHtmlFunction(String key) {
-  if (htmlBlinkFunctionMap.containsKey(key)) {
-    return htmlBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getWebGlFunction(String key) {
-  if (web_glBlinkFunctionMap.containsKey(key)) {
-    return web_glBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getIndexDbFunction(String key) {
-  if (indexed_dbBlinkFunctionMap.containsKey(key)) {
-    return indexed_dbBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getWebAudioFunction(String key) {
-  if (web_audioBlinkFunctionMap.containsKey(key)) {
-    return web_audioBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getWebSqlFunction(String key) {
-  if (web_sqlBlinkFunctionMap.containsKey(key)) {
-    return web_sqlBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getSvgFunction(String key) {
-  if (svgBlinkFunctionMap.containsKey(key)) {
-    return svgBlinkFunctionMap[key]();
-  }
-  return null;
+  return convertNativeToDart_SerializedScriptValue(o);
 }
 
 
@@ -1219,22 +701,14 @@
   var jsObject;
   var tag = "";
   var runtimeType = element.runtimeType;
-  if (runtimeType == HtmlElement) {
-    tag = element.localName;
-  } else if (runtimeType == TemplateElement) {
+  if (runtimeType == TemplateElement) {
     // Data binding with a Dart class.
     tag = element.attributes['is'];
-  } else if (runtimeType == js.JsObject) {
-    // It's a Polymer core element (written in JS).
-    // Make sure it's an element anything else we can ignore.
-    if (element.hasProperty('nodeType') && element['nodeType'] == 1) {
-      if (js.JsNative.callMethod(element, 'hasAttribute', ['is'])) {
-        // It's data binding use the is attribute.
-        tag = js.JsNative.callMethod(element, 'getAttribute', ['is']);
-      } else {
-        // It's a custom element we want the local name.
-        tag = element['localName'];
-      }
+  } else if (element is HtmlElement) {
+    tag = element.attributes['is'];
+    if (tag == null) {
+      // It's a custom element we want the local name.
+      tag = element.localName;
     }
   } else {
     throw new UnsupportedError('Element is incorrect type. Got ${runtimeType}, expected HtmlElement/HtmlTemplate/JsObject.');
@@ -1263,12 +737,16 @@
   }
 }
 
+// TODO(jacobr): we shouldn't be generating this call in the dart:html
+// bindings but we are.
+_convertDartToNative_EventTarget(target) => target;
+
 @Deprecated("Internal Use Only")
 Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
   var result = new Map();
   var keys = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object'), 'keys', [jsObject]);
   for (var key in keys) {
-    result[key] = wrap_jso(js.JsNative.getProperty(jsObject, key));
+    result[key] = js.JsNative.getProperty(jsObject, key);
   }
   return result;
 }
@@ -1277,25 +755,7 @@
  * Upgrade the JS HTMLElement to the Dart class.  Used by Dart's Polymer.
  */
 _createCustomUpgrader(Type customElementClass, $this) {
-  var dartClass;
-  try {
-    dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
-  } catch (e) {
-    // Did the dartClass get allocated but the created failed?  Otherwise, other
-    // components inside of this failed somewhere (could be JS custom element).
-    if (dartClass != null) {
-      // Yes, mark as didn't upgrade.
-      dartClass._badUpgrade();
-    }
-    throw e;
-  } finally {
-    // Need to remember the Dart class that was created for this custom so
-    // return it and setup the blink_jsObject to the $this that we'll be working
-    // with as we talk to blink.
-    js.setDartHtmlWrapperFor($this, dartClass);
-  }
-
-  return dartClass;
+  return _blink.Blink_Utils.setInstanceInterceptor($this, customElementClass, customElement: true);
 }
 
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -1347,11 +807,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AnchorElement internalCreateAnchorElement() {
-    return new AnchorElement._internalWrap();
-  }
-
-  external factory AnchorElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnchorElement.internal_() : super.internal_();
@@ -1365,137 +821,137 @@
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  String get download => _blink.BlinkHTMLAnchorElement.instance.download_Getter_(unwrap_jso(this));
+  String get download => _blink.BlinkHTMLAnchorElement.instance.download_Getter_(this);
   
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  set download(String value) => _blink.BlinkHTMLAnchorElement.instance.download_Setter_(unwrap_jso(this), value);
+  set download(String value) => _blink.BlinkHTMLAnchorElement.instance.download_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.BlinkHTMLAnchorElement.instance.hreflang_Getter_(unwrap_jso(this));
+  String get hreflang => _blink.BlinkHTMLAnchorElement.instance.hreflang_Getter_(this);
   
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  set hreflang(String value) => _blink.BlinkHTMLAnchorElement.instance.hreflang_Setter_(unwrap_jso(this), value);
+  set hreflang(String value) => _blink.BlinkHTMLAnchorElement.instance.hreflang_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  String get rel => _blink.BlinkHTMLAnchorElement.instance.rel_Getter_(unwrap_jso(this));
+  String get rel => _blink.BlinkHTMLAnchorElement.instance.rel_Getter_(this);
   
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  set rel(String value) => _blink.BlinkHTMLAnchorElement.instance.rel_Setter_(unwrap_jso(this), value);
+  set rel(String value) => _blink.BlinkHTMLAnchorElement.instance.rel_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLAnchorElement.instance.target_Getter_(unwrap_jso(this));
+  String get target => _blink.BlinkHTMLAnchorElement.instance.target_Getter_(this);
   
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  set target(String value) => _blink.BlinkHTMLAnchorElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLAnchorElement.instance.target_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLAnchorElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLAnchorElement.instance.type_Getter_(this);
   
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLAnchorElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLAnchorElement.instance.type_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  String get hash => _blink.BlinkHTMLAnchorElement.instance.hash_Getter_(unwrap_jso(this));
+  String get hash => _blink.BlinkHTMLAnchorElement.instance.hash_Getter_(this);
   
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  set hash(String value) => _blink.BlinkHTMLAnchorElement.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkHTMLAnchorElement.instance.hash_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  String get host => _blink.BlinkHTMLAnchorElement.instance.host_Getter_(unwrap_jso(this));
+  String get host => _blink.BlinkHTMLAnchorElement.instance.host_Getter_(this);
   
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  set host(String value) => _blink.BlinkHTMLAnchorElement.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkHTMLAnchorElement.instance.host_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.BlinkHTMLAnchorElement.instance.hostname_Getter_(unwrap_jso(this));
+  String get hostname => _blink.BlinkHTMLAnchorElement.instance.hostname_Getter_(this);
   
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  set hostname(String value) => _blink.BlinkHTMLAnchorElement.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkHTMLAnchorElement.instance.hostname_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLAnchorElement.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkHTMLAnchorElement.instance.href_Getter_(this);
   
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  set href(String value) => _blink.BlinkHTMLAnchorElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLAnchorElement.instance.href_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable()
   // WebKit only
   @Experimental() // non-standard
-  String get origin => _blink.BlinkHTMLAnchorElement.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkHTMLAnchorElement.instance.origin_Getter_(this);
   
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkHTMLAnchorElement.instance.password_Getter_(unwrap_jso(this));
+  String get password => _blink.BlinkHTMLAnchorElement.instance.password_Getter_(this);
   
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  set password(String value) => _blink.BlinkHTMLAnchorElement.instance.password_Setter_(unwrap_jso(this), value);
+  set password(String value) => _blink.BlinkHTMLAnchorElement.instance.password_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.BlinkHTMLAnchorElement.instance.pathname_Getter_(unwrap_jso(this));
+  String get pathname => _blink.BlinkHTMLAnchorElement.instance.pathname_Getter_(this);
   
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  set pathname(String value) => _blink.BlinkHTMLAnchorElement.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkHTMLAnchorElement.instance.pathname_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  String get port => _blink.BlinkHTMLAnchorElement.instance.port_Getter_(unwrap_jso(this));
+  String get port => _blink.BlinkHTMLAnchorElement.instance.port_Getter_(this);
   
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  set port(String value) => _blink.BlinkHTMLAnchorElement.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkHTMLAnchorElement.instance.port_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkHTMLAnchorElement.instance.protocol_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkHTMLAnchorElement.instance.protocol_Getter_(this);
   
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  set protocol(String value) => _blink.BlinkHTMLAnchorElement.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkHTMLAnchorElement.instance.protocol_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  String get search => _blink.BlinkHTMLAnchorElement.instance.search_Getter_(unwrap_jso(this));
+  String get search => _blink.BlinkHTMLAnchorElement.instance.search_Getter_(this);
   
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  set search(String value) => _blink.BlinkHTMLAnchorElement.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkHTMLAnchorElement.instance.search_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.BlinkHTMLAnchorElement.instance.username_Getter_(unwrap_jso(this));
+  String get username => _blink.BlinkHTMLAnchorElement.instance.username_Getter_(this);
   
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  set username(String value) => _blink.BlinkHTMLAnchorElement.instance.username_Setter_(unwrap_jso(this), value);
+  set username(String value) => _blink.BlinkHTMLAnchorElement.instance.username_Setter_(this, value);
   
   @DomName('HTMLAnchorElement.toString')
   @DocsEditable()
-  String toString() => _blink.BlinkHTMLAnchorElement.instance.toString_Callback_0_(unwrap_jso(this));
+  String toString() => _blink.BlinkHTMLAnchorElement.instance.toString_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1514,11 +970,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Animation internalCreateAnimation() {
-    return new Animation._internalWrap();
-  }
-
-  external factory Animation._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Animation.internal_() : super.internal_();
@@ -1530,102 +982,102 @@
   @DomName('Animation.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get currentTime => _blink.BlinkAnimation.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkAnimation.instance.currentTime_Getter_(this);
   
   @DomName('Animation.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  set currentTime(num value) => _blink.BlinkAnimation.instance.currentTime_Setter_(unwrap_jso(this), value);
+  set currentTime(num value) => _blink.BlinkAnimation.instance.currentTime_Setter_(this, value);
   
   @DomName('Animation.effect')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationEffectReadOnly get effect => wrap_jso(_blink.BlinkAnimation.instance.effect_Getter_(unwrap_jso(this)));
+  AnimationEffectReadOnly get effect => _blink.BlinkAnimation.instance.effect_Getter_(this);
   
   @DomName('Animation.effect')
   @DocsEditable()
   @Experimental() // untriaged
-  set effect(AnimationEffectReadOnly value) => _blink.BlinkAnimation.instance.effect_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set effect(AnimationEffectReadOnly value) => _blink.BlinkAnimation.instance.effect_Setter_(this, value);
   
   @DomName('Animation.endClip')
   @DocsEditable()
   @Experimental() // untriaged
-  num get endClip => _blink.BlinkAnimation.instance.endClip_Getter_(unwrap_jso(this));
+  num get endClip => _blink.BlinkAnimation.instance.endClip_Getter_(this);
   
   @DomName('Animation.endClip')
   @DocsEditable()
   @Experimental() // untriaged
-  set endClip(num value) => _blink.BlinkAnimation.instance.endClip_Setter_(unwrap_jso(this), value);
+  set endClip(num value) => _blink.BlinkAnimation.instance.endClip_Setter_(this, value);
   
   @DomName('Animation.finished')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get finished => wrap_jso(_blink.BlinkAnimation.instance.finished_Getter_(unwrap_jso(this)));
+  Future get finished => convertNativePromiseToDartFuture(_blink.BlinkAnimation.instance.finished_Getter_(this));
   
   @DomName('Animation.playState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get playState => _blink.BlinkAnimation.instance.playState_Getter_(unwrap_jso(this));
+  String get playState => _blink.BlinkAnimation.instance.playState_Getter_(this);
   
   @DomName('Animation.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkAnimation.instance.playbackRate_Getter_(unwrap_jso(this));
+  num get playbackRate => _blink.BlinkAnimation.instance.playbackRate_Getter_(this);
   
   @DomName('Animation.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  set playbackRate(num value) => _blink.BlinkAnimation.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkAnimation.instance.playbackRate_Setter_(this, value);
   
   @DomName('Animation.ready')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get ready => wrap_jso(_blink.BlinkAnimation.instance.ready_Getter_(unwrap_jso(this)));
+  Future get ready => convertNativePromiseToDartFuture(_blink.BlinkAnimation.instance.ready_Getter_(this));
   
   @DomName('Animation.startClip')
   @DocsEditable()
   @Experimental() // untriaged
-  num get startClip => _blink.BlinkAnimation.instance.startClip_Getter_(unwrap_jso(this));
+  num get startClip => _blink.BlinkAnimation.instance.startClip_Getter_(this);
   
   @DomName('Animation.startClip')
   @DocsEditable()
   @Experimental() // untriaged
-  set startClip(num value) => _blink.BlinkAnimation.instance.startClip_Setter_(unwrap_jso(this), value);
+  set startClip(num value) => _blink.BlinkAnimation.instance.startClip_Setter_(this, value);
   
   @DomName('Animation.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get startTime => _blink.BlinkAnimation.instance.startTime_Getter_(unwrap_jso(this));
+  num get startTime => _blink.BlinkAnimation.instance.startTime_Getter_(this);
   
   @DomName('Animation.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  set startTime(num value) => _blink.BlinkAnimation.instance.startTime_Setter_(unwrap_jso(this), value);
+  set startTime(num value) => _blink.BlinkAnimation.instance.startTime_Setter_(this, value);
   
   @DomName('Animation.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancel() => _blink.BlinkAnimation.instance.cancel_Callback_0_(unwrap_jso(this));
+  void cancel() => _blink.BlinkAnimation.instance.cancel_Callback_0_(this);
   
   @DomName('Animation.finish')
   @DocsEditable()
   @Experimental() // untriaged
-  void finish() => _blink.BlinkAnimation.instance.finish_Callback_0_(unwrap_jso(this));
+  void finish() => _blink.BlinkAnimation.instance.finish_Callback_0_(this);
   
   @DomName('Animation.pause')
   @DocsEditable()
   @Experimental() // untriaged
-  void pause() => _blink.BlinkAnimation.instance.pause_Callback_0_(unwrap_jso(this));
+  void pause() => _blink.BlinkAnimation.instance.pause_Callback_0_(this);
   
   @DomName('Animation.play')
   @DocsEditable()
   @Experimental() // untriaged
-  void play() => _blink.BlinkAnimation.instance.play_Callback_0_(unwrap_jso(this));
+  void play() => _blink.BlinkAnimation.instance.play_Callback_0_(this);
   
   @DomName('Animation.reverse')
   @DocsEditable()
   @Experimental() // untriaged
-  void reverse() => _blink.BlinkAnimation.instance.reverse_Callback_0_(unwrap_jso(this));
+  void reverse() => _blink.BlinkAnimation.instance.reverse_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1642,30 +1094,22 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationEffectReadOnly._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimationEffectReadOnly internalCreateAnimationEffectReadOnly() {
-    return new AnimationEffectReadOnly._internalWrap();
-  }
 
-  factory AnimationEffectReadOnly._internalWrap() {
-    return new AnimationEffectReadOnly.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimationEffectReadOnly.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AnimationEffectReadOnly.computedTiming')
   @DocsEditable()
   @Experimental() // untriaged
-   get computedTiming => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkAnimationEffectReadOnly.instance.computedTiming_Getter_(unwrap_jso(this))));
+   get computedTiming => convertNativeDictionaryToDartDictionary((_blink.BlinkAnimationEffectReadOnly.instance.computedTiming_Getter_(this)));
   
   @DomName('AnimationEffectReadOnly.timing')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationEffectTiming get timing => wrap_jso(_blink.BlinkAnimationEffectReadOnly.instance.timing_Getter_(unwrap_jso(this)));
+  AnimationEffectTiming get timing => _blink.BlinkAnimationEffectReadOnly.instance.timing_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1682,110 +1126,102 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationEffectTiming._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimationEffectTiming internalCreateAnimationEffectTiming() {
-    return new AnimationEffectTiming._internalWrap();
-  }
 
-  factory AnimationEffectTiming._internalWrap() {
-    return new AnimationEffectTiming.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimationEffectTiming.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AnimationEffectTiming.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get delay => _blink.BlinkAnimationEffectTiming.instance.delay_Getter_(unwrap_jso(this));
+  num get delay => _blink.BlinkAnimationEffectTiming.instance.delay_Getter_(this);
   
   @DomName('AnimationEffectTiming.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  set delay(num value) => _blink.BlinkAnimationEffectTiming.instance.delay_Setter_(unwrap_jso(this), value);
+  set delay(num value) => _blink.BlinkAnimationEffectTiming.instance.delay_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  String get direction => _blink.BlinkAnimationEffectTiming.instance.direction_Getter_(unwrap_jso(this));
+  String get direction => _blink.BlinkAnimationEffectTiming.instance.direction_Getter_(this);
   
   @DomName('AnimationEffectTiming.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  set direction(String value) => _blink.BlinkAnimationEffectTiming.instance.direction_Setter_(unwrap_jso(this), value);
+  set direction(String value) => _blink.BlinkAnimationEffectTiming.instance.direction_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.duration')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get duration => wrap_jso(_blink.BlinkAnimationEffectTiming.instance.duration_Getter_(unwrap_jso(this)));
+  Object get duration => (_blink.BlinkAnimationEffectTiming.instance.duration_Getter_(this));
   
   @DomName('AnimationEffectTiming.duration')
   @DocsEditable()
   @Experimental() // untriaged
-  set duration(Object value) => _blink.BlinkAnimationEffectTiming.instance.duration_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set duration(Object value) => _blink.BlinkAnimationEffectTiming.instance.duration_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get easing => _blink.BlinkAnimationEffectTiming.instance.easing_Getter_(unwrap_jso(this));
+  String get easing => _blink.BlinkAnimationEffectTiming.instance.easing_Getter_(this);
   
   @DomName('AnimationEffectTiming.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  set easing(String value) => _blink.BlinkAnimationEffectTiming.instance.easing_Setter_(unwrap_jso(this), value);
+  set easing(String value) => _blink.BlinkAnimationEffectTiming.instance.easing_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get endDelay => _blink.BlinkAnimationEffectTiming.instance.endDelay_Getter_(unwrap_jso(this));
+  num get endDelay => _blink.BlinkAnimationEffectTiming.instance.endDelay_Getter_(this);
   
   @DomName('AnimationEffectTiming.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  set endDelay(num value) => _blink.BlinkAnimationEffectTiming.instance.endDelay_Setter_(unwrap_jso(this), value);
+  set endDelay(num value) => _blink.BlinkAnimationEffectTiming.instance.endDelay_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  String get fill => _blink.BlinkAnimationEffectTiming.instance.fill_Getter_(unwrap_jso(this));
+  String get fill => _blink.BlinkAnimationEffectTiming.instance.fill_Getter_(this);
   
   @DomName('AnimationEffectTiming.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  set fill(String value) => _blink.BlinkAnimationEffectTiming.instance.fill_Setter_(unwrap_jso(this), value);
+  set fill(String value) => _blink.BlinkAnimationEffectTiming.instance.fill_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterationStart => _blink.BlinkAnimationEffectTiming.instance.iterationStart_Getter_(unwrap_jso(this));
+  num get iterationStart => _blink.BlinkAnimationEffectTiming.instance.iterationStart_Getter_(this);
   
   @DomName('AnimationEffectTiming.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  set iterationStart(num value) => _blink.BlinkAnimationEffectTiming.instance.iterationStart_Setter_(unwrap_jso(this), value);
+  set iterationStart(num value) => _blink.BlinkAnimationEffectTiming.instance.iterationStart_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterations => _blink.BlinkAnimationEffectTiming.instance.iterations_Getter_(unwrap_jso(this));
+  num get iterations => _blink.BlinkAnimationEffectTiming.instance.iterations_Getter_(this);
   
   @DomName('AnimationEffectTiming.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  set iterations(num value) => _blink.BlinkAnimationEffectTiming.instance.iterations_Setter_(unwrap_jso(this), value);
+  set iterations(num value) => _blink.BlinkAnimationEffectTiming.instance.iterations_Setter_(this, value);
   
   @DomName('AnimationEffectTiming.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkAnimationEffectTiming.instance.playbackRate_Getter_(unwrap_jso(this));
+  num get playbackRate => _blink.BlinkAnimationEffectTiming.instance.playbackRate_Getter_(this);
   
   @DomName('AnimationEffectTiming.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  set playbackRate(num value) => _blink.BlinkAnimationEffectTiming.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkAnimationEffectTiming.instance.playbackRate_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1807,18 +1243,14 @@
   factory AnimationEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkAnimationEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkAnimationEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkAnimationEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkAnimationEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static AnimationEvent internalCreateAnimationEvent() {
-    return new AnimationEvent._internalWrap();
-  }
-
-  external factory AnimationEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimationEvent.internal_() : super.internal_();
@@ -1827,12 +1259,12 @@
   @DomName('AnimationEvent.animationName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get animationName => _blink.BlinkAnimationEvent.instance.animationName_Getter_(unwrap_jso(this));
+  String get animationName => _blink.BlinkAnimationEvent.instance.animationName_Getter_(this);
   
   @DomName('AnimationEvent.elapsedTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get elapsedTime => _blink.BlinkAnimationEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
+  num get elapsedTime => _blink.BlinkAnimationEvent.instance.elapsedTime_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1854,18 +1286,14 @@
   factory AnimationPlayerEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkAnimationPlayerEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkAnimationPlayerEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkAnimationPlayerEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkAnimationPlayerEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static AnimationPlayerEvent internalCreateAnimationPlayerEvent() {
-    return new AnimationPlayerEvent._internalWrap();
-  }
-
-  external factory AnimationPlayerEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimationPlayerEvent.internal_() : super.internal_();
@@ -1874,12 +1302,12 @@
   @DomName('AnimationPlayerEvent.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get currentTime => _blink.BlinkAnimationPlayerEvent.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkAnimationPlayerEvent.instance.currentTime_Getter_(this);
   
   @DomName('AnimationPlayerEvent.timelineTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get timelineTime => _blink.BlinkAnimationPlayerEvent.instance.timelineTime_Getter_(unwrap_jso(this));
+  num get timelineTime => _blink.BlinkAnimationPlayerEvent.instance.timelineTime_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1896,50 +1324,42 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationTimeline._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimationTimeline internalCreateAnimationTimeline() {
-    return new AnimationTimeline._internalWrap();
-  }
 
-  factory AnimationTimeline._internalWrap() {
-    return new AnimationTimeline.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimationTimeline.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get currentTime => _blink.BlinkAnimationTimeline.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkAnimationTimeline.instance.currentTime_Getter_(this);
   
   @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  set currentTime(num value) => _blink.BlinkAnimationTimeline.instance.currentTime_Setter_(unwrap_jso(this), value);
+  set currentTime(num value) => _blink.BlinkAnimationTimeline.instance.currentTime_Setter_(this, value);
   
   @DomName('AnimationTimeline.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkAnimationTimeline.instance.playbackRate_Getter_(unwrap_jso(this));
+  num get playbackRate => _blink.BlinkAnimationTimeline.instance.playbackRate_Getter_(this);
   
   @DomName('AnimationTimeline.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  set playbackRate(num value) => _blink.BlinkAnimationTimeline.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkAnimationTimeline.instance.playbackRate_Setter_(this, value);
   
   @DomName('AnimationTimeline.getAnimations')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Animation> getAnimations() => wrap_jso(_blink.BlinkAnimationTimeline.instance.getAnimations_Callback_0_(unwrap_jso(this)));
+  List<Animation> getAnimations() => (_blink.BlinkAnimationTimeline.instance.getAnimations_Callback_0_(this));
   
   @DomName('AnimationTimeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  Animation play(AnimationEffectReadOnly source) => wrap_jso(_blink.BlinkAnimationTimeline.instance.play_Callback_1_(unwrap_jso(this), unwrap_jso(source)));
+  Animation play(AnimationEffectReadOnly source) => _blink.BlinkAnimationTimeline.instance.play_Callback_1_(this, source);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1956,30 +1376,22 @@
   // To suppress missing implicit constructor warnings.
   factory AppBannerPromptResult._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AppBannerPromptResult internalCreateAppBannerPromptResult() {
-    return new AppBannerPromptResult._internalWrap();
-  }
 
-  factory AppBannerPromptResult._internalWrap() {
-    return new AppBannerPromptResult.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AppBannerPromptResult.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AppBannerPromptResult.outcome')
   @DocsEditable()
   @Experimental() // untriaged
-  String get outcome => _blink.BlinkAppBannerPromptResult.instance.outcome_Getter_(unwrap_jso(this));
+  String get outcome => _blink.BlinkAppBannerPromptResult.instance.outcome_Getter_(this);
   
   @DomName('AppBannerPromptResult.platform')
   @DocsEditable()
   @Experimental() // untriaged
-  String get platform => _blink.BlinkAppBannerPromptResult.instance.platform_Getter_(unwrap_jso(this));
+  String get platform => _blink.BlinkAppBannerPromptResult.instance.platform_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2086,11 +1498,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ApplicationCache internalCreateApplicationCache() {
-    return new ApplicationCache._internalWrap();
-  }
-
-  external factory ApplicationCache._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ApplicationCache.internal_() : super.internal_();
@@ -2125,19 +1533,19 @@
 
   @DomName('ApplicationCache.status')
   @DocsEditable()
-  int get status => _blink.BlinkApplicationCache.instance.status_Getter_(unwrap_jso(this));
+  int get status => _blink.BlinkApplicationCache.instance.status_Getter_(this);
   
   @DomName('ApplicationCache.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkApplicationCache.instance.abort_Callback_0_(unwrap_jso(this));
+  void abort() => _blink.BlinkApplicationCache.instance.abort_Callback_0_(this);
   
   @DomName('ApplicationCache.swapCache')
   @DocsEditable()
-  void swapCache() => _blink.BlinkApplicationCache.instance.swapCache_Callback_0_(unwrap_jso(this));
+  void swapCache() => _blink.BlinkApplicationCache.instance.swapCache_Callback_0_(this);
   
   @DomName('ApplicationCache.update')
   @DocsEditable()
-  void update() => _blink.BlinkApplicationCache.instance.update_Callback_0_(unwrap_jso(this));
+  void update() => _blink.BlinkApplicationCache.instance.update_Callback_0_(this);
   
   /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
@@ -2199,18 +1607,14 @@
   factory ApplicationCacheErrorEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkApplicationCacheErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkApplicationCacheErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkApplicationCacheErrorEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkApplicationCacheErrorEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static ApplicationCacheErrorEvent internalCreateApplicationCacheErrorEvent() {
-    return new ApplicationCacheErrorEvent._internalWrap();
-  }
-
-  external factory ApplicationCacheErrorEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ApplicationCacheErrorEvent.internal_() : super.internal_();
@@ -2219,22 +1623,22 @@
   @DomName('ApplicationCacheErrorEvent.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message => _blink.BlinkApplicationCacheErrorEvent.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkApplicationCacheErrorEvent.instance.message_Getter_(this);
   
   @DomName('ApplicationCacheErrorEvent.reason')
   @DocsEditable()
   @Experimental() // untriaged
-  String get reason => _blink.BlinkApplicationCacheErrorEvent.instance.reason_Getter_(unwrap_jso(this));
+  String get reason => _blink.BlinkApplicationCacheErrorEvent.instance.reason_Getter_(this);
   
   @DomName('ApplicationCacheErrorEvent.status')
   @DocsEditable()
   @Experimental() // untriaged
-  int get status => _blink.BlinkApplicationCacheErrorEvent.instance.status_Getter_(unwrap_jso(this));
+  int get status => _blink.BlinkApplicationCacheErrorEvent.instance.status_Getter_(this);
   
   @DomName('ApplicationCacheErrorEvent.url')
   @DocsEditable()
   @Experimental() // untriaged
-  String get url => _blink.BlinkApplicationCacheErrorEvent.instance.url_Getter_(unwrap_jso(this));
+  String get url => _blink.BlinkApplicationCacheErrorEvent.instance.url_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2266,11 +1670,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AreaElement internalCreateAreaElement() {
-    return new AreaElement._internalWrap();
-  }
-
-  external factory AreaElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AreaElement.internal_() : super.internal_();
@@ -2284,129 +1684,129 @@
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  String get alt => _blink.BlinkHTMLAreaElement.instance.alt_Getter_(unwrap_jso(this));
+  String get alt => _blink.BlinkHTMLAreaElement.instance.alt_Getter_(this);
   
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  set alt(String value) => _blink.BlinkHTMLAreaElement.instance.alt_Setter_(unwrap_jso(this), value);
+  set alt(String value) => _blink.BlinkHTMLAreaElement.instance.alt_Setter_(this, value);
   
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  String get coords => _blink.BlinkHTMLAreaElement.instance.coords_Getter_(unwrap_jso(this));
+  String get coords => _blink.BlinkHTMLAreaElement.instance.coords_Getter_(this);
   
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  set coords(String value) => _blink.BlinkHTMLAreaElement.instance.coords_Setter_(unwrap_jso(this), value);
+  set coords(String value) => _blink.BlinkHTMLAreaElement.instance.coords_Setter_(this, value);
   
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  String get shape => _blink.BlinkHTMLAreaElement.instance.shape_Getter_(unwrap_jso(this));
+  String get shape => _blink.BlinkHTMLAreaElement.instance.shape_Getter_(this);
   
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  set shape(String value) => _blink.BlinkHTMLAreaElement.instance.shape_Setter_(unwrap_jso(this), value);
+  set shape(String value) => _blink.BlinkHTMLAreaElement.instance.shape_Setter_(this, value);
   
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLAreaElement.instance.target_Getter_(unwrap_jso(this));
+  String get target => _blink.BlinkHTMLAreaElement.instance.target_Getter_(this);
   
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  set target(String value) => _blink.BlinkHTMLAreaElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLAreaElement.instance.target_Setter_(this, value);
   
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  String get hash => _blink.BlinkHTMLAreaElement.instance.hash_Getter_(unwrap_jso(this));
+  String get hash => _blink.BlinkHTMLAreaElement.instance.hash_Getter_(this);
   
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  set hash(String value) => _blink.BlinkHTMLAreaElement.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkHTMLAreaElement.instance.hash_Setter_(this, value);
   
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  String get host => _blink.BlinkHTMLAreaElement.instance.host_Getter_(unwrap_jso(this));
+  String get host => _blink.BlinkHTMLAreaElement.instance.host_Getter_(this);
   
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  set host(String value) => _blink.BlinkHTMLAreaElement.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkHTMLAreaElement.instance.host_Setter_(this, value);
   
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.BlinkHTMLAreaElement.instance.hostname_Getter_(unwrap_jso(this));
+  String get hostname => _blink.BlinkHTMLAreaElement.instance.hostname_Getter_(this);
   
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  set hostname(String value) => _blink.BlinkHTMLAreaElement.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkHTMLAreaElement.instance.hostname_Setter_(this, value);
   
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLAreaElement.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkHTMLAreaElement.instance.href_Getter_(this);
   
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  set href(String value) => _blink.BlinkHTMLAreaElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLAreaElement.instance.href_Setter_(this, value);
   
   @DomName('HTMLAreaElement.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkHTMLAreaElement.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkHTMLAreaElement.instance.origin_Getter_(this);
   
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkHTMLAreaElement.instance.password_Getter_(unwrap_jso(this));
+  String get password => _blink.BlinkHTMLAreaElement.instance.password_Getter_(this);
   
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  set password(String value) => _blink.BlinkHTMLAreaElement.instance.password_Setter_(unwrap_jso(this), value);
+  set password(String value) => _blink.BlinkHTMLAreaElement.instance.password_Setter_(this, value);
   
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.BlinkHTMLAreaElement.instance.pathname_Getter_(unwrap_jso(this));
+  String get pathname => _blink.BlinkHTMLAreaElement.instance.pathname_Getter_(this);
   
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  set pathname(String value) => _blink.BlinkHTMLAreaElement.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkHTMLAreaElement.instance.pathname_Setter_(this, value);
   
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  String get port => _blink.BlinkHTMLAreaElement.instance.port_Getter_(unwrap_jso(this));
+  String get port => _blink.BlinkHTMLAreaElement.instance.port_Getter_(this);
   
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  set port(String value) => _blink.BlinkHTMLAreaElement.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkHTMLAreaElement.instance.port_Setter_(this, value);
   
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkHTMLAreaElement.instance.protocol_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkHTMLAreaElement.instance.protocol_Getter_(this);
   
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  set protocol(String value) => _blink.BlinkHTMLAreaElement.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkHTMLAreaElement.instance.protocol_Setter_(this, value);
   
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  String get search => _blink.BlinkHTMLAreaElement.instance.search_Getter_(unwrap_jso(this));
+  String get search => _blink.BlinkHTMLAreaElement.instance.search_Getter_(this);
   
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  set search(String value) => _blink.BlinkHTMLAreaElement.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkHTMLAreaElement.instance.search_Setter_(this, value);
   
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.BlinkHTMLAreaElement.instance.username_Getter_(unwrap_jso(this));
+  String get username => _blink.BlinkHTMLAreaElement.instance.username_Getter_(this);
   
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  set username(String value) => _blink.BlinkHTMLAreaElement.instance.username_Setter_(unwrap_jso(this), value);
+  set username(String value) => _blink.BlinkHTMLAreaElement.instance.username_Setter_(this, value);
   
   @DomName('HTMLAreaElement.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.BlinkHTMLAreaElement.instance.toString_Callback_0_(unwrap_jso(this));
+  String toString() => _blink.BlinkHTMLAreaElement.instance.toString_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2421,16 +1821,12 @@
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
   factory AudioElement._([String src]) {
-    return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src));
+    return _blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src);
   }
 
 
   @Deprecated("Internal Use Only")
-  static AudioElement internalCreateAudioElement() {
-    return new AudioElement._internalWrap();
-  }
-
-  external factory AudioElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioElement.internal_() : super.internal_();
@@ -2444,9 +1840,9 @@
 
   factory AudioElement([String src]) {
     if (src == null)
-      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_0_());
+      return _blink.BlinkHTMLAudioElement.instance.constructorCallback_0_();
     else
-      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src));
+      return _blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src);
   }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2463,50 +1859,42 @@
   // To suppress missing implicit constructor warnings.
   factory AudioTrack._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AudioTrack internalCreateAudioTrack() {
-    return new AudioTrack._internalWrap();
-  }
 
-  factory AudioTrack._internalWrap() {
-    return new AudioTrack.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioTrack.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AudioTrack.enabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get enabled => _blink.BlinkAudioTrack.instance.enabled_Getter_(unwrap_jso(this));
+  bool get enabled => _blink.BlinkAudioTrack.instance.enabled_Getter_(this);
   
   @DomName('AudioTrack.enabled')
   @DocsEditable()
   @Experimental() // untriaged
-  set enabled(bool value) => _blink.BlinkAudioTrack.instance.enabled_Setter_(unwrap_jso(this), value);
+  set enabled(bool value) => _blink.BlinkAudioTrack.instance.enabled_Setter_(this, value);
   
   @DomName('AudioTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkAudioTrack.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkAudioTrack.instance.id_Getter_(this);
   
   @DomName('AudioTrack.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkAudioTrack.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkAudioTrack.instance.kind_Getter_(this);
   
   @DomName('AudioTrack.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkAudioTrack.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkAudioTrack.instance.label_Getter_(this);
   
   @DomName('AudioTrack.language')
   @DocsEditable()
   @Experimental() // untriaged
-  String get language => _blink.BlinkAudioTrack.instance.language_Getter_(unwrap_jso(this));
+  String get language => _blink.BlinkAudioTrack.instance.language_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2530,11 +1918,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AudioTrackList internalCreateAudioTrackList() {
-    return new AudioTrackList._internalWrap();
-  }
-
-  external factory AudioTrackList._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioTrackList.internal_() : super.internal_();
@@ -2543,17 +1927,17 @@
   @DomName('AudioTrackList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkAudioTrackList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkAudioTrackList.instance.length_Getter_(this);
   
   @DomName('AudioTrackList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrack __getter__(int index) => wrap_jso(_blink.BlinkAudioTrackList.instance.$__getter___Callback_1_(unwrap_jso(this), index));
+  AudioTrack __getter__(int index) => _blink.BlinkAudioTrackList.instance.$__getter___Callback_1_(this, index);
   
   @DomName('AudioTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrack getTrackById(String id) => wrap_jso(_blink.BlinkAudioTrackList.instance.getTrackById_Callback_1_(unwrap_jso(this), id));
+  AudioTrack getTrackById(String id) => _blink.BlinkAudioTrackList.instance.getTrackById_Callback_1_(this, id);
   
   @DomName('AudioTrackList.onchange')
   @DocsEditable()
@@ -2581,18 +1965,14 @@
   factory AutocompleteErrorEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkAutocompleteErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkAutocompleteErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkAutocompleteErrorEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkAutocompleteErrorEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static AutocompleteErrorEvent internalCreateAutocompleteErrorEvent() {
-    return new AutocompleteErrorEvent._internalWrap();
-  }
-
-  external factory AutocompleteErrorEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AutocompleteErrorEvent.internal_() : super.internal_();
@@ -2600,7 +1980,7 @@
 
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
-  String get reason => _blink.BlinkAutocompleteErrorEvent.instance.reason_Getter_(unwrap_jso(this));
+  String get reason => _blink.BlinkAutocompleteErrorEvent.instance.reason_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2622,11 +2002,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static BRElement internalCreateBRElement() {
-    return new BRElement._internalWrap();
-  }
-
-  external factory BRElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BRElement.internal_() : super.internal_();
@@ -2654,24 +2030,16 @@
   // To suppress missing implicit constructor warnings.
   factory BarProp._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static BarProp internalCreateBarProp() {
-    return new BarProp._internalWrap();
-  }
 
-  factory BarProp._internalWrap() {
-    return new BarProp.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BarProp.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('BarProp.visible')
   @DocsEditable()
-  bool get visible => _blink.BlinkBarProp.instance.visible_Getter_(unwrap_jso(this));
+  bool get visible => _blink.BlinkBarProp.instance.visible_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2693,11 +2061,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static BaseElement internalCreateBaseElement() {
-    return new BaseElement._internalWrap();
-  }
-
-  external factory BaseElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BaseElement.internal_() : super.internal_();
@@ -2711,19 +2075,19 @@
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLBaseElement.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkHTMLBaseElement.instance.href_Getter_(this);
   
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  set href(String value) => _blink.BlinkHTMLBaseElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLBaseElement.instance.href_Setter_(this, value);
   
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLBaseElement.instance.target_Getter_(unwrap_jso(this));
+  String get target => _blink.BlinkHTMLBaseElement.instance.target_Getter_(this);
   
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  set target(String value) => _blink.BlinkHTMLBaseElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLBaseElement.instance.target_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2743,11 +2107,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static BatteryManager internalCreateBatteryManager() {
-    return new BatteryManager._internalWrap();
-  }
-
-  external factory BatteryManager._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BatteryManager.internal_() : super.internal_();
@@ -2755,19 +2115,19 @@
 
   @DomName('BatteryManager.charging')
   @DocsEditable()
-  bool get charging => _blink.BlinkBatteryManager.instance.charging_Getter_(unwrap_jso(this));
+  bool get charging => _blink.BlinkBatteryManager.instance.charging_Getter_(this);
   
   @DomName('BatteryManager.chargingTime')
   @DocsEditable()
-  num get chargingTime => _blink.BlinkBatteryManager.instance.chargingTime_Getter_(unwrap_jso(this));
+  num get chargingTime => _blink.BlinkBatteryManager.instance.chargingTime_Getter_(this);
   
   @DomName('BatteryManager.dischargingTime')
   @DocsEditable()
-  num get dischargingTime => _blink.BlinkBatteryManager.instance.dischargingTime_Getter_(unwrap_jso(this));
+  num get dischargingTime => _blink.BlinkBatteryManager.instance.dischargingTime_Getter_(this);
   
   @DomName('BatteryManager.level')
   @DocsEditable()
-  num get level => _blink.BlinkBatteryManager.instance.level_Getter_(unwrap_jso(this));
+  num get level => _blink.BlinkBatteryManager.instance.level_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2789,18 +2149,14 @@
   factory BeforeInstallPromptEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkBeforeInstallPromptEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkBeforeInstallPromptEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static BeforeInstallPromptEvent internalCreateBeforeInstallPromptEvent() {
-    return new BeforeInstallPromptEvent._internalWrap();
-  }
-
-  external factory BeforeInstallPromptEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BeforeInstallPromptEvent.internal_() : super.internal_();
@@ -2809,17 +2165,17 @@
   @DomName('BeforeInstallPromptEvent.platforms')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get platforms => _blink.BlinkBeforeInstallPromptEvent.instance.platforms_Getter_(unwrap_jso(this));
+  List<String> get platforms => _blink.BlinkBeforeInstallPromptEvent.instance.platforms_Getter_(this);
   
   @DomName('BeforeInstallPromptEvent.userChoice')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get userChoice => wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.userChoice_Getter_(unwrap_jso(this)));
+  Future get userChoice => convertNativePromiseToDartFuture(_blink.BlinkBeforeInstallPromptEvent.instance.userChoice_Getter_(this));
   
   @DomName('BeforeInstallPromptEvent.prompt')
   @DocsEditable()
   @Experimental() // untriaged
-  Future prompt() => wrap_jso(_blink.BlinkBeforeInstallPromptEvent.instance.prompt_Callback_0_(unwrap_jso(this)));
+  Future prompt() => convertNativePromiseToDartFuture(_blink.BlinkBeforeInstallPromptEvent.instance.prompt_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2837,11 +2193,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static BeforeUnloadEvent internalCreateBeforeUnloadEvent() {
-    return new BeforeUnloadEvent._internalWrap();
-  }
-
-  external factory BeforeUnloadEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BeforeUnloadEvent.internal_() : super.internal_();
@@ -2849,11 +2201,11 @@
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  String get returnValue => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Getter_(unwrap_jso(this));
+  String get returnValue => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Getter_(this);
   
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Setter_(unwrap_jso(this), value);
+  set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2866,60 +2218,52 @@
   // To suppress missing implicit constructor warnings.
   factory Blob._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Blob internalCreateBlob() {
-    return new Blob._internalWrap();
-  }
 
-  factory Blob._internalWrap() {
-    return new Blob.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Blob.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Blob.size')
   @DocsEditable()
-  int get size => _blink.BlinkBlob.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkBlob.instance.size_Getter_(this);
   
   @DomName('Blob.type')
   @DocsEditable()
-  String get type => _blink.BlinkBlob.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkBlob.instance.type_Getter_(this);
   
   @DomName('Blob.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.BlinkBlob.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkBlob.instance.close_Callback_0_(this);
   
   Blob slice([int start, int end, String contentType]) {
     if (contentType != null) {
-      return wrap_jso(_blink.BlinkBlob.instance.slice_Callback_3_(unwrap_jso(this), start, end, contentType));
+      return _blink.BlinkBlob.instance.slice_Callback_3_(this, start, end, contentType);
     }
     if (end != null) {
-      return wrap_jso(_blink.BlinkBlob.instance.slice_Callback_2_(unwrap_jso(this), start, end));
+      return _blink.BlinkBlob.instance.slice_Callback_2_(this, start, end);
     }
     if (start != null) {
-      return wrap_jso(_blink.BlinkBlob.instance.slice_Callback_1_(unwrap_jso(this), start));
+      return _blink.BlinkBlob.instance.slice_Callback_1_(this, start);
     }
-    return wrap_jso(_blink.BlinkBlob.instance.slice_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkBlob.instance.slice_Callback_0_(this);
   }
 
   factory Blob(List blobParts, [String type, String endings]) {
     // TODO: any coercions on the elements of blobParts, e.g. coerce a typed
     // array to ArrayBuffer if it is a total view.
 
-    var parts = convertDartToNative_List(blobParts.map(unwrap_jso).toList());
+    var parts = convertDartToNative_List(blobParts);
     if (type == null && endings == null) {
-      return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_1_(parts));
+      return _blink.BlinkBlob.instance.constructorCallback_1_(parts);
     }
     var bag = {};
     if (type != null) bag['type'] = type;
     if (endings != null) bag['endings'] = endings;
-    return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_2_(parts,
-        convertDartToNative_Dictionary(bag)));
+    return _blink.BlinkBlob.instance.constructorCallback_2_(parts,
+        convertDartToNative_Dictionary(bag));
   }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2936,25 +2280,17 @@
   // To suppress missing implicit constructor warnings.
   factory Bluetooth._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Bluetooth internalCreateBluetooth() {
-    return new Bluetooth._internalWrap();
-  }
 
-  factory Bluetooth._internalWrap() {
-    return new Bluetooth.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Bluetooth.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Bluetooth.requestDevice')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestDevice(Map options) => wrap_jso(_blink.BlinkBluetooth.instance.requestDevice_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+  Future requestDevice(Map options) => convertNativePromiseToDartFuture(_blink.BlinkBluetooth.instance.requestDevice_Callback_1_(this, convertDartToNative_Dictionary(options)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2971,65 +2307,57 @@
   // To suppress missing implicit constructor warnings.
   factory BluetoothDevice._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static BluetoothDevice internalCreateBluetoothDevice() {
-    return new BluetoothDevice._internalWrap();
-  }
 
-  factory BluetoothDevice._internalWrap() {
-    return new BluetoothDevice.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BluetoothDevice.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('BluetoothDevice.deviceClass')
   @DocsEditable()
   @Experimental() // untriaged
-  int get deviceClass => _blink.BlinkBluetoothDevice.instance.deviceClass_Getter_(unwrap_jso(this));
+  int get deviceClass => _blink.BlinkBluetoothDevice.instance.deviceClass_Getter_(this);
   
   @DomName('BluetoothDevice.instanceID')
   @DocsEditable()
   @Experimental() // untriaged
-  String get instanceID => _blink.BlinkBluetoothDevice.instance.instanceID_Getter_(unwrap_jso(this));
+  String get instanceID => _blink.BlinkBluetoothDevice.instance.instanceID_Getter_(this);
   
   @DomName('BluetoothDevice.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkBluetoothDevice.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkBluetoothDevice.instance.name_Getter_(this);
   
   @DomName('BluetoothDevice.paired')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get paired => _blink.BlinkBluetoothDevice.instance.paired_Getter_(unwrap_jso(this));
+  bool get paired => _blink.BlinkBluetoothDevice.instance.paired_Getter_(this);
   
   @DomName('BluetoothDevice.productID')
   @DocsEditable()
   @Experimental() // untriaged
-  int get productID => _blink.BlinkBluetoothDevice.instance.productID_Getter_(unwrap_jso(this));
+  int get productID => _blink.BlinkBluetoothDevice.instance.productID_Getter_(this);
   
   @DomName('BluetoothDevice.productVersion')
   @DocsEditable()
   @Experimental() // untriaged
-  int get productVersion => _blink.BlinkBluetoothDevice.instance.productVersion_Getter_(unwrap_jso(this));
+  int get productVersion => _blink.BlinkBluetoothDevice.instance.productVersion_Getter_(this);
   
   @DomName('BluetoothDevice.vendorID')
   @DocsEditable()
   @Experimental() // untriaged
-  int get vendorID => _blink.BlinkBluetoothDevice.instance.vendorID_Getter_(unwrap_jso(this));
+  int get vendorID => _blink.BlinkBluetoothDevice.instance.vendorID_Getter_(this);
   
   @DomName('BluetoothDevice.vendorIDSource')
   @DocsEditable()
   @Experimental() // untriaged
-  String get vendorIDSource => _blink.BlinkBluetoothDevice.instance.vendorIDSource_Getter_(unwrap_jso(this));
+  String get vendorIDSource => _blink.BlinkBluetoothDevice.instance.vendorIDSource_Getter_(this);
   
   @DomName('BluetoothDevice.connectGATT')
   @DocsEditable()
   @Experimental() // untriaged
-  Future connectGatt() => wrap_jso(_blink.BlinkBluetoothDevice.instance.connectGATT_Callback_0_(unwrap_jso(this)));
+  Future connectGatt() => convertNativePromiseToDartFuture(_blink.BlinkBluetoothDevice.instance.connectGATT_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3046,35 +2374,27 @@
   // To suppress missing implicit constructor warnings.
   factory BluetoothGattCharacteristic._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static BluetoothGattCharacteristic internalCreateBluetoothGattCharacteristic() {
-    return new BluetoothGattCharacteristic._internalWrap();
-  }
 
-  factory BluetoothGattCharacteristic._internalWrap() {
-    return new BluetoothGattCharacteristic.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BluetoothGattCharacteristic.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('BluetoothGATTCharacteristic.uuid')
   @DocsEditable()
   @Experimental() // untriaged
-  String get uuid => _blink.BlinkBluetoothGATTCharacteristic.instance.uuid_Getter_(unwrap_jso(this));
+  String get uuid => _blink.BlinkBluetoothGATTCharacteristic.instance.uuid_Getter_(this);
   
   @DomName('BluetoothGATTCharacteristic.readValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future readValue() => wrap_jso(_blink.BlinkBluetoothGATTCharacteristic.instance.readValue_Callback_0_(unwrap_jso(this)));
+  Future readValue() => convertNativePromiseToDartFuture(_blink.BlinkBluetoothGATTCharacteristic.instance.readValue_Callback_0_(this));
   
   @DomName('BluetoothGATTCharacteristic.writeValue')
   @DocsEditable()
   @Experimental() // untriaged
-  Future writeValue(/*BufferSource*/ value) => wrap_jso(_blink.BlinkBluetoothGATTCharacteristic.instance.writeValue_Callback_1_(unwrap_jso(this), value));
+  Future writeValue(/*BufferSource*/ value) => convertNativePromiseToDartFuture(_blink.BlinkBluetoothGATTCharacteristic.instance.writeValue_Callback_1_(this, value));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3091,30 +2411,22 @@
   // To suppress missing implicit constructor warnings.
   factory BluetoothGattRemoteServer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static BluetoothGattRemoteServer internalCreateBluetoothGattRemoteServer() {
-    return new BluetoothGattRemoteServer._internalWrap();
-  }
 
-  factory BluetoothGattRemoteServer._internalWrap() {
-    return new BluetoothGattRemoteServer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BluetoothGattRemoteServer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('BluetoothGATTRemoteServer.connected')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get connected => _blink.BlinkBluetoothGATTRemoteServer.instance.connected_Getter_(unwrap_jso(this));
+  bool get connected => _blink.BlinkBluetoothGATTRemoteServer.instance.connected_Getter_(this);
   
   @DomName('BluetoothGATTRemoteServer.getPrimaryService')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getPrimaryService(/*BluetoothServiceUUID*/ service) => wrap_jso(_blink.BlinkBluetoothGATTRemoteServer.instance.getPrimaryService_Callback_1_(unwrap_jso(this), service));
+  Future getPrimaryService(/*BluetoothServiceUUID*/ service) => convertNativePromiseToDartFuture(_blink.BlinkBluetoothGATTRemoteServer.instance.getPrimaryService_Callback_1_(this, service));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3131,35 +2443,27 @@
   // To suppress missing implicit constructor warnings.
   factory BluetoothGattService._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static BluetoothGattService internalCreateBluetoothGattService() {
-    return new BluetoothGattService._internalWrap();
-  }
 
-  factory BluetoothGattService._internalWrap() {
-    return new BluetoothGattService.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BluetoothGattService.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('BluetoothGATTService.isPrimary')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isPrimary => _blink.BlinkBluetoothGATTService.instance.isPrimary_Getter_(unwrap_jso(this));
+  bool get isPrimary => _blink.BlinkBluetoothGATTService.instance.isPrimary_Getter_(this);
   
   @DomName('BluetoothGATTService.uuid')
   @DocsEditable()
   @Experimental() // untriaged
-  String get uuid => _blink.BlinkBluetoothGATTService.instance.uuid_Getter_(unwrap_jso(this));
+  String get uuid => _blink.BlinkBluetoothGATTService.instance.uuid_Getter_(this);
   
   @DomName('BluetoothGATTService.getCharacteristic')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getCharacteristic(/*BluetoothCharacteristicUUID*/ characteristic) => wrap_jso(_blink.BlinkBluetoothGATTService.instance.getCharacteristic_Callback_1_(unwrap_jso(this), characteristic));
+  Future getCharacteristic(/*BluetoothCharacteristicUUID*/ characteristic) => convertNativePromiseToDartFuture(_blink.BlinkBluetoothGATTService.instance.getCharacteristic_Callback_1_(this, characteristic));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3176,21 +2480,13 @@
   // To suppress missing implicit constructor warnings.
   factory BluetoothUuid._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static BluetoothUuid internalCreateBluetoothUuid() {
-    return new BluetoothUuid._internalWrap();
-  }
 
-  factory BluetoothUuid._internalWrap() {
-    return new BluetoothUuid.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BluetoothUuid.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('BluetoothUUID.canonicalUUID')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3226,45 +2522,37 @@
   // To suppress missing implicit constructor warnings.
   factory Body._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Body internalCreateBody() {
-    return new Body._internalWrap();
-  }
 
-  factory Body._internalWrap() {
-    return new Body.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Body.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Body.bodyUsed')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get bodyUsed => _blink.BlinkBody.instance.bodyUsed_Getter_(unwrap_jso(this));
+  bool get bodyUsed => _blink.BlinkBody.instance.bodyUsed_Getter_(this);
   
   @DomName('Body.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Future arrayBuffer() => wrap_jso(_blink.BlinkBody.instance.arrayBuffer_Callback_0_(unwrap_jso(this)));
+  Future arrayBuffer() => convertNativePromiseToDartFuture(_blink.BlinkBody.instance.arrayBuffer_Callback_0_(this));
   
   @DomName('Body.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  Future blob() => wrap_jso(_blink.BlinkBody.instance.blob_Callback_0_(unwrap_jso(this)));
+  Future blob() => convertNativePromiseToDartFuture(_blink.BlinkBody.instance.blob_Callback_0_(this));
   
   @DomName('Body.json')
   @DocsEditable()
   @Experimental() // untriaged
-  Future json() => wrap_jso(_blink.BlinkBody.instance.json_Callback_0_(unwrap_jso(this)));
+  Future json() => convertNativePromiseToDartFuture(_blink.BlinkBody.instance.json_Callback_0_(this));
   
   @DomName('Body.text')
   @DocsEditable()
   @Experimental() // untriaged
-  Future text() => wrap_jso(_blink.BlinkBody.instance.text_Callback_0_(unwrap_jso(this)));
+  Future text() => convertNativePromiseToDartFuture(_blink.BlinkBody.instance.text_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3411,11 +2699,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static BodyElement internalCreateBodyElement() {
-    return new BodyElement._internalWrap();
-  }
-
-  external factory BodyElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BodyElement.internal_() : super.internal_();
@@ -3512,11 +2796,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ButtonElement internalCreateButtonElement() {
-    return new ButtonElement._internalWrap();
-  }
-
-  external factory ButtonElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ButtonElement.internal_() : super.internal_();
@@ -3530,117 +2810,117 @@
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLButtonElement.instance.autofocus_Getter_(unwrap_jso(this));
+  bool get autofocus => _blink.BlinkHTMLButtonElement.instance.autofocus_Getter_(this);
   
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  set autofocus(bool value) => _blink.BlinkHTMLButtonElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLButtonElement.instance.autofocus_Setter_(this, value);
   
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLButtonElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLButtonElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLButtonElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLButtonElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLButtonElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLButtonElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLButtonElement.instance.form_Getter_(this);
   
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.BlinkHTMLButtonElement.instance.formAction_Getter_(unwrap_jso(this));
+  String get formAction => _blink.BlinkHTMLButtonElement.instance.formAction_Getter_(this);
   
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  set formAction(String value) => _blink.BlinkHTMLButtonElement.instance.formAction_Setter_(unwrap_jso(this), value);
+  set formAction(String value) => _blink.BlinkHTMLButtonElement.instance.formAction_Setter_(this, value);
   
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.BlinkHTMLButtonElement.instance.formEnctype_Getter_(unwrap_jso(this));
+  String get formEnctype => _blink.BlinkHTMLButtonElement.instance.formEnctype_Getter_(this);
   
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  set formEnctype(String value) => _blink.BlinkHTMLButtonElement.instance.formEnctype_Setter_(unwrap_jso(this), value);
+  set formEnctype(String value) => _blink.BlinkHTMLButtonElement.instance.formEnctype_Setter_(this, value);
   
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.BlinkHTMLButtonElement.instance.formMethod_Getter_(unwrap_jso(this));
+  String get formMethod => _blink.BlinkHTMLButtonElement.instance.formMethod_Getter_(this);
   
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  set formMethod(String value) => _blink.BlinkHTMLButtonElement.instance.formMethod_Setter_(unwrap_jso(this), value);
+  set formMethod(String value) => _blink.BlinkHTMLButtonElement.instance.formMethod_Setter_(this, value);
   
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Getter_(unwrap_jso(this));
+  bool get formNoValidate => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Getter_(this);
   
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Setter_(unwrap_jso(this), value);
+  set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Setter_(this, value);
   
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.BlinkHTMLButtonElement.instance.formTarget_Getter_(unwrap_jso(this));
+  String get formTarget => _blink.BlinkHTMLButtonElement.instance.formTarget_Getter_(this);
   
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  set formTarget(String value) => _blink.BlinkHTMLButtonElement.instance.formTarget_Setter_(unwrap_jso(this), value);
+  set formTarget(String value) => _blink.BlinkHTMLButtonElement.instance.formTarget_Setter_(this, value);
   
   @DomName('HTMLButtonElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLButtonElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLButtonElement.instance.labels_Getter_(this));
   
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLButtonElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLButtonElement.instance.name_Getter_(this);
   
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLButtonElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLButtonElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLButtonElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLButtonElement.instance.type_Getter_(this);
   
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLButtonElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLButtonElement.instance.type_Setter_(this, value);
   
   @DomName('HTMLButtonElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLButtonElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLButtonElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLButtonElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLButtonElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLButtonElement.instance.validity_Getter_(this);
   
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLButtonElement.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkHTMLButtonElement.instance.value_Getter_(this);
   
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkHTMLButtonElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLButtonElement.instance.value_Setter_(this, value);
   
   @DomName('HTMLButtonElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLButtonElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLButtonElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLButtonElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLButtonElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLButtonElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLButtonElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLButtonElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLButtonElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLButtonElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLButtonElement.instance.setCustomValidity_Callback_1_(this, error);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3660,11 +2940,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CDataSection internalCreateCDataSection() {
-    return new CDataSection._internalWrap();
-  }
-
-  external factory CDataSection._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CDataSection.internal_() : super.internal_();
@@ -3685,47 +2961,39 @@
   // To suppress missing implicit constructor warnings.
   factory CacheStorage._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CacheStorage internalCreateCacheStorage() {
-    return new CacheStorage._internalWrap();
-  }
 
-  factory CacheStorage._internalWrap() {
-    return new CacheStorage.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CacheStorage.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.delete_Callback_1_(unwrap_jso(this), cacheName));
+  Future delete(String cacheName) => convertNativePromiseToDartFuture(_blink.BlinkCacheStorage.instance.delete_Callback_1_(this, cacheName));
   
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.has_Callback_1_(unwrap_jso(this), cacheName));
+  Future has(String cacheName) => convertNativePromiseToDartFuture(_blink.BlinkCacheStorage.instance.has_Callback_1_(this, cacheName));
   
   @DomName('CacheStorage.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() => wrap_jso(_blink.BlinkCacheStorage.instance.keys_Callback_0_(unwrap_jso(this)));
+  Future keys() => convertNativePromiseToDartFuture(_blink.BlinkCacheStorage.instance.keys_Callback_0_(this));
   
   Future match(/*RequestInfo*/ request, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkCacheStorage.instance.match_Callback_2_(unwrap_jso(this), request, convertDartToNative_Dictionary(options)));
+      return _blink.BlinkCacheStorage.instance.match_Callback_2_(this, request, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkCacheStorage.instance.match_Callback_1_(unwrap_jso(this), request));
+    return _blink.BlinkCacheStorage.instance.match_Callback_1_(this, request);
   }
 
   @DomName('CacheStorage.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.open_Callback_1_(unwrap_jso(this), cacheName));
+  Future open(String cacheName) => convertNativePromiseToDartFuture(_blink.BlinkCacheStorage.instance.open_Callback_1_(this, cacheName));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3769,11 +3037,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CanvasElement internalCreateCanvasElement() {
-    return new CanvasElement._internalWrap();
-  }
-
-  external factory CanvasElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CanvasElement.internal_() : super.internal_();
@@ -3788,42 +3052,42 @@
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLCanvasElement.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkHTMLCanvasElement.instance.height_Getter_(this);
   
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  set height(int value) => _blink.BlinkHTMLCanvasElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLCanvasElement.instance.height_Setter_(this, value);
   
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLCanvasElement.instance.width_Getter_(unwrap_jso(this));
+  int get width => _blink.BlinkHTMLCanvasElement.instance.width_Getter_(this);
   
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  set width(int value) => _blink.BlinkHTMLCanvasElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLCanvasElement.instance.width_Setter_(this, value);
   
   Object getContext(String contextId, [Map attributes]) {
     if (attributes != null) {
-      return wrap_jso(_blink.BlinkHTMLCanvasElement.instance.getContext_Callback_2_(unwrap_jso(this), contextId, convertDartToNative_Dictionary(attributes)));
+      return _blink.BlinkHTMLCanvasElement.instance.getContext_Callback_2_(this, contextId, convertDartToNative_Dictionary(attributes));
     }
-    return wrap_jso(_blink.BlinkHTMLCanvasElement.instance.getContext_Callback_1_(unwrap_jso(this), contextId));
+    return _blink.BlinkHTMLCanvasElement.instance.getContext_Callback_1_(this, contextId);
   }
 
   String _toDataUrl(String type, [arguments_OR_quality]) {
     if ((type is String || type == null) && arguments_OR_quality == null) {
-      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_1_(unwrap_jso(this), type);
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_1_(this, type);
     }
     if (arguments_OR_quality != null && (type is String || type == null)) {
-      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(unwrap_jso(this), type, unwrap_jso(arguments_OR_quality));
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(this, type, arguments_OR_quality);
     }
     if ((type is String || type == null) && arguments_OR_quality == null) {
-      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_1_(unwrap_jso(this), type);
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_1_(this, type);
     }
     if ((arguments_OR_quality is num || arguments_OR_quality == null) && (type is String || type == null)) {
-      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(unwrap_jso(this), type, unwrap_jso(arguments_OR_quality));
+      return _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(this, type, arguments_OR_quality);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -3958,21 +3222,13 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasGradient._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CanvasGradient internalCreateCanvasGradient() {
-    return new CanvasGradient._internalWrap();
-  }
 
-  factory CanvasGradient._internalWrap() {
-    return new CanvasGradient.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CanvasGradient.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /**
    * Adds a color stop to this gradient at the offset.
    *
@@ -3984,7 +3240,7 @@
    */
   @DomName('CanvasGradient.addColorStop')
   @DocsEditable()
-  void addColorStop(num offset, String color) => _blink.BlinkCanvasGradient.instance.addColorStop_Callback_2_(unwrap_jso(this), offset, color);
+  void addColorStop(num offset, String color) => _blink.BlinkCanvasGradient.instance.addColorStop_Callback_2_(this, offset, color);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4028,25 +3284,17 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasPattern._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CanvasPattern internalCreateCanvasPattern() {
-    return new CanvasPattern._internalWrap();
-  }
 
-  factory CanvasPattern._internalWrap() {
-    return new CanvasPattern.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CanvasPattern.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CanvasPattern.setTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void setTransform(Matrix transform) => _blink.BlinkCanvasPattern.instance.setTransform_Callback_1_(unwrap_jso(this), unwrap_jso(transform));
+  void setTransform(Matrix transform) => _blink.BlinkCanvasPattern.instance.setTransform_Callback_1_(this, transform);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4063,87 +3311,79 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CanvasRenderingContext2D internalCreateCanvasRenderingContext2D() {
-    return new CanvasRenderingContext2D._internalWrap();
-  }
 
-  factory CanvasRenderingContext2D._internalWrap() {
-    return new CanvasRenderingContext2D.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CanvasRenderingContext2D.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CanvasRenderingContext2D.canvas')
   @DocsEditable()
   @Experimental() // untriaged
-  CanvasElement get canvas => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.canvas_Getter_(unwrap_jso(this)));
+  CanvasElement get canvas => _blink.BlinkCanvasRenderingContext2D.instance.canvas_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix get currentTransform => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Getter_(unwrap_jso(this)));
+  Matrix get currentTransform => _blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  String get direction => _blink.BlinkCanvasRenderingContext2D.instance.direction_Getter_(unwrap_jso(this));
+  String get direction => _blink.BlinkCanvasRenderingContext2D.instance.direction_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  set direction(String value) => _blink.BlinkCanvasRenderingContext2D.instance.direction_Setter_(unwrap_jso(this), value);
+  set direction(String value) => _blink.BlinkCanvasRenderingContext2D.instance.direction_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  Object get fillStyle => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Getter_(unwrap_jso(this)));
+  Object get fillStyle => (_blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Getter_(this));
   
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.filter')
   @DocsEditable()
   @Experimental() // untriaged
-  String get filter => _blink.BlinkCanvasRenderingContext2D.instance.filter_Getter_(unwrap_jso(this));
+  String get filter => _blink.BlinkCanvasRenderingContext2D.instance.filter_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.filter')
   @DocsEditable()
   @Experimental() // untriaged
-  set filter(String value) => _blink.BlinkCanvasRenderingContext2D.instance.filter_Setter_(unwrap_jso(this), value);
+  set filter(String value) => _blink.BlinkCanvasRenderingContext2D.instance.filter_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  String get font => _blink.BlinkCanvasRenderingContext2D.instance.font_Getter_(unwrap_jso(this));
+  String get font => _blink.BlinkCanvasRenderingContext2D.instance.font_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  set font(String value) => _blink.BlinkCanvasRenderingContext2D.instance.font_Setter_(unwrap_jso(this), value);
+  set font(String value) => _blink.BlinkCanvasRenderingContext2D.instance.font_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  num get globalAlpha => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Getter_(unwrap_jso(this));
+  num get globalAlpha => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Setter_(unwrap_jso(this), value);
+  set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  String get globalCompositeOperation => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Getter_(unwrap_jso(this));
+  String get globalCompositeOperation => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Setter_(unwrap_jso(this), value);
+  set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Setter_(this, value);
   
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -4158,7 +3398,7 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get imageSmoothingEnabled => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Getter_(unwrap_jso(this));
+  bool get imageSmoothingEnabled => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Getter_(this);
   
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -4173,141 +3413,141 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Setter_(unwrap_jso(this), value);
+  set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  String get lineCap => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Getter_(unwrap_jso(this));
+  String get lineCap => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Setter_(unwrap_jso(this), value);
+  set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  num get lineDashOffset => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Getter_(unwrap_jso(this));
+  num get lineDashOffset => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Setter_(unwrap_jso(this), value);
+  set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  String get lineJoin => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Getter_(unwrap_jso(this));
+  String get lineJoin => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Setter_(unwrap_jso(this), value);
+  set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  num get lineWidth => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Getter_(unwrap_jso(this));
+  num get lineWidth => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Setter_(unwrap_jso(this), value);
+  set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  num get miterLimit => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Getter_(unwrap_jso(this));
+  num get miterLimit => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Setter_(unwrap_jso(this), value);
+  set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  num get shadowBlur => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Getter_(unwrap_jso(this));
+  num get shadowBlur => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Setter_(unwrap_jso(this), value);
+  set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  String get shadowColor => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Getter_(unwrap_jso(this));
+  String get shadowColor => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Setter_(unwrap_jso(this), value);
+  set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  num get shadowOffsetX => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Getter_(unwrap_jso(this));
+  num get shadowOffsetX => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Setter_(unwrap_jso(this), value);
+  set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  num get shadowOffsetY => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Getter_(unwrap_jso(this));
+  num get shadowOffsetY => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Setter_(unwrap_jso(this), value);
+  set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  Object get strokeStyle => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Getter_(unwrap_jso(this)));
+  Object get strokeStyle => (_blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Getter_(this));
   
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  String get textAlign => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Getter_(unwrap_jso(this));
+  String get textAlign => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Setter_(unwrap_jso(this), value);
+  set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Setter_(this, value);
   
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  String get textBaseline => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Getter_(unwrap_jso(this));
+  String get textBaseline => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Getter_(this);
   
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Setter_(unwrap_jso(this), value);
+  set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Setter_(this, value);
   
   void addHitRegion([Map options]) {
     if (options != null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options));
+      _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_1_(this, convertDartToNative_Dictionary(options));
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_0_(unwrap_jso(this));
+    _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_0_(this);
     return;
   }
 
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
-  void beginPath() => _blink.BlinkCanvasRenderingContext2D.instance.beginPath_Callback_0_(unwrap_jso(this));
+  void beginPath() => _blink.BlinkCanvasRenderingContext2D.instance.beginPath_Callback_0_(this);
   
   @DomName('CanvasRenderingContext2D.clearHitRegions')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearHitRegions() => _blink.BlinkCanvasRenderingContext2D.instance.clearHitRegions_Callback_0_(unwrap_jso(this));
+  void clearHitRegions() => _blink.BlinkCanvasRenderingContext2D.instance.clearHitRegions_Callback_0_(this);
   
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
-  void clearRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.clearRect_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void clearRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.clearRect_Callback_4_(this, x, y, width, height);
   
   void clip([path_OR_winding, String winding]) {
     if (path_OR_winding == null && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_0_(unwrap_jso(this));
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_0_(this);
       return;
     }
     if ((path_OR_winding is String) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_1_(unwrap_jso(this), unwrap_jso(path_OR_winding));
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((path_OR_winding is Path2D) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_1_(unwrap_jso(this), unwrap_jso(path_OR_winding));
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((winding is String) && (path_OR_winding is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_2_(unwrap_jso(this), unwrap_jso(path_OR_winding), winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_2_(this, path_OR_winding, winding);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -4315,33 +3555,33 @@
 
   ImageData createImageData(imagedata_OR_sw, [num sh]) {
     if ((imagedata_OR_sw is ImageData) && sh == null) {
-      return wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_1_(unwrap_jso(this), unwrap_jso(imagedata_OR_sw)));
+      return _blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_1_(this, imagedata_OR_sw);
     }
     if ((sh is num) && (imagedata_OR_sw is num)) {
-      return wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_2_(unwrap_jso(this), unwrap_jso(imagedata_OR_sw), sh));
+      return _blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_2_(this, imagedata_OR_sw, sh);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createLinearGradient_Callback_4_(unwrap_jso(this), x0, y0, x1, y1));
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.BlinkCanvasRenderingContext2D.instance.createLinearGradient_Callback_4_(this, x0, y0, x1, y1);
   
   @DomName('CanvasRenderingContext2D.createPattern')
   @DocsEditable()
-  CanvasPattern createPattern(Object image, String repetitionType) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(unwrap_jso(this), image, repetitionType));
+  CanvasPattern createPattern(Object image, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(this, image, repetitionType);
   
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.createRadialGradient_Callback_6_(unwrap_jso(this), x0, y0, r0, x1, y1, r1));
+  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.BlinkCanvasRenderingContext2D.instance.createRadialGradient_Callback_6_(this, x0, y0, r0, x1, y1, r1);
   
   void drawFocusIfNeeded(element_OR_path, [Element element]) {
     if ((element_OR_path is Element) && element == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawFocusIfNeeded_Callback_1_(unwrap_jso(this), unwrap_jso(element_OR_path));
+      _blink.BlinkCanvasRenderingContext2D.instance.drawFocusIfNeeded_Callback_1_(this, element_OR_path);
       return;
     }
     if ((element is Element) && (element_OR_path is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawFocusIfNeeded_Callback_2_(unwrap_jso(this), unwrap_jso(element_OR_path), unwrap_jso(element));
+      _blink.BlinkCanvasRenderingContext2D.instance.drawFocusIfNeeded_Callback_2_(this, element_OR_path, element);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -4349,15 +3589,15 @@
 
   void _drawImage(Object image, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
     if ((sy_OR_y is num) && (sx_OR_x is num) && image != null && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(unwrap_jso(this), image, sx_OR_x, sy_OR_y);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(this, image, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && image != null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(unwrap_jso(this), image, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(this, image, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && image != null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(unwrap_jso(this), image, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(this, image, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -4365,19 +3605,19 @@
 
   void fill([path_OR_winding, String winding]) {
     if (path_OR_winding == null && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_0_(unwrap_jso(this));
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_0_(this);
       return;
     }
     if ((path_OR_winding is String) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_1_(unwrap_jso(this), unwrap_jso(path_OR_winding));
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((path_OR_winding is Path2D) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_1_(unwrap_jso(this), unwrap_jso(path_OR_winding));
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((winding is String) && (path_OR_winding is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_2_(unwrap_jso(this), unwrap_jso(path_OR_winding), winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_2_(this, path_OR_winding, winding);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -4385,14 +3625,14 @@
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
-  void fillRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.fillRect_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void fillRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.fillRect_Callback_4_(this, x, y, width, height);
   
   void fillText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.fillText_Callback_4_(unwrap_jso(this), text, x, y, maxWidth);
+      _blink.BlinkCanvasRenderingContext2D.instance.fillText_Callback_4_(this, text, x, y, maxWidth);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.instance.fillText_Callback_3_(unwrap_jso(this), text, x, y);
+    _blink.BlinkCanvasRenderingContext2D.instance.fillText_Callback_3_(this, text, x, y);
     return;
   }
 
@@ -4400,58 +3640,58 @@
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-   getContextAttributes() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.getContextAttributes_Callback_0_(unwrap_jso(this))));
+   getContextAttributes() => convertNativeDictionaryToDartDictionary((_blink.BlinkCanvasRenderingContext2D.instance.getContextAttributes_Callback_0_(this)));
   
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
-  ImageData getImageData(num sx, num sy, num sw, num sh) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.getImageData_Callback_4_(unwrap_jso(this), sx, sy, sw, sh));
+  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.instance.getImageData_Callback_4_(this, sx, sy, sw, sh);
   
   @DomName('CanvasRenderingContext2D.getLineDash')
   @DocsEditable()
-  List<num> _getLineDash() => _blink.BlinkCanvasRenderingContext2D.instance.getLineDash_Callback_0_(unwrap_jso(this));
+  List<num> _getLineDash() => _blink.BlinkCanvasRenderingContext2D.instance.getLineDash_Callback_0_(this);
   
   @DomName('CanvasRenderingContext2D.isContextLost')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isContextLost() => _blink.BlinkCanvasRenderingContext2D.instance.isContextLost_Callback_0_(unwrap_jso(this));
+  bool isContextLost() => _blink.BlinkCanvasRenderingContext2D.instance.isContextLost_Callback_0_(this);
   
   bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding]) {
     if ((x_OR_y is num) && (path_OR_x is num) && winding_OR_y == null && winding == null) {
-      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_2_(unwrap_jso(this), unwrap_jso(path_OR_x), x_OR_y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_2_(this, path_OR_x, x_OR_y);
     }
     if ((winding_OR_y is String) && (x_OR_y is num) && (path_OR_x is num) && winding == null) {
-      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_3_(unwrap_jso(this), unwrap_jso(path_OR_x), x_OR_y, unwrap_jso(winding_OR_y));
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_3_(this, path_OR_x, x_OR_y, winding_OR_y);
     }
     if ((winding_OR_y is num) && (x_OR_y is num) && (path_OR_x is Path2D) && winding == null) {
-      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_3_(unwrap_jso(this), unwrap_jso(path_OR_x), x_OR_y, unwrap_jso(winding_OR_y));
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_3_(this, path_OR_x, x_OR_y, winding_OR_y);
     }
     if ((winding is String) && (winding_OR_y is num) && (x_OR_y is num) && (path_OR_x is Path2D)) {
-      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_4_(unwrap_jso(this), unwrap_jso(path_OR_x), x_OR_y, unwrap_jso(winding_OR_y), winding);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_4_(this, path_OR_x, x_OR_y, winding_OR_y, winding);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) {
     if ((x_OR_y is num) && (path_OR_x is num) && y == null) {
-      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInStroke_Callback_2_(unwrap_jso(this), unwrap_jso(path_OR_x), x_OR_y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInStroke_Callback_2_(this, path_OR_x, x_OR_y);
     }
     if ((y is num) && (x_OR_y is num) && (path_OR_x is Path2D)) {
-      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInStroke_Callback_3_(unwrap_jso(this), unwrap_jso(path_OR_x), x_OR_y, y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInStroke_Callback_3_(this, path_OR_x, x_OR_y, y);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
-  TextMetrics measureText(String text) => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.measureText_Callback_1_(unwrap_jso(this), text));
+  TextMetrics measureText(String text) => _blink.BlinkCanvasRenderingContext2D.instance.measureText_Callback_1_(this, text);
   
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if ((dy is num) && (dx is num) && (imagedata is ImageData) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.putImageData_Callback_3_(unwrap_jso(this), unwrap_jso(imagedata), dx, dy);
+      _blink.BlinkCanvasRenderingContext2D.instance.putImageData_Callback_3_(this, convertDartToNative_ImageData(imagedata), dx, dy);
       return;
     }
     if ((dirtyHeight is num) && (dirtyWidth is num) && (dirtyY is num) && (dirtyX is num) && (dy is num) && (dx is num) && (imagedata is ImageData)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.putImageData_Callback_7_(unwrap_jso(this), unwrap_jso(imagedata), dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      _blink.BlinkCanvasRenderingContext2D.instance.putImageData_Callback_7_(this, convertDartToNative_ImageData(imagedata), dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -4460,53 +3700,53 @@
   @DomName('CanvasRenderingContext2D.removeHitRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeHitRegion(String id) => _blink.BlinkCanvasRenderingContext2D.instance.removeHitRegion_Callback_1_(unwrap_jso(this), id);
+  void removeHitRegion(String id) => _blink.BlinkCanvasRenderingContext2D.instance.removeHitRegion_Callback_1_(this, id);
   
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetTransform() => _blink.BlinkCanvasRenderingContext2D.instance.resetTransform_Callback_0_(unwrap_jso(this));
+  void resetTransform() => _blink.BlinkCanvasRenderingContext2D.instance.resetTransform_Callback_0_(this);
   
   @DomName('CanvasRenderingContext2D.restore')
   @DocsEditable()
-  void restore() => _blink.BlinkCanvasRenderingContext2D.instance.restore_Callback_0_(unwrap_jso(this));
+  void restore() => _blink.BlinkCanvasRenderingContext2D.instance.restore_Callback_0_(this);
   
   @DomName('CanvasRenderingContext2D.rotate')
   @DocsEditable()
-  void rotate(num angle) => _blink.BlinkCanvasRenderingContext2D.instance.rotate_Callback_1_(unwrap_jso(this), angle);
+  void rotate(num angle) => _blink.BlinkCanvasRenderingContext2D.instance.rotate_Callback_1_(this, angle);
   
   @DomName('CanvasRenderingContext2D.save')
   @DocsEditable()
-  void save() => _blink.BlinkCanvasRenderingContext2D.instance.save_Callback_0_(unwrap_jso(this));
+  void save() => _blink.BlinkCanvasRenderingContext2D.instance.save_Callback_0_(this);
   
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.scale_Callback_2_(unwrap_jso(this), x, y);
+  void scale(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.scale_Callback_2_(this, x, y);
   
   void scrollPathIntoView([Path2D path]) {
     if (path != null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.scrollPathIntoView_Callback_1_(unwrap_jso(this), unwrap_jso(path));
+      _blink.BlinkCanvasRenderingContext2D.instance.scrollPathIntoView_Callback_1_(this, path);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.instance.scrollPathIntoView_Callback_0_(unwrap_jso(this));
+    _blink.BlinkCanvasRenderingContext2D.instance.scrollPathIntoView_Callback_0_(this);
     return;
   }
 
   @DomName('CanvasRenderingContext2D.setLineDash')
   @DocsEditable()
-  void setLineDash(List<num> dash) => _blink.BlinkCanvasRenderingContext2D.instance.setLineDash_Callback_1_(unwrap_jso(this), dash);
+  void setLineDash(List<num> dash) => _blink.BlinkCanvasRenderingContext2D.instance.setLineDash_Callback_1_(this, dash);
   
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.instance.setTransform_Callback_6_(unwrap_jso(this), a, b, c, d, e, f);
+  void setTransform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.instance.setTransform_Callback_6_(this, a, b, c, d, e, f);
   
   void stroke([Path2D path]) {
     if (path == null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.stroke_Callback_0_(unwrap_jso(this));
+      _blink.BlinkCanvasRenderingContext2D.instance.stroke_Callback_0_(this);
       return;
     }
     if ((path is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.instance.stroke_Callback_1_(unwrap_jso(this), unwrap_jso(path));
+      _blink.BlinkCanvasRenderingContext2D.instance.stroke_Callback_1_(this, path);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -4514,61 +3754,61 @@
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
-  void strokeRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.strokeRect_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void strokeRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.strokeRect_Callback_4_(this, x, y, width, height);
   
   void strokeText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.strokeText_Callback_4_(unwrap_jso(this), text, x, y, maxWidth);
+      _blink.BlinkCanvasRenderingContext2D.instance.strokeText_Callback_4_(this, text, x, y, maxWidth);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.instance.strokeText_Callback_3_(unwrap_jso(this), text, x, y);
+    _blink.BlinkCanvasRenderingContext2D.instance.strokeText_Callback_3_(this, text, x, y);
     return;
   }
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.instance.transform_Callback_6_(unwrap_jso(this), a, b, c, d, e, f);
+  void transform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.instance.transform_Callback_6_(this, a, b, c, d, e, f);
   
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.translate_Callback_2_(unwrap_jso(this), x, y);
+  void translate(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.translate_Callback_2_(this, x, y);
   
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
-  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.instance.arc_Callback_6_(unwrap_jso(this), x, y, radius, startAngle, endAngle, anticlockwise);
+  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.instance.arc_Callback_6_(this, x, y, radius, startAngle, endAngle, anticlockwise);
   
   @DomName('CanvasRenderingContext2D.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.instance.arcTo_Callback_5_(unwrap_jso(this), x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.instance.arcTo_Callback_5_(this, x1, y1, x2, y2, radius);
   
   @DomName('CanvasRenderingContext2D.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.bezierCurveTo_Callback_6_(unwrap_jso(this), cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.bezierCurveTo_Callback_6_(this, cp1x, cp1y, cp2x, cp2y, x, y);
   
   @DomName('CanvasRenderingContext2D.closePath')
   @DocsEditable()
-  void closePath() => _blink.BlinkCanvasRenderingContext2D.instance.closePath_Callback_0_(unwrap_jso(this));
+  void closePath() => _blink.BlinkCanvasRenderingContext2D.instance.closePath_Callback_0_(this);
   
   @DomName('CanvasRenderingContext2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.instance.ellipse_Callback_8_(unwrap_jso(this), x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.instance.ellipse_Callback_8_(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
   
   @DomName('CanvasRenderingContext2D.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.lineTo_Callback_2_(unwrap_jso(this), x, y);
+  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.lineTo_Callback_2_(this, x, y);
   
   @DomName('CanvasRenderingContext2D.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.moveTo_Callback_2_(unwrap_jso(this), x, y);
+  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.moveTo_Callback_2_(this, x, y);
   
   @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.quadraticCurveTo_Callback_4_(unwrap_jso(this), cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.quadraticCurveTo_Callback_4_(this, cpx, cpy, x, y);
   
   @DomName('CanvasRenderingContext2D.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.rect_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.rect_Callback_4_(this, x, y, width, height);
   
 
   @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
@@ -4829,11 +4069,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CharacterData internalCreateCharacterData() {
-    return new CharacterData._internalWrap();
-  }
-
-  external factory CharacterData._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CharacterData.internal_() : super.internal_();
@@ -4841,53 +4077,53 @@
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  String get data => _blink.BlinkCharacterData.instance.data_Getter_(unwrap_jso(this));
+  String get data => _blink.BlinkCharacterData.instance.data_Getter_(this);
   
   @DomName('CharacterData.data')
   @DocsEditable()
-  set data(String value) => _blink.BlinkCharacterData.instance.data_Setter_(unwrap_jso(this), value);
+  set data(String value) => _blink.BlinkCharacterData.instance.data_Setter_(this, value);
   
   @DomName('CharacterData.length')
   @DocsEditable()
-  int get length => _blink.BlinkCharacterData.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkCharacterData.instance.length_Getter_(this);
   
   @DomName('CharacterData.appendData')
   @DocsEditable()
-  void appendData(String data) => _blink.BlinkCharacterData.instance.appendData_Callback_1_(unwrap_jso(this), data);
+  void appendData(String data) => _blink.BlinkCharacterData.instance.appendData_Callback_1_(this, data);
   
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int count) => _blink.BlinkCharacterData.instance.deleteData_Callback_2_(unwrap_jso(this), offset, count);
+  void deleteData(int offset, int count) => _blink.BlinkCharacterData.instance.deleteData_Callback_2_(this, offset, count);
   
   @DomName('CharacterData.insertData')
   @DocsEditable()
-  void insertData(int offset, String data) => _blink.BlinkCharacterData.instance.insertData_Callback_2_(unwrap_jso(this), offset, data);
+  void insertData(int offset, String data) => _blink.BlinkCharacterData.instance.insertData_Callback_2_(this, offset, data);
   
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int count, String data) => _blink.BlinkCharacterData.instance.replaceData_Callback_3_(unwrap_jso(this), offset, count, data);
+  void replaceData(int offset, int count, String data) => _blink.BlinkCharacterData.instance.replaceData_Callback_3_(this, offset, count, data);
   
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int count) => _blink.BlinkCharacterData.instance.substringData_Callback_2_(unwrap_jso(this), offset, count);
+  String substringData(int offset, int count) => _blink.BlinkCharacterData.instance.substringData_Callback_2_(this, offset, count);
   
   @DomName('CharacterData.after')
   @DocsEditable()
   @Experimental() // untriaged
-  void after(Object nodes) => _blink.BlinkCharacterData.instance.after_Callback_1_(unwrap_jso(this), nodes);
+  void after(Object nodes) => _blink.BlinkCharacterData.instance.after_Callback_1_(this, nodes);
   
   @DomName('CharacterData.before')
   @DocsEditable()
   @Experimental() // untriaged
-  void before(Object nodes) => _blink.BlinkCharacterData.instance.before_Callback_1_(unwrap_jso(this), nodes);
+  void before(Object nodes) => _blink.BlinkCharacterData.instance.before_Callback_1_(this, nodes);
   
   @DomName('CharacterData.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => wrap_jso(_blink.BlinkCharacterData.instance.nextElementSibling_Getter_(unwrap_jso(this)));
+  Element get nextElementSibling => _blink.BlinkCharacterData.instance.nextElementSibling_Getter_(this);
   
   @DomName('CharacterData.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => wrap_jso(_blink.BlinkCharacterData.instance.previousElementSibling_Getter_(unwrap_jso(this)));
+  Element get previousElementSibling => _blink.BlinkCharacterData.instance.previousElementSibling_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4934,21 +4170,13 @@
   // To suppress missing implicit constructor warnings.
   factory ChromiumValuebuffer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ChromiumValuebuffer internalCreateChromiumValuebuffer() {
-    return new ChromiumValuebuffer._internalWrap();
-  }
 
-  factory ChromiumValuebuffer._internalWrap() {
-    return new ChromiumValuebuffer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ChromiumValuebuffer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -4968,16 +4196,12 @@
   @DocsEditable()
   factory CircularGeofencingRegion(Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
-    return wrap_jso(_blink.BlinkCircularGeofencingRegion.instance.constructorCallback_1_(init_1));
+    return _blink.BlinkCircularGeofencingRegion.instance.constructorCallback_1_(init_1);
   }
 
 
   @Deprecated("Internal Use Only")
-  static CircularGeofencingRegion internalCreateCircularGeofencingRegion() {
-    return new CircularGeofencingRegion._internalWrap();
-  }
-
-  external factory CircularGeofencingRegion._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CircularGeofencingRegion.internal_() : super.internal_();
@@ -4996,17 +4220,17 @@
   @DomName('CircularGeofencingRegion.latitude')
   @DocsEditable()
   @Experimental() // untriaged
-  num get latitude => _blink.BlinkCircularGeofencingRegion.instance.latitude_Getter_(unwrap_jso(this));
+  num get latitude => _blink.BlinkCircularGeofencingRegion.instance.latitude_Getter_(this);
   
   @DomName('CircularGeofencingRegion.longitude')
   @DocsEditable()
   @Experimental() // untriaged
-  num get longitude => _blink.BlinkCircularGeofencingRegion.instance.longitude_Getter_(unwrap_jso(this));
+  num get longitude => _blink.BlinkCircularGeofencingRegion.instance.longitude_Getter_(this);
   
   @DomName('CircularGeofencingRegion.radius')
   @DocsEditable()
   @Experimental() // untriaged
-  num get radius => _blink.BlinkCircularGeofencingRegion.instance.radius_Getter_(unwrap_jso(this));
+  num get radius => _blink.BlinkCircularGeofencingRegion.instance.radius_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5023,42 +4247,34 @@
   // To suppress missing implicit constructor warnings.
   factory Client._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Client internalCreateClient() {
-    return new Client._internalWrap();
-  }
 
-  factory Client._internalWrap() {
-    return new Client.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Client.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Client.frameType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get frameType => _blink.BlinkClient.instance.frameType_Getter_(unwrap_jso(this));
+  String get frameType => _blink.BlinkClient.instance.frameType_Getter_(this);
   
   @DomName('Client.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkClient.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkClient.instance.id_Getter_(this);
   
   @DomName('Client.url')
   @DocsEditable()
   @Experimental() // untriaged
-  String get url => _blink.BlinkClient.instance.url_Getter_(unwrap_jso(this));
+  String get url => _blink.BlinkClient.instance.url_Getter_(this);
   
   void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkClient.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkClient.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkClient.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkClient.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
@@ -5077,37 +4293,29 @@
   // To suppress missing implicit constructor warnings.
   factory Clients._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Clients internalCreateClients() {
-    return new Clients._internalWrap();
-  }
 
-  factory Clients._internalWrap() {
-    return new Clients.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Clients.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Clients.claim')
   @DocsEditable()
   @Experimental() // untriaged
-  Future claim() => wrap_jso(_blink.BlinkClients.instance.claim_Callback_0_(unwrap_jso(this)));
+  Future claim() => convertNativePromiseToDartFuture(_blink.BlinkClients.instance.claim_Callback_0_(this));
   
   Future matchAll([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkClients.instance.matchAll_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkClients.instance.matchAll_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkClients.instance.matchAll_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkClients.instance.matchAll_Callback_0_(this);
   }
 
   @DomName('Clients.openWindow')
   @DocsEditable()
   @Experimental() // untriaged
-  Future openWindow(String url) => wrap_jso(_blink.BlinkClients.instance.openWindow_Callback_1_(unwrap_jso(this), url));
+  Future openWindow(String url) => convertNativePromiseToDartFuture(_blink.BlinkClients.instance.openWindow_Callback_1_(this, url));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5126,11 +4334,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ClipboardEvent internalCreateClipboardEvent() {
-    return new ClipboardEvent._internalWrap();
-  }
-
-  external factory ClipboardEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ClipboardEvent.internal_() : super.internal_();
@@ -5139,7 +4343,7 @@
   @DomName('ClipboardEvent.clipboardData')
   @DocsEditable()
   @Experimental() // untriaged
-  DataTransfer get clipboardData => wrap_jso(_blink.BlinkClipboardEvent.instance.clipboardData_Getter_(unwrap_jso(this)));
+  DataTransfer get clipboardData => _blink.BlinkClipboardEvent.instance.clipboardData_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5160,18 +4364,14 @@
   factory CloseEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkCloseEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkCloseEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkCloseEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkCloseEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static CloseEvent internalCreateCloseEvent() {
-    return new CloseEvent._internalWrap();
-  }
-
-  external factory CloseEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CloseEvent.internal_() : super.internal_();
@@ -5179,15 +4379,15 @@
 
   @DomName('CloseEvent.code')
   @DocsEditable()
-  int get code => _blink.BlinkCloseEvent.instance.code_Getter_(unwrap_jso(this));
+  int get code => _blink.BlinkCloseEvent.instance.code_Getter_(this);
   
   @DomName('CloseEvent.reason')
   @DocsEditable()
-  String get reason => _blink.BlinkCloseEvent.instance.reason_Getter_(unwrap_jso(this));
+  String get reason => _blink.BlinkCloseEvent.instance.reason_Getter_(this);
   
   @DomName('CloseEvent.wasClean')
   @DocsEditable()
-  bool get wasClean => _blink.BlinkCloseEvent.instance.wasClean_Getter_(unwrap_jso(this));
+  bool get wasClean => _blink.BlinkCloseEvent.instance.wasClean_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5205,18 +4405,14 @@
   @DocsEditable()
   factory Comment([String data]) {
     if (data != null) {
-      return wrap_jso(_blink.BlinkComment.instance.constructorCallback_1_(data));
+      return _blink.BlinkComment.instance.constructorCallback_1_(data);
     }
-    return wrap_jso(_blink.BlinkComment.instance.constructorCallback_0_());
+    return _blink.BlinkComment.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static Comment internalCreateComment() {
-    return new Comment._internalWrap();
-  }
-
-  external factory Comment._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Comment.internal_() : super.internal_();
@@ -5250,18 +4446,14 @@
   factory CompositionEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkCompositionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkCompositionEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkCompositionEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkCompositionEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static CompositionEvent internalCreateCompositionEvent() {
-    return new CompositionEvent._internalWrap();
-  }
-
-  external factory CompositionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompositionEvent.internal_() : super.internal_();
@@ -5269,11 +4461,11 @@
 
   @DomName('CompositionEvent.data')
   @DocsEditable()
-  String get data => _blink.BlinkCompositionEvent.instance.data_Getter_(unwrap_jso(this));
+  String get data => _blink.BlinkCompositionEvent.instance.data_Getter_(this);
   
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String type, bool bubbles, bool cancelable, Window view, String data) => _blink.BlinkCompositionEvent.instance.initCompositionEvent_Callback_5_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), data);
+  void _initCompositionEvent(String type, bool bubbles, bool cancelable, Window view, String data) => _blink.BlinkCompositionEvent.instance.initCompositionEvent_Callback_5_(this, type, bubbles, cancelable, view, data);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5293,73 +4485,65 @@
   @DomName('CompositorProxy.CompositorProxy')
   @DocsEditable()
   factory CompositorProxy(Element element, List<String> attributeArray) {
-    return wrap_jso(_blink.BlinkCompositorProxy.instance.constructorCallback_2_(element, attributeArray));
+    return _blink.BlinkCompositorProxy.instance.constructorCallback_2_(element, attributeArray);
   }
 
+
   @Deprecated("Internal Use Only")
-  static CompositorProxy internalCreateCompositorProxy() {
-    return new CompositorProxy._internalWrap();
-  }
-
-  factory CompositorProxy._internalWrap() {
-    return new CompositorProxy.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompositorProxy.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CompositorProxy.opacity')
   @DocsEditable()
   @Experimental() // untriaged
-  num get opacity => _blink.BlinkCompositorProxy.instance.opacity_Getter_(unwrap_jso(this));
+  num get opacity => _blink.BlinkCompositorProxy.instance.opacity_Getter_(this);
   
   @DomName('CompositorProxy.opacity')
   @DocsEditable()
   @Experimental() // untriaged
-  set opacity(num value) => _blink.BlinkCompositorProxy.instance.opacity_Setter_(unwrap_jso(this), value);
+  set opacity(num value) => _blink.BlinkCompositorProxy.instance.opacity_Setter_(this, value);
   
   @DomName('CompositorProxy.scrollLeft')
   @DocsEditable()
   @Experimental() // untriaged
-  num get scrollLeft => _blink.BlinkCompositorProxy.instance.scrollLeft_Getter_(unwrap_jso(this));
+  num get scrollLeft => _blink.BlinkCompositorProxy.instance.scrollLeft_Getter_(this);
   
   @DomName('CompositorProxy.scrollLeft')
   @DocsEditable()
   @Experimental() // untriaged
-  set scrollLeft(num value) => _blink.BlinkCompositorProxy.instance.scrollLeft_Setter_(unwrap_jso(this), value);
+  set scrollLeft(num value) => _blink.BlinkCompositorProxy.instance.scrollLeft_Setter_(this, value);
   
   @DomName('CompositorProxy.scrollTop')
   @DocsEditable()
   @Experimental() // untriaged
-  num get scrollTop => _blink.BlinkCompositorProxy.instance.scrollTop_Getter_(unwrap_jso(this));
+  num get scrollTop => _blink.BlinkCompositorProxy.instance.scrollTop_Getter_(this);
   
   @DomName('CompositorProxy.scrollTop')
   @DocsEditable()
   @Experimental() // untriaged
-  set scrollTop(num value) => _blink.BlinkCompositorProxy.instance.scrollTop_Setter_(unwrap_jso(this), value);
+  set scrollTop(num value) => _blink.BlinkCompositorProxy.instance.scrollTop_Setter_(this, value);
   
   @DomName('CompositorProxy.transform')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix get transform => wrap_jso(_blink.BlinkCompositorProxy.instance.transform_Getter_(unwrap_jso(this)));
+  DomMatrix get transform => _blink.BlinkCompositorProxy.instance.transform_Getter_(this);
   
   @DomName('CompositorProxy.transform')
   @DocsEditable()
   @Experimental() // untriaged
-  set transform(DomMatrix value) => _blink.BlinkCompositorProxy.instance.transform_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set transform(DomMatrix value) => _blink.BlinkCompositorProxy.instance.transform_Setter_(this, value);
   
   @DomName('CompositorProxy.disconnect')
   @DocsEditable()
   @Experimental() // untriaged
-  void disconnect() => _blink.BlinkCompositorProxy.instance.disconnect_Callback_0_(unwrap_jso(this));
+  void disconnect() => _blink.BlinkCompositorProxy.instance.disconnect_Callback_0_(this);
   
   @DomName('CompositorProxy.supports')
   @DocsEditable()
   @Experimental() // untriaged
-  bool supports(String attribute) => _blink.BlinkCompositorProxy.instance.supports_Callback_1_(unwrap_jso(this), attribute);
+  bool supports(String attribute) => _blink.BlinkCompositorProxy.instance.supports_Callback_1_(this, attribute);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5389,16 +4573,12 @@
   @DomName('CompositorWorker.CompositorWorker')
   @DocsEditable()
   factory CompositorWorker(String scriptUrl) {
-    return wrap_jso(_blink.BlinkCompositorWorker.instance.constructorCallback_1_(scriptUrl));
+    return _blink.BlinkCompositorWorker.instance.constructorCallback_1_(scriptUrl);
   }
 
 
   @Deprecated("Internal Use Only")
-  static CompositorWorker internalCreateCompositorWorker() {
-    return new CompositorWorker._internalWrap();
-  }
-
-  external factory CompositorWorker._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompositorWorker.internal_() : super.internal_();
@@ -5406,17 +4586,17 @@
 
   void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkCompositorWorker.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkCompositorWorker.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkCompositorWorker.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkCompositorWorker.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
   @DomName('CompositorWorker.terminate')
   @DocsEditable()
   @Experimental() // untriaged
-  void terminate() => _blink.BlinkCompositorWorker.instance.terminate_Callback_0_(unwrap_jso(this));
+  void terminate() => _blink.BlinkCompositorWorker.instance.terminate_Callback_0_(this);
   
   @DomName('CompositorWorker.onerror')
   @DocsEditable()
@@ -5450,11 +4630,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CompositorWorkerGlobalScope internalCreateCompositorWorkerGlobalScope() {
-    return new CompositorWorkerGlobalScope._internalWrap();
-  }
-
-  external factory CompositorWorkerGlobalScope._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompositorWorkerGlobalScope.internal_() : super.internal_();
@@ -5463,21 +4639,21 @@
   @DomName('CompositorWorkerGlobalScope.cancelAnimationFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancelAnimationFrame(int handle) => _blink.BlinkCompositorWorkerGlobalScope.instance.cancelAnimationFrame_Callback_1_(unwrap_jso(this), handle);
+  void cancelAnimationFrame(int handle) => _blink.BlinkCompositorWorkerGlobalScope.instance.cancelAnimationFrame_Callback_1_(this, handle);
   
   void postMessage(Object message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkCompositorWorkerGlobalScope.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkCompositorWorkerGlobalScope.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkCompositorWorkerGlobalScope.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkCompositorWorkerGlobalScope.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
   @DomName('CompositorWorkerGlobalScope.requestAnimationFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  int requestAnimationFrame(FrameRequestCallback callback) => _blink.BlinkCompositorWorkerGlobalScope.instance.requestAnimationFrame_Callback_1_(unwrap_jso(this), unwrap_jso((highResTime) => callback(highResTime)));
+  int requestAnimationFrame(FrameRequestCallback callback) => _blink.BlinkCompositorWorkerGlobalScope.instance.requestAnimationFrame_Callback_1_(this, callback);
   
   @DomName('CompositorWorkerGlobalScope.onmessage')
   @DocsEditable()
@@ -5500,11 +4676,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Console internalCreateConsole() {
-    return new Console._internalWrap();
-  }
-
-  external factory Console._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Console.internal_() : super.internal_();
@@ -5513,12 +4685,12 @@
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
-  MemoryInfo get memory => wrap_jso(_blink.BlinkConsole.instance.memory_Getter_(unwrap_jso(this)));
+  MemoryInfo get memory => _blink.BlinkConsole.instance.memory_Getter_(this);
   
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
-  set memory(MemoryInfo value) => _blink.BlinkConsole.instance.memory_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set memory(MemoryInfo value) => _blink.BlinkConsole.instance.memory_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5535,135 +4707,127 @@
   // To suppress missing implicit constructor warnings.
   factory ConsoleBase._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ConsoleBase internalCreateConsoleBase() {
-    return new ConsoleBase._internalWrap();
-  }
 
-  factory ConsoleBase._internalWrap() {
-    return new ConsoleBase.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ConsoleBase.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ConsoleBase.assert')
   @DocsEditable()
   @Experimental() // untriaged
-  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.instance.assert_Callback_2_(unwrap_jso(this), condition, arg);
+  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.instance.assert_Callback_2_(this, condition, arg);
   
   @DomName('ConsoleBase.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear(Object arg) => _blink.BlinkConsoleBase.instance.clear_Callback_1_(unwrap_jso(this), arg);
+  void clear(Object arg) => _blink.BlinkConsoleBase.instance.clear_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.count')
   @DocsEditable()
   @Experimental() // untriaged
-  void count(Object arg) => _blink.BlinkConsoleBase.instance.count_Callback_1_(unwrap_jso(this), arg);
+  void count(Object arg) => _blink.BlinkConsoleBase.instance.count_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.debug')
   @DocsEditable()
   @Experimental() // untriaged
-  void debug(Object arg) => _blink.BlinkConsoleBase.instance.debug_Callback_1_(unwrap_jso(this), arg);
+  void debug(Object arg) => _blink.BlinkConsoleBase.instance.debug_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.dir')
   @DocsEditable()
   @Experimental() // untriaged
-  void dir(Object arg) => _blink.BlinkConsoleBase.instance.dir_Callback_1_(unwrap_jso(this), arg);
+  void dir(Object arg) => _blink.BlinkConsoleBase.instance.dir_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.dirxml')
   @DocsEditable()
   @Experimental() // untriaged
-  void dirxml(Object arg) => _blink.BlinkConsoleBase.instance.dirxml_Callback_1_(unwrap_jso(this), arg);
+  void dirxml(Object arg) => _blink.BlinkConsoleBase.instance.dirxml_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.error')
   @DocsEditable()
   @Experimental() // untriaged
-  void error(Object arg) => _blink.BlinkConsoleBase.instance.error_Callback_1_(unwrap_jso(this), arg);
+  void error(Object arg) => _blink.BlinkConsoleBase.instance.error_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.group')
   @DocsEditable()
   @Experimental() // untriaged
-  void group(Object arg) => _blink.BlinkConsoleBase.instance.group_Callback_1_(unwrap_jso(this), arg);
+  void group(Object arg) => _blink.BlinkConsoleBase.instance.group_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.groupCollapsed')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupCollapsed(Object arg) => _blink.BlinkConsoleBase.instance.groupCollapsed_Callback_1_(unwrap_jso(this), arg);
+  void groupCollapsed(Object arg) => _blink.BlinkConsoleBase.instance.groupCollapsed_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.groupEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupEnd() => _blink.BlinkConsoleBase.instance.groupEnd_Callback_0_(unwrap_jso(this));
+  void groupEnd() => _blink.BlinkConsoleBase.instance.groupEnd_Callback_0_(this);
   
   @DomName('ConsoleBase.info')
   @DocsEditable()
   @Experimental() // untriaged
-  void info(Object arg) => _blink.BlinkConsoleBase.instance.info_Callback_1_(unwrap_jso(this), arg);
+  void info(Object arg) => _blink.BlinkConsoleBase.instance.info_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.log')
   @DocsEditable()
   @Experimental() // untriaged
-  void log(Object arg) => _blink.BlinkConsoleBase.instance.log_Callback_1_(unwrap_jso(this), arg);
+  void log(Object arg) => _blink.BlinkConsoleBase.instance.log_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.markTimeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void markTimeline(String title) => _blink.BlinkConsoleBase.instance.markTimeline_Callback_1_(unwrap_jso(this), title);
+  void markTimeline(String title) => _blink.BlinkConsoleBase.instance.markTimeline_Callback_1_(this, title);
   
   @DomName('ConsoleBase.profile')
   @DocsEditable()
   @Experimental() // untriaged
-  void profile(String title) => _blink.BlinkConsoleBase.instance.profile_Callback_1_(unwrap_jso(this), title);
+  void profile(String title) => _blink.BlinkConsoleBase.instance.profile_Callback_1_(this, title);
   
   @DomName('ConsoleBase.profileEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void profileEnd(String title) => _blink.BlinkConsoleBase.instance.profileEnd_Callback_1_(unwrap_jso(this), title);
+  void profileEnd(String title) => _blink.BlinkConsoleBase.instance.profileEnd_Callback_1_(this, title);
   
   @DomName('ConsoleBase.table')
   @DocsEditable()
   @Experimental() // untriaged
-  void table(Object arg) => _blink.BlinkConsoleBase.instance.table_Callback_1_(unwrap_jso(this), arg);
+  void table(Object arg) => _blink.BlinkConsoleBase.instance.table_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.time')
   @DocsEditable()
   @Experimental() // untriaged
-  void time(String title) => _blink.BlinkConsoleBase.instance.time_Callback_1_(unwrap_jso(this), title);
+  void time(String title) => _blink.BlinkConsoleBase.instance.time_Callback_1_(this, title);
   
   @DomName('ConsoleBase.timeEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeEnd(String title) => _blink.BlinkConsoleBase.instance.timeEnd_Callback_1_(unwrap_jso(this), title);
+  void timeEnd(String title) => _blink.BlinkConsoleBase.instance.timeEnd_Callback_1_(this, title);
   
   @DomName('ConsoleBase.timeStamp')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeStamp(String title) => _blink.BlinkConsoleBase.instance.timeStamp_Callback_1_(unwrap_jso(this), title);
+  void timeStamp(String title) => _blink.BlinkConsoleBase.instance.timeStamp_Callback_1_(this, title);
   
   @DomName('ConsoleBase.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeline(String title) => _blink.BlinkConsoleBase.instance.timeline_Callback_1_(unwrap_jso(this), title);
+  void timeline(String title) => _blink.BlinkConsoleBase.instance.timeline_Callback_1_(this, title);
   
   @DomName('ConsoleBase.timelineEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timelineEnd(String title) => _blink.BlinkConsoleBase.instance.timelineEnd_Callback_1_(unwrap_jso(this), title);
+  void timelineEnd(String title) => _blink.BlinkConsoleBase.instance.timelineEnd_Callback_1_(this, title);
   
   @DomName('ConsoleBase.trace')
   @DocsEditable()
   @Experimental() // untriaged
-  void trace(Object arg) => _blink.BlinkConsoleBase.instance.trace_Callback_1_(unwrap_jso(this), arg);
+  void trace(Object arg) => _blink.BlinkConsoleBase.instance.trace_Callback_1_(this, arg);
   
   @DomName('ConsoleBase.warn')
   @DocsEditable()
   @Experimental() // untriaged
-  void warn(Object arg) => _blink.BlinkConsoleBase.instance.warn_Callback_1_(unwrap_jso(this), arg);
+  void warn(Object arg) => _blink.BlinkConsoleBase.instance.warn_Callback_1_(this, arg);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5688,11 +4852,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ContentElement internalCreateContentElement() {
-    return new ContentElement._internalWrap();
-  }
-
-  external factory ContentElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ContentElement.internal_() : super.internal_();
@@ -5709,15 +4869,15 @@
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  String get select => _blink.BlinkHTMLContentElement.instance.select_Getter_(unwrap_jso(this));
+  String get select => _blink.BlinkHTMLContentElement.instance.select_Getter_(this);
   
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  set select(String value) => _blink.BlinkHTMLContentElement.instance.select_Setter_(unwrap_jso(this), value);
+  set select(String value) => _blink.BlinkHTMLContentElement.instance.select_Setter_(this, value);
   
   @DomName('HTMLContentElement.getDistributedNodes')
   @DocsEditable()
-  List<Node> getDistributedNodes() => wrap_jso(_blink.BlinkHTMLContentElement.instance.getDistributedNodes_Callback_0_(unwrap_jso(this)));
+  List<Node> getDistributedNodes() => (_blink.BlinkHTMLContentElement.instance.getDistributedNodes_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5733,48 +4893,40 @@
   // To suppress missing implicit constructor warnings.
   factory Coordinates._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Coordinates internalCreateCoordinates() {
-    return new Coordinates._internalWrap();
-  }
 
-  factory Coordinates._internalWrap() {
-    return new Coordinates.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Coordinates.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  num get accuracy => _blink.BlinkCoordinates.instance.accuracy_Getter_(unwrap_jso(this));
+  num get accuracy => _blink.BlinkCoordinates.instance.accuracy_Getter_(this);
   
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  num get altitude => _blink.BlinkCoordinates.instance.altitude_Getter_(unwrap_jso(this));
+  num get altitude => _blink.BlinkCoordinates.instance.altitude_Getter_(this);
   
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  num get altitudeAccuracy => _blink.BlinkCoordinates.instance.altitudeAccuracy_Getter_(unwrap_jso(this));
+  num get altitudeAccuracy => _blink.BlinkCoordinates.instance.altitudeAccuracy_Getter_(this);
   
   @DomName('Coordinates.heading')
   @DocsEditable()
-  num get heading => _blink.BlinkCoordinates.instance.heading_Getter_(unwrap_jso(this));
+  num get heading => _blink.BlinkCoordinates.instance.heading_Getter_(this);
   
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  num get latitude => _blink.BlinkCoordinates.instance.latitude_Getter_(unwrap_jso(this));
+  num get latitude => _blink.BlinkCoordinates.instance.latitude_Getter_(this);
   
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  num get longitude => _blink.BlinkCoordinates.instance.longitude_Getter_(unwrap_jso(this));
+  num get longitude => _blink.BlinkCoordinates.instance.longitude_Getter_(this);
   
   @DomName('Coordinates.speed')
   @DocsEditable()
-  num get speed => _blink.BlinkCoordinates.instance.speed_Getter_(unwrap_jso(this));
+  num get speed => _blink.BlinkCoordinates.instance.speed_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5791,40 +4943,32 @@
   // To suppress missing implicit constructor warnings.
   factory Credential._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Credential internalCreateCredential() {
-    return new Credential._internalWrap();
-  }
 
-  factory Credential._internalWrap() {
-    return new Credential.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Credential.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Credential.iconURL')
   @DocsEditable()
   @Experimental() // untriaged
-  String get iconUrl => _blink.BlinkCredential.instance.iconURL_Getter_(unwrap_jso(this));
+  String get iconUrl => _blink.BlinkCredential.instance.iconURL_Getter_(this);
   
   @DomName('Credential.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkCredential.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkCredential.instance.id_Getter_(this);
   
   @DomName('Credential.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkCredential.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkCredential.instance.name_Getter_(this);
   
   @DomName('Credential.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkCredential.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkCredential.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5841,37 +4985,29 @@
   // To suppress missing implicit constructor warnings.
   factory CredentialsContainer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CredentialsContainer internalCreateCredentialsContainer() {
-    return new CredentialsContainer._internalWrap();
-  }
 
-  factory CredentialsContainer._internalWrap() {
-    return new CredentialsContainer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CredentialsContainer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CredentialsContainer.notifySignedIn')
   @DocsEditable()
   @Experimental() // untriaged
-  Future notifySignedIn(Credential credential) => wrap_jso(_blink.BlinkCredentialsContainer.instance.notifySignedIn_Callback_1_(unwrap_jso(this), unwrap_jso(credential)));
+  Future notifySignedIn(Credential credential) => convertNativePromiseToDartFuture(_blink.BlinkCredentialsContainer.instance.notifySignedIn_Callback_1_(this, credential));
   
   Future request([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkCredentialsContainer.instance.request_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkCredentialsContainer.instance.request_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkCredentialsContainer.instance.request_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkCredentialsContainer.instance.request_Callback_0_(this);
   }
 
   @DomName('CredentialsContainer.requireUserMediation')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requireUserMediation() => wrap_jso(_blink.BlinkCredentialsContainer.instance.requireUserMediation_Callback_0_(unwrap_jso(this)));
+  Future requireUserMediation() => convertNativePromiseToDartFuture(_blink.BlinkCredentialsContainer.instance.requireUserMediation_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5890,11 +5026,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CrossOriginConnectEvent internalCreateCrossOriginConnectEvent() {
-    return new CrossOriginConnectEvent._internalWrap();
-  }
-
-  external factory CrossOriginConnectEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CrossOriginConnectEvent.internal_() : super.internal_();
@@ -5903,12 +5035,12 @@
   @DomName('CrossOriginConnectEvent.client')
   @DocsEditable()
   @Experimental() // untriaged
-  CrossOriginServiceWorkerClient get client => wrap_jso(_blink.BlinkCrossOriginConnectEvent.instance.client_Getter_(unwrap_jso(this)));
+  CrossOriginServiceWorkerClient get client => _blink.BlinkCrossOriginConnectEvent.instance.client_Getter_(this);
   
   @DomName('CrossOriginConnectEvent.acceptConnection')
   @DocsEditable()
   @Experimental() // untriaged
-  void acceptConnection(Future shouldAccept) => _blink.BlinkCrossOriginConnectEvent.instance.acceptConnection_Callback_1_(unwrap_jso(this), shouldAccept);
+  void acceptConnection(Future shouldAccept) => _blink.BlinkCrossOriginConnectEvent.instance.acceptConnection_Callback_1_(this, shouldAccept);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5927,11 +5059,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CrossOriginServiceWorkerClient internalCreateCrossOriginServiceWorkerClient() {
-    return new CrossOriginServiceWorkerClient._internalWrap();
-  }
-
-  external factory CrossOriginServiceWorkerClient._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CrossOriginServiceWorkerClient.internal_() : super.internal_();
@@ -5940,19 +5068,19 @@
   @DomName('CrossOriginServiceWorkerClient.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkCrossOriginServiceWorkerClient.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkCrossOriginServiceWorkerClient.instance.origin_Getter_(this);
   
   @DomName('CrossOriginServiceWorkerClient.targetUrl')
   @DocsEditable()
   @Experimental() // untriaged
-  String get targetUrl => _blink.BlinkCrossOriginServiceWorkerClient.instance.targetUrl_Getter_(unwrap_jso(this));
+  String get targetUrl => _blink.BlinkCrossOriginServiceWorkerClient.instance.targetUrl_Getter_(this);
   
   void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkCrossOriginServiceWorkerClient.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkCrossOriginServiceWorkerClient.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkCrossOriginServiceWorkerClient.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkCrossOriginServiceWorkerClient.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
@@ -5984,32 +5112,24 @@
   // To suppress missing implicit constructor warnings.
   factory Crypto._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Crypto internalCreateCrypto() {
-    return new Crypto._internalWrap();
-  }
 
-  factory Crypto._internalWrap() {
-    return new Crypto.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Crypto.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('Crypto.subtle')
   @DocsEditable()
   @Experimental() // untriaged
-  _SubtleCrypto get subtle => wrap_jso(_blink.BlinkCrypto.instance.subtle_Getter_(unwrap_jso(this)));
+  _SubtleCrypto get subtle => _blink.BlinkCrypto.instance.subtle_Getter_(this);
   
   @DomName('Crypto.getRandomValues')
   @DocsEditable()
-  TypedData _getRandomValues(TypedData array) => wrap_jso(_blink.BlinkCrypto.instance.getRandomValues_Callback_1_(unwrap_jso(this), unwrap_jso(array)));
+  TypedData _getRandomValues(TypedData array) => _blink.BlinkCrypto.instance.getRandomValues_Callback_1_(this, array);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6026,40 +5146,32 @@
   // To suppress missing implicit constructor warnings.
   factory CryptoKey._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CryptoKey internalCreateCryptoKey() {
-    return new CryptoKey._internalWrap();
-  }
 
-  factory CryptoKey._internalWrap() {
-    return new CryptoKey.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CryptoKey.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CryptoKey.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get algorithm => wrap_jso(_blink.BlinkCryptoKey.instance.algorithm_Getter_(unwrap_jso(this)));
+  Object get algorithm => (_blink.BlinkCryptoKey.instance.algorithm_Getter_(this));
   
   @DomName('CryptoKey.extractable')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get extractable => _blink.BlinkCryptoKey.instance.extractable_Getter_(unwrap_jso(this));
+  bool get extractable => _blink.BlinkCryptoKey.instance.extractable_Getter_(this);
   
   @DomName('CryptoKey.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkCryptoKey.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkCryptoKey.instance.type_Getter_(this);
   
   @DomName('CryptoKey.usages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get usages => _blink.BlinkCryptoKey.instance.usages_Getter_(unwrap_jso(this));
+  List<String> get usages => _blink.BlinkCryptoKey.instance.usages_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6077,21 +5189,13 @@
   // To suppress missing implicit constructor warnings.
   factory Css._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Css internalCreateCss() {
-    return new Css._internalWrap();
-  }
 
-  factory Css._internalWrap() {
-    return new Css.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Css.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CSS.supports')
   @DocsEditable()
   static bool supports(String property, String value) => _blink.BlinkCSS.instance.supports_Callback_2_(property, value);
@@ -6118,11 +5222,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssCharsetRule internalCreateCssCharsetRule() {
-    return new CssCharsetRule._internalWrap();
-  }
-
-  external factory CssCharsetRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssCharsetRule.internal_() : super.internal_();
@@ -6130,11 +5230,11 @@
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  String get encoding => _blink.BlinkCSSCharsetRule.instance.encoding_Getter_(unwrap_jso(this));
+  String get encoding => _blink.BlinkCSSCharsetRule.instance.encoding_Getter_(this);
   
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  set encoding(String value) => _blink.BlinkCSSCharsetRule.instance.encoding_Setter_(unwrap_jso(this), value);
+  set encoding(String value) => _blink.BlinkCSSCharsetRule.instance.encoding_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6152,11 +5252,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssFontFaceRule internalCreateCssFontFaceRule() {
-    return new CssFontFaceRule._internalWrap();
-  }
-
-  external factory CssFontFaceRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssFontFaceRule.internal_() : super.internal_();
@@ -6164,7 +5260,7 @@
 
   @DomName('CSSFontFaceRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkCSSFontFaceRule.instance.style_Getter_(unwrap_jso(this)));
+  CssStyleDeclaration get style => _blink.BlinkCSSFontFaceRule.instance.style_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6183,11 +5279,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssGroupingRule internalCreateCssGroupingRule() {
-    return new CssGroupingRule._internalWrap();
-  }
-
-  external factory CssGroupingRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssGroupingRule.internal_() : super.internal_();
@@ -6196,17 +5288,17 @@
   @DomName('CSSGroupingRule.cssRules')
   @DocsEditable()
   @Experimental() // untriaged
-  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSGroupingRule.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => _blink.BlinkCSSGroupingRule.instance.cssRules_Getter_(this);
   
   @DomName('CSSGroupingRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(int index) => _blink.BlinkCSSGroupingRule.instance.deleteRule_Callback_1_(unwrap_jso(this), index);
+  void deleteRule(int index) => _blink.BlinkCSSGroupingRule.instance.deleteRule_Callback_1_(this, index);
   
   @DomName('CSSGroupingRule.insertRule')
   @DocsEditable()
   @Experimental() // untriaged
-  int insertRule(String rule, int index) => _blink.BlinkCSSGroupingRule.instance.insertRule_Callback_2_(unwrap_jso(this), rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSGroupingRule.instance.insertRule_Callback_2_(this, rule, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6224,11 +5316,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssImportRule internalCreateCssImportRule() {
-    return new CssImportRule._internalWrap();
-  }
-
-  external factory CssImportRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssImportRule.internal_() : super.internal_();
@@ -6236,15 +5324,15 @@
 
   @DomName('CSSImportRule.href')
   @DocsEditable()
-  String get href => _blink.BlinkCSSImportRule.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkCSSImportRule.instance.href_Getter_(this);
   
   @DomName('CSSImportRule.media')
   @DocsEditable()
-  MediaList get media => wrap_jso(_blink.BlinkCSSImportRule.instance.media_Getter_(unwrap_jso(this)));
+  MediaList get media => _blink.BlinkCSSImportRule.instance.media_Getter_(this);
   
   @DomName('CSSImportRule.styleSheet')
   @DocsEditable()
-  CssStyleSheet get styleSheet => wrap_jso(_blink.BlinkCSSImportRule.instance.styleSheet_Getter_(unwrap_jso(this)));
+  CssStyleSheet get styleSheet => _blink.BlinkCSSImportRule.instance.styleSheet_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6263,11 +5351,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssKeyframeRule internalCreateCssKeyframeRule() {
-    return new CssKeyframeRule._internalWrap();
-  }
-
-  external factory CssKeyframeRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssKeyframeRule.internal_() : super.internal_();
@@ -6276,17 +5360,17 @@
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  String get keyText => _blink.BlinkCSSKeyframeRule.instance.keyText_Getter_(unwrap_jso(this));
+  String get keyText => _blink.BlinkCSSKeyframeRule.instance.keyText_Getter_(this);
   
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  set keyText(String value) => _blink.BlinkCSSKeyframeRule.instance.keyText_Setter_(unwrap_jso(this), value);
+  set keyText(String value) => _blink.BlinkCSSKeyframeRule.instance.keyText_Setter_(this, value);
   
   @DomName('CSSKeyframeRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkCSSKeyframeRule.instance.style_Getter_(unwrap_jso(this)));
+  CssStyleDeclaration get style => _blink.BlinkCSSKeyframeRule.instance.style_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6305,11 +5389,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssKeyframesRule internalCreateCssKeyframesRule() {
-    return new CssKeyframesRule._internalWrap();
-  }
-
-  external factory CssKeyframesRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssKeyframesRule.internal_() : super.internal_();
@@ -6318,37 +5398,37 @@
   @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
   @Experimental() // untriaged
-  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => _blink.BlinkCSSKeyframesRule.instance.cssRules_Getter_(this);
   
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkCSSKeyframesRule.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkCSSKeyframesRule.instance.name_Getter_(this);
   
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  set name(String value) => _blink.BlinkCSSKeyframesRule.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkCSSKeyframesRule.instance.name_Setter_(this, value);
   
   @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule __getter__(int index) => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.$__getter___Callback_1_(unwrap_jso(this), index));
+  CssKeyframeRule __getter__(int index) => _blink.BlinkCSSKeyframesRule.instance.$__getter___Callback_1_(this, index);
   
   @DomName('CSSKeyframesRule.appendRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.instance.appendRule_Callback_1_(unwrap_jso(this), rule);
+  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.instance.appendRule_Callback_1_(this, rule);
   
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String select) => _blink.BlinkCSSKeyframesRule.instance.deleteRule_Callback_1_(unwrap_jso(this), select);
+  void deleteRule(String select) => _blink.BlinkCSSKeyframesRule.instance.deleteRule_Callback_1_(this, select);
   
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String select) => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.findRule_Callback_1_(unwrap_jso(this), select));
+  CssKeyframeRule findRule(String select) => _blink.BlinkCSSKeyframesRule.instance.findRule_Callback_1_(this, select);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6366,11 +5446,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssMediaRule internalCreateCssMediaRule() {
-    return new CssMediaRule._internalWrap();
-  }
-
-  external factory CssMediaRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssMediaRule.internal_() : super.internal_();
@@ -6378,7 +5454,7 @@
 
   @DomName('CSSMediaRule.media')
   @DocsEditable()
-  MediaList get media => wrap_jso(_blink.BlinkCSSMediaRule.instance.media_Getter_(unwrap_jso(this)));
+  MediaList get media => _blink.BlinkCSSMediaRule.instance.media_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6396,11 +5472,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssPageRule internalCreateCssPageRule() {
-    return new CssPageRule._internalWrap();
-  }
-
-  external factory CssPageRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssPageRule.internal_() : super.internal_();
@@ -6408,15 +5480,15 @@
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.BlinkCSSPageRule.instance.selectorText_Getter_(unwrap_jso(this));
+  String get selectorText => _blink.BlinkCSSPageRule.instance.selectorText_Getter_(this);
   
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  set selectorText(String value) => _blink.BlinkCSSPageRule.instance.selectorText_Setter_(unwrap_jso(this), value);
+  set selectorText(String value) => _blink.BlinkCSSPageRule.instance.selectorText_Setter_(this, value);
   
   @DomName('CSSPageRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkCSSPageRule.instance.style_Getter_(unwrap_jso(this)));
+  CssStyleDeclaration get style => _blink.BlinkCSSPageRule.instance.style_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6432,21 +5504,13 @@
   // To suppress missing implicit constructor warnings.
   factory CssRule._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CssRule internalCreateCssRule() {
-    return new CssRule._internalWrap();
-  }
 
-  factory CssRule._internalWrap() {
-    return new CssRule.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssRule.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CSSRule.CHARSET_RULE')
   @DocsEditable()
   static const int CHARSET_RULE = 2;
@@ -6504,23 +5568,23 @@
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  String get cssText => _blink.BlinkCSSRule.instance.cssText_Getter_(unwrap_jso(this));
+  String get cssText => _blink.BlinkCSSRule.instance.cssText_Getter_(this);
   
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  set cssText(String value) => _blink.BlinkCSSRule.instance.cssText_Setter_(unwrap_jso(this), value);
+  set cssText(String value) => _blink.BlinkCSSRule.instance.cssText_Setter_(this, value);
   
   @DomName('CSSRule.parentRule')
   @DocsEditable()
-  CssRule get parentRule => wrap_jso(_blink.BlinkCSSRule.instance.parentRule_Getter_(unwrap_jso(this)));
+  CssRule get parentRule => _blink.BlinkCSSRule.instance.parentRule_Getter_(this);
   
   @DomName('CSSRule.parentStyleSheet')
   @DocsEditable()
-  CssStyleSheet get parentStyleSheet => wrap_jso(_blink.BlinkCSSRule.instance.parentStyleSheet_Getter_(unwrap_jso(this)));
+  CssStyleSheet get parentStyleSheet => _blink.BlinkCSSRule.instance.parentStyleSheet_Getter_(this);
   
   @DomName('CSSRule.type')
   @DocsEditable()
-  int get type => _blink.BlinkCSSRule.instance.type_Getter_(unwrap_jso(this));
+  int get type => _blink.BlinkCSSRule.instance.type_Getter_(this);
   
 }
 
@@ -6582,7 +5646,7 @@
   }
 
   bool _hasProperty(String propertyName) =>
-      _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(unwrap_jso(this), propertyName) != null;
+      _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(this, propertyName);
 
   @DomName('CSSStyleDeclaration.setProperty')
   void setProperty(String propertyName, String value, [String priority]) {
@@ -6626,61 +5690,53 @@
   // To suppress missing implicit constructor warnings.
   factory CssStyleDeclaration._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CssStyleDeclaration internalCreateCssStyleDeclaration() {
-    return new CssStyleDeclaration._internalWrap();
-  }
 
-  factory CssStyleDeclaration._internalWrap() {
-    return new CssStyleDeclaration.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssStyleDeclaration.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  String get cssText => _blink.BlinkCSSStyleDeclaration.instance.cssText_Getter_(unwrap_jso(this));
+  String get cssText => _blink.BlinkCSSStyleDeclaration.instance.cssText_Getter_(this);
   
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  set cssText(String value) => _blink.BlinkCSSStyleDeclaration.instance.cssText_Setter_(unwrap_jso(this), value);
+  set cssText(String value) => _blink.BlinkCSSStyleDeclaration.instance.cssText_Setter_(this, value);
   
   @DomName('CSSStyleDeclaration.length')
   @DocsEditable()
-  int get length => _blink.BlinkCSSStyleDeclaration.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkCSSStyleDeclaration.instance.length_Getter_(this);
   
   @DomName('CSSStyleDeclaration.parentRule')
   @DocsEditable()
-  CssRule get parentRule => wrap_jso(_blink.BlinkCSSStyleDeclaration.instance.parentRule_Getter_(unwrap_jso(this)));
+  CssRule get parentRule => _blink.BlinkCSSStyleDeclaration.instance.parentRule_Getter_(this);
   
   @DomName('CSSStyleDeclaration.__propertyQuery__')
   @DocsEditable()
   @Experimental() // untriaged
-  bool __propertyQuery__(String name) => _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(unwrap_jso(this), name);
+  bool __propertyQuery__(String name) => _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(this, name);
   
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String property) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyPriority_Callback_1_(unwrap_jso(this), property);
+  String getPropertyPriority(String property) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyPriority_Callback_1_(this, property);
   
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String property) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyValue_Callback_1_(unwrap_jso(this), property);
+  String _getPropertyValue(String property) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyValue_Callback_1_(this, property);
   
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkCSSStyleDeclaration.instance.item_Callback_1_(unwrap_jso(this), index);
+  String item(int index) => _blink.BlinkCSSStyleDeclaration.instance.item_Callback_1_(this, index);
   
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String property) => _blink.BlinkCSSStyleDeclaration.instance.removeProperty_Callback_1_(unwrap_jso(this), property);
+  String removeProperty(String property) => _blink.BlinkCSSStyleDeclaration.instance.removeProperty_Callback_1_(this, property);
   
   @DomName('CSSStyleDeclaration.setProperty')
   @DocsEditable()
-  void _setProperty(String property, String value, String priority) => _blink.BlinkCSSStyleDeclaration.instance.setProperty_Callback_3_(unwrap_jso(this), property, value, priority);
+  void _setProperty(String property, String value, String priority) => _blink.BlinkCSSStyleDeclaration.instance.setProperty_Callback_3_(this, property, value, priority);
   
 }
 
@@ -9816,11 +8872,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssStyleRule internalCreateCssStyleRule() {
-    return new CssStyleRule._internalWrap();
-  }
-
-  external factory CssStyleRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssStyleRule.internal_() : super.internal_();
@@ -9828,15 +8880,15 @@
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.BlinkCSSStyleRule.instance.selectorText_Getter_(unwrap_jso(this));
+  String get selectorText => _blink.BlinkCSSStyleRule.instance.selectorText_Getter_(this);
   
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  set selectorText(String value) => _blink.BlinkCSSStyleRule.instance.selectorText_Setter_(unwrap_jso(this), value);
+  set selectorText(String value) => _blink.BlinkCSSStyleRule.instance.selectorText_Setter_(this, value);
   
   @DomName('CSSStyleRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkCSSStyleRule.instance.style_Getter_(unwrap_jso(this)));
+  CssStyleDeclaration get style => _blink.BlinkCSSStyleRule.instance.style_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9854,11 +8906,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssStyleSheet internalCreateCssStyleSheet() {
-    return new CssStyleSheet._internalWrap();
-  }
-
-  external factory CssStyleSheet._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssStyleSheet.internal_() : super.internal_();
@@ -9866,39 +8914,39 @@
 
   @DomName('CSSStyleSheet.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSStyleSheet.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => _blink.BlinkCSSStyleSheet.instance.cssRules_Getter_(this);
   
   @DomName('CSSStyleSheet.ownerRule')
   @DocsEditable()
-  CssRule get ownerRule => wrap_jso(_blink.BlinkCSSStyleSheet.instance.ownerRule_Getter_(unwrap_jso(this)));
+  CssRule get ownerRule => _blink.BlinkCSSStyleSheet.instance.ownerRule_Getter_(this);
   
   @DomName('CSSStyleSheet.rules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> get rules => wrap_jso(_blink.BlinkCSSStyleSheet.instance.rules_Getter_(unwrap_jso(this)));
+  List<CssRule> get rules => _blink.BlinkCSSStyleSheet.instance.rules_Getter_(this);
   
   int addRule(String selector, String style, [int index]) {
     if (index != null) {
-      return _blink.BlinkCSSStyleSheet.instance.addRule_Callback_3_(unwrap_jso(this), selector, style, index);
+      return _blink.BlinkCSSStyleSheet.instance.addRule_Callback_3_(this, selector, style, index);
     }
-    return _blink.BlinkCSSStyleSheet.instance.addRule_Callback_2_(unwrap_jso(this), selector, style);
+    return _blink.BlinkCSSStyleSheet.instance.addRule_Callback_2_(this, selector, style);
   }
 
   @DomName('CSSStyleSheet.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.BlinkCSSStyleSheet.instance.deleteRule_Callback_1_(unwrap_jso(this), index);
+  void deleteRule(int index) => _blink.BlinkCSSStyleSheet.instance.deleteRule_Callback_1_(this, index);
   
   int insertRule(String rule, [int index]) {
     if (index != null) {
-      return _blink.BlinkCSSStyleSheet.instance.insertRule_Callback_2_(unwrap_jso(this), rule, index);
+      return _blink.BlinkCSSStyleSheet.instance.insertRule_Callback_2_(this, rule, index);
     }
-    return _blink.BlinkCSSStyleSheet.instance.insertRule_Callback_1_(unwrap_jso(this), rule);
+    return _blink.BlinkCSSStyleSheet.instance.insertRule_Callback_1_(this, rule);
   }
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable()
   @Experimental() // non-standard
-  void removeRule(int index) => _blink.BlinkCSSStyleSheet.instance.removeRule_Callback_1_(unwrap_jso(this), index);
+  void removeRule(int index) => _blink.BlinkCSSStyleSheet.instance.removeRule_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9916,11 +8964,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssSupportsRule internalCreateCssSupportsRule() {
-    return new CssSupportsRule._internalWrap();
-  }
-
-  external factory CssSupportsRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssSupportsRule.internal_() : super.internal_();
@@ -9928,19 +8972,19 @@
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable()
-  String get conditionText => _blink.BlinkCSSSupportsRule.instance.conditionText_Getter_(unwrap_jso(this));
+  String get conditionText => _blink.BlinkCSSSupportsRule.instance.conditionText_Getter_(this);
   
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSSupportsRule.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => _blink.BlinkCSSSupportsRule.instance.cssRules_Getter_(this);
   
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.BlinkCSSSupportsRule.instance.deleteRule_Callback_1_(unwrap_jso(this), index);
+  void deleteRule(int index) => _blink.BlinkCSSSupportsRule.instance.deleteRule_Callback_1_(this, index);
   
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) => _blink.BlinkCSSSupportsRule.instance.insertRule_Callback_2_(unwrap_jso(this), rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSSupportsRule.instance.insertRule_Callback_2_(this, rule, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9959,11 +9003,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CssViewportRule internalCreateCssViewportRule() {
-    return new CssViewportRule._internalWrap();
-  }
-
-  external factory CssViewportRule._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CssViewportRule.internal_() : super.internal_();
@@ -9972,7 +9012,7 @@
   @DomName('CSSViewportRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkCSSViewportRule.instance.style_Getter_(unwrap_jso(this)));
+  CssStyleDeclaration get style => _blink.BlinkCSSViewportRule.instance.style_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9997,6 +9037,7 @@
     // first-chance exceptions. Can expand this list in the future as needed.
     if (detail is List || detail is Map || detail is String || detail is num) {
       try {
+        detail = convertDartToNative_SerializedScriptValue(detail);
         e._initCustomEvent(type, canBubble, cancelable, detail);
       } catch(_) {
         e._initCustomEvent(type, canBubble, cancelable, null);
@@ -10005,9 +9046,6 @@
       e._initCustomEvent(type, canBubble, cancelable, null);
     }
 
-    // Need for identity.
-    js.setDartHtmlWrapperFor(e.blink_jsObject, e);
-
     return e;
   }
 
@@ -10024,18 +9062,14 @@
   factory CustomEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkCustomEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkCustomEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkCustomEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkCustomEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static CustomEvent internalCreateCustomEvent() {
-    return new CustomEvent._internalWrap();
-  }
-
-  external factory CustomEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CustomEvent.internal_() : super.internal_();
@@ -10043,11 +9077,11 @@
 
   @DomName('CustomEvent.detail')
   @DocsEditable()
-  Object get _detail => wrap_jso(_blink.BlinkCustomEvent.instance.detail_Getter_(unwrap_jso(this)));
+  Object get _detail => convertNativeToDart_SerializedScriptValue(_blink.BlinkCustomEvent.instance.detail_Getter_(this));
   
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String type, bool bubbles, bool cancelable, Object detail) => _blink.BlinkCustomEvent.instance.initCustomEvent_Callback_4_(unwrap_jso(this), type, bubbles, cancelable, detail);
+  void _initCustomEvent(String type, bool bubbles, bool cancelable, Object detail) => _blink.BlinkCustomEvent.instance.initCustomEvent_Callback_4_(this, type, bubbles, cancelable, detail);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10069,11 +9103,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DListElement internalCreateDListElement() {
-    return new DListElement._internalWrap();
-  }
-
-  external factory DListElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DListElement.internal_() : super.internal_();
@@ -10109,11 +9139,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DataListElement internalCreateDataListElement() {
-    return new DataListElement._internalWrap();
-  }
-
-  external factory DataListElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DataListElement.internal_() : super.internal_();
@@ -10130,7 +9156,7 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  List<Node> get options => wrap_jso(_blink.BlinkHTMLDataListElement.instance.options_Getter_(unwrap_jso(this)));
+  List<Node> get options => (_blink.BlinkHTMLDataListElement.instance.options_Getter_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10147,79 +9173,71 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransfer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DataTransfer internalCreateDataTransfer() {
-    return new DataTransfer._internalWrap();
-  }
 
-  factory DataTransfer._internalWrap() {
-    return new DataTransfer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DataTransfer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dropEffect => _blink.BlinkDataTransfer.instance.dropEffect_Getter_(unwrap_jso(this));
+  String get dropEffect => _blink.BlinkDataTransfer.instance.dropEffect_Getter_(this);
   
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
   @Experimental() // untriaged
-  set dropEffect(String value) => _blink.BlinkDataTransfer.instance.dropEffect_Setter_(unwrap_jso(this), value);
+  set dropEffect(String value) => _blink.BlinkDataTransfer.instance.dropEffect_Setter_(this, value);
   
   @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
   @Experimental() // untriaged
-  String get effectAllowed => _blink.BlinkDataTransfer.instance.effectAllowed_Getter_(unwrap_jso(this));
+  String get effectAllowed => _blink.BlinkDataTransfer.instance.effectAllowed_Getter_(this);
   
   @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
   @Experimental() // untriaged
-  set effectAllowed(String value) => _blink.BlinkDataTransfer.instance.effectAllowed_Setter_(unwrap_jso(this), value);
+  set effectAllowed(String value) => _blink.BlinkDataTransfer.instance.effectAllowed_Setter_(this, value);
   
   @DomName('DataTransfer.files')
   @DocsEditable()
   @Experimental() // untriaged
-  List<File> get files => wrap_jso(_blink.BlinkDataTransfer.instance.files_Getter_(unwrap_jso(this)));
+  List<File> get files => (_blink.BlinkDataTransfer.instance.files_Getter_(this));
   
   @DomName('DataTransfer.items')
   @DocsEditable()
   @Experimental() // untriaged
-  DataTransferItemList get items => wrap_jso(_blink.BlinkDataTransfer.instance.items_Getter_(unwrap_jso(this)));
+  DataTransferItemList get items => _blink.BlinkDataTransfer.instance.items_Getter_(this);
   
   @DomName('DataTransfer.types')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get types => _blink.BlinkDataTransfer.instance.types_Getter_(unwrap_jso(this));
+  List<String> get types => _blink.BlinkDataTransfer.instance.types_Getter_(this);
   
   void clearData([String format]) {
     if (format != null) {
-      _blink.BlinkDataTransfer.instance.clearData_Callback_1_(unwrap_jso(this), format);
+      _blink.BlinkDataTransfer.instance.clearData_Callback_1_(this, format);
       return;
     }
-    _blink.BlinkDataTransfer.instance.clearData_Callback_0_(unwrap_jso(this));
+    _blink.BlinkDataTransfer.instance.clearData_Callback_0_(this);
     return;
   }
 
   @DomName('DataTransfer.getData')
   @DocsEditable()
   @Experimental() // untriaged
-  String getData(String format) => _blink.BlinkDataTransfer.instance.getData_Callback_1_(unwrap_jso(this), format);
+  String getData(String format) => _blink.BlinkDataTransfer.instance.getData_Callback_1_(this, format);
   
   @DomName('DataTransfer.setData')
   @DocsEditable()
   @Experimental() // untriaged
-  void setData(String format, String data) => _blink.BlinkDataTransfer.instance.setData_Callback_2_(unwrap_jso(this), format, data);
+  void setData(String format, String data) => _blink.BlinkDataTransfer.instance.setData_Callback_2_(this, format, data);
   
   @DomName('DataTransfer.setDragImage')
   @DocsEditable()
   @Experimental() // untriaged
-  void setDragImage(Element image, int x, int y) => _blink.BlinkDataTransfer.instance.setDragImage_Callback_3_(unwrap_jso(this), unwrap_jso(image), x, y);
+  void setDragImage(Element image, int x, int y) => _blink.BlinkDataTransfer.instance.setDragImage_Callback_3_(this, image, x, y);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10237,36 +9255,28 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransferItem._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DataTransferItem internalCreateDataTransferItem() {
-    return new DataTransferItem._internalWrap();
-  }
 
-  factory DataTransferItem._internalWrap() {
-    return new DataTransferItem.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DataTransferItem.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DataTransferItem.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkDataTransferItem.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkDataTransferItem.instance.kind_Getter_(this);
   
   @DomName('DataTransferItem.type')
   @DocsEditable()
-  String get type => _blink.BlinkDataTransferItem.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkDataTransferItem.instance.type_Getter_(this);
   
   @DomName('DataTransferItem.getAsFile')
   @DocsEditable()
-  Blob getAsFile() => wrap_jso(_blink.BlinkDataTransferItem.instance.getAsFile_Callback_0_(unwrap_jso(this)));
+  Blob getAsFile() => _blink.BlinkDataTransferItem.instance.getAsFile_Callback_0_(this);
   
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
-  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.instance.getAsString_Callback_1_(unwrap_jso(this), unwrap_jso((data) => callback(data)));
+  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.instance.getAsString_Callback_1_(this, callback);
   
   Future<String> getAsString() {
     var completer = new Completer<String>();
@@ -10280,7 +9290,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Entry getAsEntry() => wrap_jso(_blink.BlinkDataTransferItem.instance.webkitGetAsEntry_Callback_0_(unwrap_jso(this)));
+  Entry getAsEntry() => _blink.BlinkDataTransferItem.instance.webkitGetAsEntry_Callback_0_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -10296,62 +9306,54 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransferItemList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DataTransferItemList internalCreateDataTransferItemList() {
-    return new DataTransferItemList._internalWrap();
-  }
 
-  factory DataTransferItemList._internalWrap() {
-    return new DataTransferItemList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DataTransferItemList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DataTransferItemList.length')
   @DocsEditable()
-  int get length => _blink.BlinkDataTransferItemList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkDataTransferItemList.instance.length_Getter_(this);
   
   DataTransferItem add(data_OR_file, [String type]) {
     if ((type is String) && (data_OR_file is String)) {
-      return wrap_jso(_blink.BlinkDataTransferItemList.instance.add_Callback_2_(unwrap_jso(this), unwrap_jso(data_OR_file), type));
+      return _blink.BlinkDataTransferItemList.instance.add_Callback_2_(this, data_OR_file, type);
     }
     if ((data_OR_file is File || data_OR_file == null) && type == null) {
-      return wrap_jso(_blink.BlinkDataTransferItemList.instance.add_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_file)));
+      return _blink.BlinkDataTransferItemList.instance.add_Callback_1_(this, data_OR_file);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('DataTransferItemList.addData')
   @DocsEditable()
-  DataTransferItem addData(String data, String type) => wrap_jso(_blink.BlinkDataTransferItemList.instance.add_Callback_2_(unwrap_jso(this), data, type));
+  DataTransferItem addData(String data, String type) => _blink.BlinkDataTransferItemList.instance.add_Callback_2_(this, data, type);
   
   @DomName('DataTransferItemList.addFile')
   @DocsEditable()
-  DataTransferItem addFile(File file) => wrap_jso(_blink.BlinkDataTransferItemList.instance.add_Callback_1_(unwrap_jso(this), unwrap_jso(file)));
+  DataTransferItem addFile(File file) => _blink.BlinkDataTransferItemList.instance.add_Callback_1_(this, file);
   
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkDataTransferItemList.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkDataTransferItemList.instance.clear_Callback_0_(this);
   
   @DomName('DataTransferItemList.item')
   @DocsEditable()
-  DataTransferItem item(int index) => wrap_jso(_blink.BlinkDataTransferItemList.instance.item_Callback_1_(unwrap_jso(this), index));
+  DataTransferItem item(int index) => _blink.BlinkDataTransferItemList.instance.item_Callback_1_(this, index);
   
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(int index) => _blink.BlinkDataTransferItemList.instance.remove_Callback_1_(unwrap_jso(this), index);
+  void remove(int index) => _blink.BlinkDataTransferItemList.instance.remove_Callback_1_(this, index);
   
 
   DataTransferItem operator[] (int index) {
     // TODO(alanknight): I think that all the __getter__ generators should just
     // do property access, but that's major surgery. This one is a problem, so
     // just hard-code it for now.
-    return _blink.Blink_JsNative_DomException.getProperty(unwrap_jso(this), index);
+    return _blink.Blink_JsNative_DomException.getProperty(this, index);
   }
 
 }
@@ -10393,11 +9395,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DedicatedWorkerGlobalScope internalCreateDedicatedWorkerGlobalScope() {
-    return new DedicatedWorkerGlobalScope._internalWrap();
-  }
-
-  external factory DedicatedWorkerGlobalScope._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DedicatedWorkerGlobalScope.internal_() : super.internal_();
@@ -10405,10 +9403,10 @@
 
   void postMessage(Object message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
@@ -10438,18 +9436,14 @@
   factory DefaultSessionStartEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkDefaultSessionStartEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkDefaultSessionStartEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkDefaultSessionStartEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkDefaultSessionStartEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static DefaultSessionStartEvent internalCreateDefaultSessionStartEvent() {
-    return new DefaultSessionStartEvent._internalWrap();
-  }
-
-  external factory DefaultSessionStartEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DefaultSessionStartEvent.internal_() : super.internal_();
@@ -10458,7 +9452,7 @@
   @DomName('DefaultSessionStartEvent.session')
   @DocsEditable()
   @Experimental() // untriaged
-  PresentationSession get session => wrap_jso(_blink.BlinkDefaultSessionStartEvent.instance.session_Getter_(unwrap_jso(this)));
+  PresentationSession get session => _blink.BlinkDefaultSessionStartEvent.instance.session_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10475,21 +9469,13 @@
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageInfo._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DeprecatedStorageInfo internalCreateDeprecatedStorageInfo() {
-    return new DeprecatedStorageInfo._internalWrap();
-  }
 
-  factory DeprecatedStorageInfo._internalWrap() {
-    return new DeprecatedStorageInfo.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DeprecatedStorageInfo.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DeprecatedStorageInfo.PERSISTENT')
   @DocsEditable()
   @Experimental() // untriaged
@@ -10502,27 +9488,27 @@
 
   void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_3_(unwrap_jso(this), storageType, unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_3_(this, storageType, usageCallback, errorCallback);
       return;
     }
     if (usageCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_2_(unwrap_jso(this), storageType, unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)));
+      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_2_(this, storageType, usageCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_1_(unwrap_jso(this), storageType);
+    _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_1_(this, storageType);
     return;
   }
 
   void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_4_(unwrap_jso(this), storageType, newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_4_(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
       return;
     }
     if (quotaCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_3_(unwrap_jso(this), storageType, newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)));
+      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_3_(this, storageType, newQuotaInBytes, quotaCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_2_(unwrap_jso(this), storageType, newQuotaInBytes);
+    _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_2_(this, storageType, newQuotaInBytes);
     return;
   }
 
@@ -10541,40 +9527,32 @@
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageQuota._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DeprecatedStorageQuota internalCreateDeprecatedStorageQuota() {
-    return new DeprecatedStorageQuota._internalWrap();
-  }
 
-  factory DeprecatedStorageQuota._internalWrap() {
-    return new DeprecatedStorageQuota.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DeprecatedStorageQuota.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_2_(unwrap_jso(this), unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_2_(this, usageCallback, errorCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_1_(unwrap_jso(this), unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)));
+    _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_1_(this, usageCallback);
     return;
   }
 
   void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_3_(unwrap_jso(this), newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_3_(this, newQuotaInBytes, quotaCallback, errorCallback);
       return;
     }
     if (quotaCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_2_(unwrap_jso(this), newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)));
+      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_2_(this, newQuotaInBytes, quotaCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_1_(unwrap_jso(this), newQuotaInBytes);
+    _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_1_(this, newQuotaInBytes);
     return;
   }
 
@@ -10601,11 +9579,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DetailsElement internalCreateDetailsElement() {
-    return new DetailsElement._internalWrap();
-  }
-
-  external factory DetailsElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DetailsElement.internal_() : super.internal_();
@@ -10622,11 +9596,11 @@
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  bool get open => _blink.BlinkHTMLDetailsElement.instance.open_Getter_(unwrap_jso(this));
+  bool get open => _blink.BlinkHTMLDetailsElement.instance.open_Getter_(this);
   
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  set open(bool value) => _blink.BlinkHTMLDetailsElement.instance.open_Setter_(unwrap_jso(this), value);
+  set open(bool value) => _blink.BlinkHTMLDetailsElement.instance.open_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10644,32 +9618,24 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceAcceleration._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DeviceAcceleration internalCreateDeviceAcceleration() {
-    return new DeviceAcceleration._internalWrap();
-  }
 
-  factory DeviceAcceleration._internalWrap() {
-    return new DeviceAcceleration.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DeviceAcceleration.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  num get x => _blink.BlinkDeviceAcceleration.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDeviceAcceleration.instance.x_Getter_(this);
   
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  num get y => _blink.BlinkDeviceAcceleration.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDeviceAcceleration.instance.y_Getter_(this);
   
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  num get z => _blink.BlinkDeviceAcceleration.instance.z_Getter_(unwrap_jso(this));
+  num get z => _blink.BlinkDeviceAcceleration.instance.z_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10691,18 +9657,14 @@
   factory DeviceLightEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkDeviceLightEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkDeviceLightEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkDeviceLightEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkDeviceLightEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static DeviceLightEvent internalCreateDeviceLightEvent() {
-    return new DeviceLightEvent._internalWrap();
-  }
-
-  external factory DeviceLightEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DeviceLightEvent.internal_() : super.internal_();
@@ -10711,7 +9673,7 @@
   @DomName('DeviceLightEvent.value')
   @DocsEditable()
   @Experimental() // untriaged
-  num get value => _blink.BlinkDeviceLightEvent.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkDeviceLightEvent.instance.value_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10731,11 +9693,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DeviceMotionEvent internalCreateDeviceMotionEvent() {
-    return new DeviceMotionEvent._internalWrap();
-  }
-
-  external factory DeviceMotionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DeviceMotionEvent.internal_() : super.internal_();
@@ -10743,24 +9701,24 @@
 
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
-  DeviceAcceleration get acceleration => wrap_jso(_blink.BlinkDeviceMotionEvent.instance.acceleration_Getter_(unwrap_jso(this)));
+  DeviceAcceleration get acceleration => _blink.BlinkDeviceMotionEvent.instance.acceleration_Getter_(this);
   
   @DomName('DeviceMotionEvent.accelerationIncludingGravity')
   @DocsEditable()
-  DeviceAcceleration get accelerationIncludingGravity => wrap_jso(_blink.BlinkDeviceMotionEvent.instance.accelerationIncludingGravity_Getter_(unwrap_jso(this)));
+  DeviceAcceleration get accelerationIncludingGravity => _blink.BlinkDeviceMotionEvent.instance.accelerationIncludingGravity_Getter_(this);
   
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  num get interval => _blink.BlinkDeviceMotionEvent.instance.interval_Getter_(unwrap_jso(this));
+  num get interval => _blink.BlinkDeviceMotionEvent.instance.interval_Getter_(this);
   
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
-  DeviceRotationRate get rotationRate => wrap_jso(_blink.BlinkDeviceMotionEvent.instance.rotationRate_Getter_(unwrap_jso(this)));
+  DeviceRotationRate get rotationRate => _blink.BlinkDeviceMotionEvent.instance.rotationRate_Getter_(this);
   
   @DomName('DeviceMotionEvent.initDeviceMotionEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.BlinkDeviceMotionEvent.instance.initDeviceMotionEvent_Callback_7_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(acceleration), unwrap_jso(accelerationIncludingGravity), unwrap_jso(rotationRate), interval);
+  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.BlinkDeviceMotionEvent.instance.initDeviceMotionEvent_Callback_7_(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -10786,11 +9744,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DeviceOrientationEvent internalCreateDeviceOrientationEvent() {
-    return new DeviceOrientationEvent._internalWrap();
-  }
-
-  external factory DeviceOrientationEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DeviceOrientationEvent.internal_() : super.internal_();
@@ -10798,23 +9752,23 @@
 
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
-  bool get absolute => _blink.BlinkDeviceOrientationEvent.instance.absolute_Getter_(unwrap_jso(this));
+  bool get absolute => _blink.BlinkDeviceOrientationEvent.instance.absolute_Getter_(this);
   
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  num get alpha => _blink.BlinkDeviceOrientationEvent.instance.alpha_Getter_(unwrap_jso(this));
+  num get alpha => _blink.BlinkDeviceOrientationEvent.instance.alpha_Getter_(this);
   
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  num get beta => _blink.BlinkDeviceOrientationEvent.instance.beta_Getter_(unwrap_jso(this));
+  num get beta => _blink.BlinkDeviceOrientationEvent.instance.beta_Getter_(this);
   
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  num get gamma => _blink.BlinkDeviceOrientationEvent.instance.gamma_Getter_(unwrap_jso(this));
+  num get gamma => _blink.BlinkDeviceOrientationEvent.instance.gamma_Getter_(this);
   
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
-  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.BlinkDeviceOrientationEvent.instance.initDeviceOrientationEvent_Callback_7_(unwrap_jso(this), type, bubbles, cancelable, alpha, beta, gamma, absolute);
+  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.BlinkDeviceOrientationEvent.instance.initDeviceOrientationEvent_Callback_7_(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10832,32 +9786,24 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceRotationRate._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DeviceRotationRate internalCreateDeviceRotationRate() {
-    return new DeviceRotationRate._internalWrap();
-  }
 
-  factory DeviceRotationRate._internalWrap() {
-    return new DeviceRotationRate.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DeviceRotationRate.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  num get alpha => _blink.BlinkDeviceRotationRate.instance.alpha_Getter_(unwrap_jso(this));
+  num get alpha => _blink.BlinkDeviceRotationRate.instance.alpha_Getter_(this);
   
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  num get beta => _blink.BlinkDeviceRotationRate.instance.beta_Getter_(unwrap_jso(this));
+  num get beta => _blink.BlinkDeviceRotationRate.instance.beta_Getter_(this);
   
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  num get gamma => _blink.BlinkDeviceRotationRate.instance.gamma_Getter_(unwrap_jso(this));
+  num get gamma => _blink.BlinkDeviceRotationRate.instance.gamma_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10876,11 +9822,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DialogElement internalCreateDialogElement() {
-    return new DialogElement._internalWrap();
-  }
-
-  external factory DialogElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DialogElement.internal_() : super.internal_();
@@ -10894,33 +9836,33 @@
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  bool get open => _blink.BlinkHTMLDialogElement.instance.open_Getter_(unwrap_jso(this));
+  bool get open => _blink.BlinkHTMLDialogElement.instance.open_Getter_(this);
   
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  set open(bool value) => _blink.BlinkHTMLDialogElement.instance.open_Setter_(unwrap_jso(this), value);
+  set open(bool value) => _blink.BlinkHTMLDialogElement.instance.open_Setter_(this, value);
   
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  String get returnValue => _blink.BlinkHTMLDialogElement.instance.returnValue_Getter_(unwrap_jso(this));
+  String get returnValue => _blink.BlinkHTMLDialogElement.instance.returnValue_Getter_(this);
   
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  set returnValue(String value) => _blink.BlinkHTMLDialogElement.instance.returnValue_Setter_(unwrap_jso(this), value);
+  set returnValue(String value) => _blink.BlinkHTMLDialogElement.instance.returnValue_Setter_(this, value);
   
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close(String returnValue) => _blink.BlinkHTMLDialogElement.instance.close_Callback_1_(unwrap_jso(this), returnValue);
+  void close(String returnValue) => _blink.BlinkHTMLDialogElement.instance.close_Callback_1_(this, returnValue);
   
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
-  void show() => _blink.BlinkHTMLDialogElement.instance.show_Callback_0_(unwrap_jso(this));
+  void show() => _blink.BlinkHTMLDialogElement.instance.show_Callback_0_(this);
   
   @DomName('HTMLDialogElement.showModal')
   @DocsEditable()
-  void showModal() => _blink.BlinkHTMLDialogElement.instance.showModal_Callback_0_(unwrap_jso(this));
+  void showModal() => _blink.BlinkHTMLDialogElement.instance.showModal_Callback_0_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -10974,11 +9916,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DirectoryEntry internalCreateDirectoryEntry() {
-    return new DirectoryEntry._internalWrap();
-  }
-
-  external factory DirectoryEntry._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DirectoryEntry.internal_() : super.internal_();
@@ -10986,22 +9924,22 @@
 
   @DomName('DirectoryEntry.createReader')
   @DocsEditable()
-  DirectoryReader createReader() => wrap_jso(_blink.BlinkDirectoryEntry.instance.createReader_Callback_0_(unwrap_jso(this)));
+  DirectoryReader createReader() => _blink.BlinkDirectoryEntry.instance.createReader_Callback_0_(this);
   
   void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_4_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_4_(this, path, convertDartToNative_Dictionary(options), successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_3_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))));
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_3_(this, path, convertDartToNative_Dictionary(options), successCallback);
       return;
     }
     if (options != null) {
-      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_2_(unwrap_jso(this), path, convertDartToNative_Dictionary(options));
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_2_(this, path, convertDartToNative_Dictionary(options));
       return;
     }
-    _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_1_(unwrap_jso(this), path);
+    _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_1_(this, path);
     return;
   }
 
@@ -11015,18 +9953,18 @@
 
   void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getFile_Callback_4_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_4_(this, path, convertDartToNative_Dictionary(options), successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getFile_Callback_3_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))));
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_3_(this, path, convertDartToNative_Dictionary(options), successCallback);
       return;
     }
     if (options != null) {
-      _blink.BlinkDirectoryEntry.instance.getFile_Callback_2_(unwrap_jso(this), path, convertDartToNative_Dictionary(options));
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_2_(this, path, convertDartToNative_Dictionary(options));
       return;
     }
-    _blink.BlinkDirectoryEntry.instance.getFile_Callback_1_(unwrap_jso(this), path);
+    _blink.BlinkDirectoryEntry.instance.getFile_Callback_1_(this, path);
     return;
   }
 
@@ -11040,10 +9978,10 @@
 
   void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_2_(unwrap_jso(this), unwrap_jso(() => successCallback()), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_1_(unwrap_jso(this), unwrap_jso(() => successCallback()));
+    _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_1_(this, successCallback);
     return;
   }
 
@@ -11071,27 +10009,19 @@
   // To suppress missing implicit constructor warnings.
   factory DirectoryReader._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DirectoryReader internalCreateDirectoryReader() {
-    return new DirectoryReader._internalWrap();
-  }
 
-  factory DirectoryReader._internalWrap() {
-    return new DirectoryReader.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DirectoryReader.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryReader.instance.readEntries_Callback_2_(unwrap_jso(this), unwrap_jso((entries) => successCallback(wrap_jso(entries))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDirectoryReader.instance.readEntries_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkDirectoryReader.instance.readEntries_Callback_1_(unwrap_jso(this), unwrap_jso((entries) => successCallback(wrap_jso(entries))));
+    _blink.BlinkDirectoryReader.instance.readEntries_Callback_1_(this, successCallback);
     return;
   }
 
@@ -11145,11 +10075,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DivElement internalCreateDivElement() {
-    return new DivElement._internalWrap();
-  }
-
-  external factory DivElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DivElement.internal_() : super.internal_();
@@ -11228,11 +10154,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Document internalCreateDocument() {
-    return new Document._internalWrap();
-  }
-
-  external factory Document._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Document.internal_() : super.internal_();
@@ -11241,139 +10163,139 @@
   @DomName('Document.activeElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get activeElement => wrap_jso(_blink.BlinkDocument.instance.activeElement_Getter_(unwrap_jso(this)));
+  Element get activeElement => _blink.BlinkDocument.instance.activeElement_Getter_(this);
   
   @DomName('Document.body')
   @DocsEditable()
-  HtmlElement get _body => wrap_jso(_blink.BlinkDocument.instance.body_Getter_(unwrap_jso(this)));
+  HtmlElement get _body => _blink.BlinkDocument.instance.body_Getter_(this);
   
   @DomName('Document.body')
   @DocsEditable()
-  set _body(HtmlElement value) => _blink.BlinkDocument.instance.body_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set _body(HtmlElement value) => _blink.BlinkDocument.instance.body_Setter_(this, value);
   
   @DomName('Document.contentType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get contentType => _blink.BlinkDocument.instance.contentType_Getter_(unwrap_jso(this));
+  String get contentType => _blink.BlinkDocument.instance.contentType_Getter_(this);
   
   @DomName('Document.cookie')
   @DocsEditable()
-  String get cookie => _blink.BlinkDocument.instance.cookie_Getter_(unwrap_jso(this));
+  String get cookie => _blink.BlinkDocument.instance.cookie_Getter_(this);
   
   @DomName('Document.cookie')
   @DocsEditable()
-  set cookie(String value) => _blink.BlinkDocument.instance.cookie_Setter_(unwrap_jso(this), value);
+  set cookie(String value) => _blink.BlinkDocument.instance.cookie_Setter_(this, value);
   
   @DomName('Document.currentScript')
   @DocsEditable()
   @Experimental() // untriaged
-  ScriptElement get currentScript => wrap_jso(_blink.BlinkDocument.instance.currentScript_Getter_(unwrap_jso(this)));
+  ScriptElement get currentScript => _blink.BlinkDocument.instance.currentScript_Getter_(this);
   
   @DomName('Document.defaultView')
   @DocsEditable()
-  WindowBase get window => wrap_jso(_blink.BlinkDocument.instance.defaultView_Getter_(unwrap_jso(this)));
+  WindowBase get window => _blink.BlinkDocument.instance.defaultView_Getter_(this);
   
   @DomName('Document.documentElement')
   @DocsEditable()
-  Element get documentElement => wrap_jso(_blink.BlinkDocument.instance.documentElement_Getter_(unwrap_jso(this)));
+  Element get documentElement => _blink.BlinkDocument.instance.documentElement_Getter_(this);
   
   @DomName('Document.domain')
   @DocsEditable()
-  String get domain => _blink.BlinkDocument.instance.domain_Getter_(unwrap_jso(this));
+  String get domain => _blink.BlinkDocument.instance.domain_Getter_(this);
   
   @DomName('Document.fonts')
   @DocsEditable()
   @Experimental() // untriaged
-  FontFaceSet get fonts => wrap_jso(_blink.BlinkDocument.instance.fonts_Getter_(unwrap_jso(this)));
+  FontFaceSet get fonts => _blink.BlinkDocument.instance.fonts_Getter_(this);
   
   @DomName('Document.fullscreenElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get fullscreenElement => wrap_jso(_blink.BlinkDocument.instance.fullscreenElement_Getter_(unwrap_jso(this)));
+  Element get fullscreenElement => _blink.BlinkDocument.instance.fullscreenElement_Getter_(this);
   
   @DomName('Document.fullscreenEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get fullscreenEnabled => _blink.BlinkDocument.instance.fullscreenEnabled_Getter_(unwrap_jso(this));
+  bool get fullscreenEnabled => _blink.BlinkDocument.instance.fullscreenEnabled_Getter_(this);
   
   @DomName('Document.head')
   @DocsEditable()
-  HeadElement get _head => wrap_jso(_blink.BlinkDocument.instance.head_Getter_(unwrap_jso(this)));
+  HeadElement get _head => _blink.BlinkDocument.instance.head_Getter_(this);
   
   @DomName('Document.hidden')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get hidden => _blink.BlinkDocument.instance.hidden_Getter_(unwrap_jso(this));
+  bool get hidden => _blink.BlinkDocument.instance.hidden_Getter_(this);
   
   @DomName('Document.implementation')
   @DocsEditable()
-  DomImplementation get implementation => wrap_jso(_blink.BlinkDocument.instance.implementation_Getter_(unwrap_jso(this)));
+  DomImplementation get implementation => _blink.BlinkDocument.instance.implementation_Getter_(this);
   
   @DomName('Document.lastModified')
   @DocsEditable()
-  String get _lastModified => _blink.BlinkDocument.instance.lastModified_Getter_(unwrap_jso(this));
+  String get _lastModified => _blink.BlinkDocument.instance.lastModified_Getter_(this);
   
   @DomName('Document.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkDocument.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkDocument.instance.origin_Getter_(this);
   
   @DomName('Document.pointerLockElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get pointerLockElement => wrap_jso(_blink.BlinkDocument.instance.pointerLockElement_Getter_(unwrap_jso(this)));
+  Element get pointerLockElement => _blink.BlinkDocument.instance.pointerLockElement_Getter_(this);
   
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
-  String get _preferredStylesheetSet => _blink.BlinkDocument.instance.preferredStylesheetSet_Getter_(unwrap_jso(this));
+  String get _preferredStylesheetSet => _blink.BlinkDocument.instance.preferredStylesheetSet_Getter_(this);
   
   @DomName('Document.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkDocument.instance.readyState_Getter_(unwrap_jso(this));
+  String get readyState => _blink.BlinkDocument.instance.readyState_Getter_(this);
   
   @DomName('Document.referrer')
   @DocsEditable()
-  String get _referrer => _blink.BlinkDocument.instance.referrer_Getter_(unwrap_jso(this));
+  String get _referrer => _blink.BlinkDocument.instance.referrer_Getter_(this);
   
   @DomName('Document.rootElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgSvgElement get rootElement => wrap_jso(_blink.BlinkDocument.instance.rootElement_Getter_(unwrap_jso(this)));
+  SvgSvgElement get rootElement => _blink.BlinkDocument.instance.rootElement_Getter_(this);
   
   @DomName('Document.scrollingElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get scrollingElement => wrap_jso(_blink.BlinkDocument.instance.scrollingElement_Getter_(unwrap_jso(this)));
+  Element get scrollingElement => _blink.BlinkDocument.instance.scrollingElement_Getter_(this);
   
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  String get _selectedStylesheetSet => _blink.BlinkDocument.instance.selectedStylesheetSet_Getter_(unwrap_jso(this));
+  String get _selectedStylesheetSet => _blink.BlinkDocument.instance.selectedStylesheetSet_Getter_(this);
   
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  set _selectedStylesheetSet(String value) => _blink.BlinkDocument.instance.selectedStylesheetSet_Setter_(unwrap_jso(this), value);
+  set _selectedStylesheetSet(String value) => _blink.BlinkDocument.instance.selectedStylesheetSet_Setter_(this, value);
   
   @DomName('Document.styleSheets')
   @DocsEditable()
-  List<StyleSheet> get _styleSheets => wrap_jso(_blink.BlinkDocument.instance.styleSheets_Getter_(unwrap_jso(this)));
+  List<StyleSheet> get _styleSheets => (_blink.BlinkDocument.instance.styleSheets_Getter_(this));
   
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationTimeline get timeline => wrap_jso(_blink.BlinkDocument.instance.timeline_Getter_(unwrap_jso(this)));
+  AnimationTimeline get timeline => _blink.BlinkDocument.instance.timeline_Getter_(this);
   
   @DomName('Document.title')
   @DocsEditable()
-  String get _title => _blink.BlinkDocument.instance.title_Getter_(unwrap_jso(this));
+  String get _title => _blink.BlinkDocument.instance.title_Getter_(this);
   
   @DomName('Document.title')
   @DocsEditable()
-  set _title(String value) => _blink.BlinkDocument.instance.title_Setter_(unwrap_jso(this), value);
+  set _title(String value) => _blink.BlinkDocument.instance.title_Setter_(this, value);
   
   @DomName('Document.visibilityState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get visibilityState => _blink.BlinkDocument.instance.visibilityState_Getter_(unwrap_jso(this));
+  String get visibilityState => _blink.BlinkDocument.instance.visibilityState_Getter_(this);
   
   @DomName('Document.webkitFullscreenElement')
   @DocsEditable()
@@ -11381,7 +10303,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
-  Element get _webkitFullscreenElement => wrap_jso(_blink.BlinkDocument.instance.webkitFullscreenElement_Getter_(unwrap_jso(this)));
+  Element get _webkitFullscreenElement => _blink.BlinkDocument.instance.webkitFullscreenElement_Getter_(this);
   
   @DomName('Document.webkitFullscreenEnabled')
   @DocsEditable()
@@ -11389,7 +10311,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
-  bool get _webkitFullscreenEnabled => _blink.BlinkDocument.instance.webkitFullscreenEnabled_Getter_(unwrap_jso(this));
+  bool get _webkitFullscreenEnabled => _blink.BlinkDocument.instance.webkitFullscreenEnabled_Getter_(this);
   
   @DomName('Document.webkitHidden')
   @DocsEditable()
@@ -11397,7 +10319,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
-  bool get _webkitHidden => _blink.BlinkDocument.instance.webkitHidden_Getter_(unwrap_jso(this));
+  bool get _webkitHidden => _blink.BlinkDocument.instance.webkitHidden_Getter_(this);
   
   @DomName('Document.webkitVisibilityState')
   @DocsEditable()
@@ -11405,146 +10327,146 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
-  String get _webkitVisibilityState => _blink.BlinkDocument.instance.webkitVisibilityState_Getter_(unwrap_jso(this));
+  String get _webkitVisibilityState => _blink.BlinkDocument.instance.webkitVisibilityState_Getter_(this);
   
   @DomName('Document.adoptNode')
   @DocsEditable()
-  Node adoptNode(Node node) => wrap_jso(_blink.BlinkDocument.instance.adoptNode_Callback_1_(unwrap_jso(this), unwrap_jso(node)));
+  Node adoptNode(Node node) => _blink.BlinkDocument.instance.adoptNode_Callback_1_(this, node);
   
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable()
   // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
   @Experimental()
-  Range _caretRangeFromPoint(int x, int y) => wrap_jso(_blink.BlinkDocument.instance.caretRangeFromPoint_Callback_2_(unwrap_jso(this), x, y));
+  Range _caretRangeFromPoint(int x, int y) => _blink.BlinkDocument.instance.caretRangeFromPoint_Callback_2_(this, x, y);
   
   @DomName('Document.createDocumentFragment')
   @DocsEditable()
-  DocumentFragment createDocumentFragment() => wrap_jso(_blink.BlinkDocument.instance.createDocumentFragment_Callback_0_(unwrap_jso(this)));
+  DocumentFragment createDocumentFragment() => _blink.BlinkDocument.instance.createDocumentFragment_Callback_0_(this);
   
   @DomName('Document.createElement')
   @DocsEditable()
-  Element _createElement(String localName_OR_tagName, [String typeExtension]) => wrap_jso(_blink.BlinkDocument.instance.createElement_Callback_2_(unwrap_jso(this), localName_OR_tagName, typeExtension));
+  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.BlinkDocument.instance.createElement_Callback_2_(this, localName_OR_tagName, typeExtension);
   
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element _createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => wrap_jso(_blink.BlinkDocument.instance.createElementNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, typeExtension));
+  Element _createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.BlinkDocument.instance.createElementNS_Callback_3_(this, namespaceURI, qualifiedName, typeExtension);
   
   @DomName('Document.createEvent')
   @DocsEditable()
-  Event _createEvent(String eventType) => wrap_jso(_blink.BlinkDocument.instance.createEvent_Callback_1_(unwrap_jso(this), eventType));
+  Event _createEvent(String eventType) => _blink.BlinkDocument.instance.createEvent_Callback_1_(this, eventType);
   
   NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) {
     if (whatToShow != null) {
-      return wrap_jso(_blink.BlinkDocument.instance.createNodeIterator_Callback_3_(unwrap_jso(this), unwrap_jso(root), whatToShow, unwrap_jso(filter)));
+      return _blink.BlinkDocument.instance.createNodeIterator_Callback_3_(this, root, whatToShow, filter);
     }
-    return wrap_jso(_blink.BlinkDocument.instance.createNodeIterator_Callback_1_(unwrap_jso(this), unwrap_jso(root)));
+    return _blink.BlinkDocument.instance.createNodeIterator_Callback_1_(this, root);
   }
 
   @DomName('Document.createRange')
   @DocsEditable()
-  Range createRange() => wrap_jso(_blink.BlinkDocument.instance.createRange_Callback_0_(unwrap_jso(this)));
+  Range createRange() => _blink.BlinkDocument.instance.createRange_Callback_0_(this);
   
   @DomName('Document.createTextNode')
   @DocsEditable()
-  Text _createTextNode(String data) => wrap_jso(_blink.BlinkDocument.instance.createTextNode_Callback_1_(unwrap_jso(this), data));
+  Text _createTextNode(String data) => _blink.BlinkDocument.instance.createTextNode_Callback_1_(this, data);
   
   @DomName('Document.createTouch')
   @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) => wrap_jso(_blink.BlinkDocument.instance.createTouch_Callback_11_(unwrap_jso(this), unwrap_jso(window), unwrap_jso(target), identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force));
+  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num radiusX, num radiusY, num rotationAngle, num force) => _blink.BlinkDocument.instance.createTouch_Callback_11_(this, window, _convertDartToNative_EventTarget(target), identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
   
   @DomName('Document.createTouchList')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  TouchList _createTouchList(Touch touches) => wrap_jso(_blink.BlinkDocument.instance.createTouchList_Callback_1_(unwrap_jso(this), unwrap_jso(touches)));
+  TouchList _createTouchList(Touch touches) => _blink.BlinkDocument.instance.createTouchList_Callback_1_(this, touches);
   
   TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) {
     if (whatToShow != null) {
-      return wrap_jso(_blink.BlinkDocument.instance.createTreeWalker_Callback_3_(unwrap_jso(this), unwrap_jso(root), whatToShow, unwrap_jso(filter)));
+      return _blink.BlinkDocument.instance.createTreeWalker_Callback_3_(this, root, whatToShow, filter);
     }
-    return wrap_jso(_blink.BlinkDocument.instance.createTreeWalker_Callback_1_(unwrap_jso(this), unwrap_jso(root)));
+    return _blink.BlinkDocument.instance.createTreeWalker_Callback_1_(this, root);
   }
 
   @DomName('Document.elementFromPoint')
   @DocsEditable()
-  Element _elementFromPoint(int x, int y) => wrap_jso(_blink.BlinkDocument.instance.elementFromPoint_Callback_2_(unwrap_jso(this), x, y));
+  Element _elementFromPoint(int x, int y) => _blink.BlinkDocument.instance.elementFromPoint_Callback_2_(this, x, y);
   
   @DomName('Document.elementsFromPoint')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Element> elementsFromPoint(int x, int y) => wrap_jso(_blink.BlinkDocument.instance.elementsFromPoint_Callback_2_(unwrap_jso(this), x, y));
+  List<Element> elementsFromPoint(int x, int y) => (_blink.BlinkDocument.instance.elementsFromPoint_Callback_2_(this, x, y));
   
   bool execCommand(String commandId, [bool showUI, String value]) {
     if (value != null) {
-      return _blink.BlinkDocument.instance.execCommand_Callback_3_(unwrap_jso(this), commandId, showUI, value);
+      return _blink.BlinkDocument.instance.execCommand_Callback_3_(this, commandId, showUI, value);
     }
     if (showUI != null) {
-      return _blink.BlinkDocument.instance.execCommand_Callback_2_(unwrap_jso(this), commandId, showUI);
+      return _blink.BlinkDocument.instance.execCommand_Callback_2_(this, commandId, showUI);
     }
-    return _blink.BlinkDocument.instance.execCommand_Callback_1_(unwrap_jso(this), commandId);
+    return _blink.BlinkDocument.instance.execCommand_Callback_1_(this, commandId);
   }
 
   @DomName('Document.exitFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void exitFullscreen() => _blink.BlinkDocument.instance.exitFullscreen_Callback_0_(unwrap_jso(this));
+  void exitFullscreen() => _blink.BlinkDocument.instance.exitFullscreen_Callback_0_(this);
   
   @DomName('Document.exitPointerLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void exitPointerLock() => _blink.BlinkDocument.instance.exitPointerLock_Callback_0_(unwrap_jso(this));
+  void exitPointerLock() => _blink.BlinkDocument.instance.exitPointerLock_Callback_0_(this);
   
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable()
   // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
   @Experimental() // non-standard
-  Object _getCssCanvasContext(String contextId, String name, int width, int height) => wrap_jso(_blink.BlinkDocument.instance.getCSSCanvasContext_Callback_4_(unwrap_jso(this), contextId, name, width, height));
+  Object _getCssCanvasContext(String contextId, String name, int width, int height) => (_blink.BlinkDocument.instance.getCSSCanvasContext_Callback_4_(this, contextId, name, width, height));
   
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => wrap_jso(_blink.BlinkDocument.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), classNames));
+  List<Node> getElementsByClassName(String classNames) => (_blink.BlinkDocument.instance.getElementsByClassName_Callback_1_(this, classNames));
   
   @DomName('Document.getElementsByName')
   @DocsEditable()
-  List<Node> getElementsByName(String elementName) => wrap_jso(_blink.BlinkDocument.instance.getElementsByName_Callback_1_(unwrap_jso(this), elementName));
+  List<Node> getElementsByName(String elementName) => (_blink.BlinkDocument.instance.getElementsByName_Callback_1_(this, elementName));
   
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String localName) => wrap_jso(_blink.BlinkDocument.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), localName));
+  List<Node> getElementsByTagName(String localName) => (_blink.BlinkDocument.instance.getElementsByTagName_Callback_1_(this, localName));
   
   Node importNode(Node node, [bool deep]) {
     if (deep != null) {
-      return wrap_jso(_blink.BlinkDocument.instance.importNode_Callback_2_(unwrap_jso(this), unwrap_jso(node), deep));
+      return _blink.BlinkDocument.instance.importNode_Callback_2_(this, node, deep);
     }
-    return wrap_jso(_blink.BlinkDocument.instance.importNode_Callback_1_(unwrap_jso(this), unwrap_jso(node)));
+    return _blink.BlinkDocument.instance.importNode_Callback_1_(this, node);
   }
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String commandId) => _blink.BlinkDocument.instance.queryCommandEnabled_Callback_1_(unwrap_jso(this), commandId);
+  bool queryCommandEnabled(String commandId) => _blink.BlinkDocument.instance.queryCommandEnabled_Callback_1_(this, commandId);
   
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String commandId) => _blink.BlinkDocument.instance.queryCommandIndeterm_Callback_1_(unwrap_jso(this), commandId);
+  bool queryCommandIndeterm(String commandId) => _blink.BlinkDocument.instance.queryCommandIndeterm_Callback_1_(this, commandId);
   
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String commandId) => _blink.BlinkDocument.instance.queryCommandState_Callback_1_(unwrap_jso(this), commandId);
+  bool queryCommandState(String commandId) => _blink.BlinkDocument.instance.queryCommandState_Callback_1_(this, commandId);
   
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String commandId) => _blink.BlinkDocument.instance.queryCommandSupported_Callback_1_(unwrap_jso(this), commandId);
+  bool queryCommandSupported(String commandId) => _blink.BlinkDocument.instance.queryCommandSupported_Callback_1_(this, commandId);
   
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String commandId) => _blink.BlinkDocument.instance.queryCommandValue_Callback_1_(unwrap_jso(this), commandId);
+  String queryCommandValue(String commandId) => _blink.BlinkDocument.instance.queryCommandValue_Callback_1_(this, commandId);
   
   @DomName('Document.transformDocumentToTreeView')
   @DocsEditable()
   @Experimental() // untriaged
-  void transformDocumentToTreeView(String noStyleMessage) => _blink.BlinkDocument.instance.transformDocumentToTreeView_Callback_1_(unwrap_jso(this), noStyleMessage);
+  void transformDocumentToTreeView(String noStyleMessage) => _blink.BlinkDocument.instance.transformDocumentToTreeView_Callback_1_(this, noStyleMessage);
   
   @DomName('Document.webkitExitFullscreen')
   @DocsEditable()
@@ -11552,27 +10474,27 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void _webkitExitFullscreen() => _blink.BlinkDocument.instance.webkitExitFullscreen_Callback_0_(unwrap_jso(this));
+  void _webkitExitFullscreen() => _blink.BlinkDocument.instance.webkitExitFullscreen_Callback_0_(this);
   
   @DomName('Document.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => wrap_jso(_blink.BlinkDocument.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
+  Element getElementById(String elementId) => _blink.BlinkDocument.instance.getElementById_Callback_1_(this, elementId);
   
   @DomName('Document.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.BlinkDocument.instance.childElementCount_Getter_(unwrap_jso(this));
+  int get _childElementCount => _blink.BlinkDocument.instance.childElementCount_Getter_(this);
   
   @DomName('Document.children')
   @DocsEditable()
-  List<Node> get _children => wrap_jso(_blink.BlinkDocument.instance.children_Getter_(unwrap_jso(this)));
+  List<Node> get _children => (_blink.BlinkDocument.instance.children_Getter_(this));
   
   @DomName('Document.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => wrap_jso(_blink.BlinkDocument.instance.firstElementChild_Getter_(unwrap_jso(this)));
+  Element get _firstElementChild => _blink.BlinkDocument.instance.firstElementChild_Getter_(this);
   
   @DomName('Document.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => wrap_jso(_blink.BlinkDocument.instance.lastElementChild_Getter_(unwrap_jso(this)));
+  Element get _lastElementChild => _blink.BlinkDocument.instance.lastElementChild_Getter_(this);
   
   /**
    * Finds the first descendant element of this document that matches the
@@ -11593,11 +10515,11 @@
    */
   @DomName('Document.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => wrap_jso(_blink.BlinkDocument.instance.querySelector_Callback_1_(unwrap_jso(this), selectors));
+  Element querySelector(String selectors) => _blink.BlinkDocument.instance.querySelector_Callback_1_(this, selectors);
   
   @DomName('Document.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => wrap_jso(_blink.BlinkDocument.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
+  List<Node> _querySelectorAll(String selectors) => (_blink.BlinkDocument.instance.querySelectorAll_Callback_1_(this, selectors));
   
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
@@ -12022,47 +10944,17 @@
 
   @DomName('Document.createElement')
   Element createElement(String tagName, [String typeExtension]) {
-    var newElement = (typeExtension == null) ?
-      _blink.BlinkDocument.instance.createElement_Callback_1_(unwrap_jso(this), tagName) :
-      _blink.BlinkDocument.instance.createElement_Callback_2_(unwrap_jso(this), tagName, typeExtension);
-
-    var wrapped = js.getDartHtmlWrapperFor(newElement);  // Here's our Dart class.
-    if (wrapped != null) {
-      wrapped.blink_jsObject = newElement;
-    } else {
-      wrapped = wrap_jso(newElement);
-      if (wrapped == null) {
-        wrapped = wrap_jso_custom_element(newElement);
-      } else {
-        js.setDartHtmlWrapperFor(wrapped.blink_jsObject, wrapped);
-      }
-    }
-
-    return wrapped;
+    return (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElement_Callback_1_(this, tagName) :
+      _blink.BlinkDocument.instance.createElement_Callback_2_(this, tagName, typeExtension);
   }
 
   @DomName('Document.createElementNS')
   @DocsEditable()
   Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
-    var newElement = (typeExtension == null) ?
-      _blink.BlinkDocument.instance.createElementNS_Callback_2_(unwrap_jso(this), namespaceURI, qualifiedName) :
-      _blink.BlinkDocument.instance.createElementNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, typeExtension);
-
-    var wrapped;
-
-    wrapped = js.getDartHtmlWrapperFor(newElement);  // Here's our Dart class.
-    if (wrapped != null) {
-      wrapped.blink_jsObject = newElement;
-    } else {
-      wrapped = wrap_jso(newElement);
-      if (wrapped == null) {
-        wrapped = wrap_jso_custom_element(newElement);
-      } else {
-        js.setDartHtmlWrapperFor(wrapped.blink_jsObject, wrapped);  // Here's our Dart class.
-      }
-    }
-
-    return wrapped;
+    return (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElementNS_Callback_2_(this, namespaceURI, qualifiedName) :
+      _blink.BlinkDocument.instance.createElementNS_Callback_3_(this, namespaceURI, qualifiedName, typeExtension);    
   }
 
 }
@@ -12186,11 +11078,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DocumentFragment internalCreateDocumentFragment() {
-    return new DocumentFragment._internalWrap();
-  }
-
-  external factory DocumentFragment._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DocumentFragment.internal_() : super.internal_();
@@ -12199,19 +11087,19 @@
   @DomName('DocumentFragment.getElementById')
   @DocsEditable()
   @Experimental() // untriaged
-  Element getElementById(String elementId) => wrap_jso(_blink.BlinkDocumentFragment.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
+  Element getElementById(String elementId) => _blink.BlinkDocumentFragment.instance.getElementById_Callback_1_(this, elementId);
   
   @DomName('DocumentFragment.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.BlinkDocumentFragment.instance.childElementCount_Getter_(unwrap_jso(this));
+  int get _childElementCount => _blink.BlinkDocumentFragment.instance.childElementCount_Getter_(this);
   
   @DomName('DocumentFragment.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => wrap_jso(_blink.BlinkDocumentFragment.instance.firstElementChild_Getter_(unwrap_jso(this)));
+  Element get _firstElementChild => _blink.BlinkDocumentFragment.instance.firstElementChild_Getter_(this);
   
   @DomName('DocumentFragment.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => wrap_jso(_blink.BlinkDocumentFragment.instance.lastElementChild_Getter_(unwrap_jso(this)));
+  Element get _lastElementChild => _blink.BlinkDocumentFragment.instance.lastElementChild_Getter_(this);
   
   /**
    * Finds the first descendant element of this document fragment that matches
@@ -12227,11 +11115,11 @@
    */
   @DomName('DocumentFragment.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => wrap_jso(_blink.BlinkDocumentFragment.instance.querySelector_Callback_1_(unwrap_jso(this), selectors));
+  Element querySelector(String selectors) => _blink.BlinkDocumentFragment.instance.querySelector_Callback_1_(this, selectors);
   
   @DomName('DocumentFragment.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => wrap_jso(_blink.BlinkDocumentFragment.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
+  List<Node> _querySelectorAll(String selectors) => (_blink.BlinkDocumentFragment.instance.querySelectorAll_Callback_1_(this, selectors));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12250,32 +11138,24 @@
   @DomName('DOMError.DOMError')
   @DocsEditable()
   factory DomError(String name, [String message]) {
-    return wrap_jso(_blink.BlinkDOMError.instance.constructorCallback_2_(name, message));
+    return _blink.BlinkDOMError.instance.constructorCallback_2_(name, message);
   }
 
+
   @Deprecated("Internal Use Only")
-  static DomError internalCreateDomError() {
-    return new DomError._internalWrap();
-  }
-
-  factory DomError._internalWrap() {
-    return new DomError.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomError.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message => _blink.BlinkDOMError.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkDOMError.instance.message_Getter_(this);
   
   @DomName('DOMError.name')
   @DocsEditable()
-  String get name => _blink.BlinkDOMError.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkDOMError.instance.name_Getter_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -12363,36 +11243,28 @@
   // To suppress missing implicit constructor warnings.
   factory DomImplementation._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DomImplementation internalCreateDomImplementation() {
-    return new DomImplementation._internalWrap();
-  }
 
-  factory DomImplementation._internalWrap() {
-    return new DomImplementation.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomImplementation.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => wrap_jso(_blink.BlinkDOMImplementation.instance.createDocument_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, unwrap_jso(doctype)));
+  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.BlinkDOMImplementation.instance.createDocument_Callback_3_(this, namespaceURI, qualifiedName, doctype);
   
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => wrap_jso(_blink.BlinkDOMImplementation.instance.createDocumentType_Callback_3_(unwrap_jso(this), qualifiedName, publicId, systemId));
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.BlinkDOMImplementation.instance.createDocumentType_Callback_3_(this, qualifiedName, publicId, systemId);
   
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
-  HtmlDocument createHtmlDocument(String title) => wrap_jso(_blink.BlinkDOMImplementation.instance.createHTMLDocument_Callback_1_(unwrap_jso(this), title));
+  HtmlDocument createHtmlDocument(String title) => _blink.BlinkDOMImplementation.instance.createHTMLDocument_Callback_1_(this, title);
   
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature() => _blink.BlinkDOMImplementation.instance.hasFeature_Callback_0_(unwrap_jso(this));
+  bool hasFeature() => _blink.BlinkDOMImplementation.instance.hasFeature_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12409,26 +11281,18 @@
   // To suppress missing implicit constructor warnings.
   factory DomIterator._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DomIterator internalCreateDomIterator() {
-    return new DomIterator._internalWrap();
-  }
 
-  factory DomIterator._internalWrap() {
-    return new DomIterator.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomIterator.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   Object next([Object value]) {
     if (value != null) {
-      return wrap_jso(_blink.BlinkIterator.instance.next_Callback_1_(unwrap_jso(this), value));
+      return _blink.BlinkIterator.instance.next_Callback_1_(this, value);
     }
-    return wrap_jso(_blink.BlinkIterator.instance.next_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkIterator.instance.next_Callback_0_(this);
   }
 
 }
@@ -12450,21 +11314,17 @@
   @DocsEditable()
   factory DomMatrix([DomMatrixReadOnly other]) {
     if (other == null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.constructorCallback_0_());
+      return _blink.BlinkDOMMatrix.instance.constructorCallback_0_();
     }
     if ((other is DomMatrixReadOnly || other == null)) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.constructorCallback_1_(other));
+      return _blink.BlinkDOMMatrix.instance.constructorCallback_1_(other);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
 
   @Deprecated("Internal Use Only")
-  static DomMatrix internalCreateDomMatrix() {
-    return new DomMatrix._internalWrap();
-  }
-
-  external factory DomMatrix._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomMatrix.internal_() : super.internal_();
@@ -12473,280 +11333,280 @@
   @DomName('DOMMatrix.a')
   @DocsEditable()
   @Experimental() // untriaged
-  num get a => _blink.BlinkDOMMatrix.instance.a_Getter_(unwrap_jso(this));
+  num get a => _blink.BlinkDOMMatrix.instance.a_Getter_(this);
   
   @DomName('DOMMatrix.a')
   @DocsEditable()
   @Experimental() // untriaged
-  set a(num value) => _blink.BlinkDOMMatrix.instance.a_Setter_(unwrap_jso(this), value);
+  set a(num value) => _blink.BlinkDOMMatrix.instance.a_Setter_(this, value);
   
   @DomName('DOMMatrix.b')
   @DocsEditable()
   @Experimental() // untriaged
-  num get b => _blink.BlinkDOMMatrix.instance.b_Getter_(unwrap_jso(this));
+  num get b => _blink.BlinkDOMMatrix.instance.b_Getter_(this);
   
   @DomName('DOMMatrix.b')
   @DocsEditable()
   @Experimental() // untriaged
-  set b(num value) => _blink.BlinkDOMMatrix.instance.b_Setter_(unwrap_jso(this), value);
+  set b(num value) => _blink.BlinkDOMMatrix.instance.b_Setter_(this, value);
   
   @DomName('DOMMatrix.c')
   @DocsEditable()
   @Experimental() // untriaged
-  num get c => _blink.BlinkDOMMatrix.instance.c_Getter_(unwrap_jso(this));
+  num get c => _blink.BlinkDOMMatrix.instance.c_Getter_(this);
   
   @DomName('DOMMatrix.c')
   @DocsEditable()
   @Experimental() // untriaged
-  set c(num value) => _blink.BlinkDOMMatrix.instance.c_Setter_(unwrap_jso(this), value);
+  set c(num value) => _blink.BlinkDOMMatrix.instance.c_Setter_(this, value);
   
   @DomName('DOMMatrix.d')
   @DocsEditable()
   @Experimental() // untriaged
-  num get d => _blink.BlinkDOMMatrix.instance.d_Getter_(unwrap_jso(this));
+  num get d => _blink.BlinkDOMMatrix.instance.d_Getter_(this);
   
   @DomName('DOMMatrix.d')
   @DocsEditable()
   @Experimental() // untriaged
-  set d(num value) => _blink.BlinkDOMMatrix.instance.d_Setter_(unwrap_jso(this), value);
+  set d(num value) => _blink.BlinkDOMMatrix.instance.d_Setter_(this, value);
   
   @DomName('DOMMatrix.e')
   @DocsEditable()
   @Experimental() // untriaged
-  num get e => _blink.BlinkDOMMatrix.instance.e_Getter_(unwrap_jso(this));
+  num get e => _blink.BlinkDOMMatrix.instance.e_Getter_(this);
   
   @DomName('DOMMatrix.e')
   @DocsEditable()
   @Experimental() // untriaged
-  set e(num value) => _blink.BlinkDOMMatrix.instance.e_Setter_(unwrap_jso(this), value);
+  set e(num value) => _blink.BlinkDOMMatrix.instance.e_Setter_(this, value);
   
   @DomName('DOMMatrix.f')
   @DocsEditable()
   @Experimental() // untriaged
-  num get f => _blink.BlinkDOMMatrix.instance.f_Getter_(unwrap_jso(this));
+  num get f => _blink.BlinkDOMMatrix.instance.f_Getter_(this);
   
   @DomName('DOMMatrix.f')
   @DocsEditable()
   @Experimental() // untriaged
-  set f(num value) => _blink.BlinkDOMMatrix.instance.f_Setter_(unwrap_jso(this), value);
+  set f(num value) => _blink.BlinkDOMMatrix.instance.f_Setter_(this, value);
   
   @DomName('DOMMatrix.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m11 => _blink.BlinkDOMMatrix.instance.m11_Getter_(unwrap_jso(this));
+  num get m11 => _blink.BlinkDOMMatrix.instance.m11_Getter_(this);
   
   @DomName('DOMMatrix.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  set m11(num value) => _blink.BlinkDOMMatrix.instance.m11_Setter_(unwrap_jso(this), value);
+  set m11(num value) => _blink.BlinkDOMMatrix.instance.m11_Setter_(this, value);
   
   @DomName('DOMMatrix.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m12 => _blink.BlinkDOMMatrix.instance.m12_Getter_(unwrap_jso(this));
+  num get m12 => _blink.BlinkDOMMatrix.instance.m12_Getter_(this);
   
   @DomName('DOMMatrix.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  set m12(num value) => _blink.BlinkDOMMatrix.instance.m12_Setter_(unwrap_jso(this), value);
+  set m12(num value) => _blink.BlinkDOMMatrix.instance.m12_Setter_(this, value);
   
   @DomName('DOMMatrix.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m13 => _blink.BlinkDOMMatrix.instance.m13_Getter_(unwrap_jso(this));
+  num get m13 => _blink.BlinkDOMMatrix.instance.m13_Getter_(this);
   
   @DomName('DOMMatrix.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  set m13(num value) => _blink.BlinkDOMMatrix.instance.m13_Setter_(unwrap_jso(this), value);
+  set m13(num value) => _blink.BlinkDOMMatrix.instance.m13_Setter_(this, value);
   
   @DomName('DOMMatrix.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m14 => _blink.BlinkDOMMatrix.instance.m14_Getter_(unwrap_jso(this));
+  num get m14 => _blink.BlinkDOMMatrix.instance.m14_Getter_(this);
   
   @DomName('DOMMatrix.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  set m14(num value) => _blink.BlinkDOMMatrix.instance.m14_Setter_(unwrap_jso(this), value);
+  set m14(num value) => _blink.BlinkDOMMatrix.instance.m14_Setter_(this, value);
   
   @DomName('DOMMatrix.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m21 => _blink.BlinkDOMMatrix.instance.m21_Getter_(unwrap_jso(this));
+  num get m21 => _blink.BlinkDOMMatrix.instance.m21_Getter_(this);
   
   @DomName('DOMMatrix.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  set m21(num value) => _blink.BlinkDOMMatrix.instance.m21_Setter_(unwrap_jso(this), value);
+  set m21(num value) => _blink.BlinkDOMMatrix.instance.m21_Setter_(this, value);
   
   @DomName('DOMMatrix.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m22 => _blink.BlinkDOMMatrix.instance.m22_Getter_(unwrap_jso(this));
+  num get m22 => _blink.BlinkDOMMatrix.instance.m22_Getter_(this);
   
   @DomName('DOMMatrix.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  set m22(num value) => _blink.BlinkDOMMatrix.instance.m22_Setter_(unwrap_jso(this), value);
+  set m22(num value) => _blink.BlinkDOMMatrix.instance.m22_Setter_(this, value);
   
   @DomName('DOMMatrix.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m23 => _blink.BlinkDOMMatrix.instance.m23_Getter_(unwrap_jso(this));
+  num get m23 => _blink.BlinkDOMMatrix.instance.m23_Getter_(this);
   
   @DomName('DOMMatrix.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  set m23(num value) => _blink.BlinkDOMMatrix.instance.m23_Setter_(unwrap_jso(this), value);
+  set m23(num value) => _blink.BlinkDOMMatrix.instance.m23_Setter_(this, value);
   
   @DomName('DOMMatrix.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m24 => _blink.BlinkDOMMatrix.instance.m24_Getter_(unwrap_jso(this));
+  num get m24 => _blink.BlinkDOMMatrix.instance.m24_Getter_(this);
   
   @DomName('DOMMatrix.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  set m24(num value) => _blink.BlinkDOMMatrix.instance.m24_Setter_(unwrap_jso(this), value);
+  set m24(num value) => _blink.BlinkDOMMatrix.instance.m24_Setter_(this, value);
   
   @DomName('DOMMatrix.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m31 => _blink.BlinkDOMMatrix.instance.m31_Getter_(unwrap_jso(this));
+  num get m31 => _blink.BlinkDOMMatrix.instance.m31_Getter_(this);
   
   @DomName('DOMMatrix.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  set m31(num value) => _blink.BlinkDOMMatrix.instance.m31_Setter_(unwrap_jso(this), value);
+  set m31(num value) => _blink.BlinkDOMMatrix.instance.m31_Setter_(this, value);
   
   @DomName('DOMMatrix.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m32 => _blink.BlinkDOMMatrix.instance.m32_Getter_(unwrap_jso(this));
+  num get m32 => _blink.BlinkDOMMatrix.instance.m32_Getter_(this);
   
   @DomName('DOMMatrix.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  set m32(num value) => _blink.BlinkDOMMatrix.instance.m32_Setter_(unwrap_jso(this), value);
+  set m32(num value) => _blink.BlinkDOMMatrix.instance.m32_Setter_(this, value);
   
   @DomName('DOMMatrix.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m33 => _blink.BlinkDOMMatrix.instance.m33_Getter_(unwrap_jso(this));
+  num get m33 => _blink.BlinkDOMMatrix.instance.m33_Getter_(this);
   
   @DomName('DOMMatrix.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  set m33(num value) => _blink.BlinkDOMMatrix.instance.m33_Setter_(unwrap_jso(this), value);
+  set m33(num value) => _blink.BlinkDOMMatrix.instance.m33_Setter_(this, value);
   
   @DomName('DOMMatrix.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m34 => _blink.BlinkDOMMatrix.instance.m34_Getter_(unwrap_jso(this));
+  num get m34 => _blink.BlinkDOMMatrix.instance.m34_Getter_(this);
   
   @DomName('DOMMatrix.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  set m34(num value) => _blink.BlinkDOMMatrix.instance.m34_Setter_(unwrap_jso(this), value);
+  set m34(num value) => _blink.BlinkDOMMatrix.instance.m34_Setter_(this, value);
   
   @DomName('DOMMatrix.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m41 => _blink.BlinkDOMMatrix.instance.m41_Getter_(unwrap_jso(this));
+  num get m41 => _blink.BlinkDOMMatrix.instance.m41_Getter_(this);
   
   @DomName('DOMMatrix.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  set m41(num value) => _blink.BlinkDOMMatrix.instance.m41_Setter_(unwrap_jso(this), value);
+  set m41(num value) => _blink.BlinkDOMMatrix.instance.m41_Setter_(this, value);
   
   @DomName('DOMMatrix.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m42 => _blink.BlinkDOMMatrix.instance.m42_Getter_(unwrap_jso(this));
+  num get m42 => _blink.BlinkDOMMatrix.instance.m42_Getter_(this);
   
   @DomName('DOMMatrix.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  set m42(num value) => _blink.BlinkDOMMatrix.instance.m42_Setter_(unwrap_jso(this), value);
+  set m42(num value) => _blink.BlinkDOMMatrix.instance.m42_Setter_(this, value);
   
   @DomName('DOMMatrix.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m43 => _blink.BlinkDOMMatrix.instance.m43_Getter_(unwrap_jso(this));
+  num get m43 => _blink.BlinkDOMMatrix.instance.m43_Getter_(this);
   
   @DomName('DOMMatrix.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  set m43(num value) => _blink.BlinkDOMMatrix.instance.m43_Setter_(unwrap_jso(this), value);
+  set m43(num value) => _blink.BlinkDOMMatrix.instance.m43_Setter_(this, value);
   
   @DomName('DOMMatrix.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m44 => _blink.BlinkDOMMatrix.instance.m44_Getter_(unwrap_jso(this));
+  num get m44 => _blink.BlinkDOMMatrix.instance.m44_Getter_(this);
   
   @DomName('DOMMatrix.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  set m44(num value) => _blink.BlinkDOMMatrix.instance.m44_Setter_(unwrap_jso(this), value);
+  set m44(num value) => _blink.BlinkDOMMatrix.instance.m44_Setter_(this, value);
   
   @DomName('DOMMatrix.multiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiplySelf(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrix.instance.multiplySelf_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
+  DomMatrix multiplySelf(DomMatrix other) => _blink.BlinkDOMMatrix.instance.multiplySelf_Callback_1_(this, other);
   
   @DomName('DOMMatrix.preMultiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix preMultiplySelf(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrix.instance.preMultiplySelf_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
+  DomMatrix preMultiplySelf(DomMatrix other) => _blink.BlinkDOMMatrix.instance.preMultiplySelf_Callback_1_(this, other);
   
   DomMatrix scale3dSelf(num scale, [num originX, num originY, num originZ]) {
     if (originZ != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_4_(unwrap_jso(this), scale, originX, originY, originZ));
+      return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_4_(this, scale, originX, originY, originZ);
     }
     if (originY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_3_(unwrap_jso(this), scale, originX, originY));
+      return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_3_(this, scale, originX, originY);
     }
     if (originX != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_2_(unwrap_jso(this), scale, originX));
+      return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_2_(this, scale, originX);
     }
-    return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_1_(unwrap_jso(this), scale));
+    return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_1_(this, scale);
   }
 
   DomMatrix scaleNonUniformSelf(num scaleX, [num scaleY, num scaleZ, num originX, num originY, num originZ]) {
     if (originZ != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_6_(unwrap_jso(this), scaleX, scaleY, scaleZ, originX, originY, originZ));
+      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_6_(this, scaleX, scaleY, scaleZ, originX, originY, originZ);
     }
     if (originY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_5_(unwrap_jso(this), scaleX, scaleY, scaleZ, originX, originY));
+      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_5_(this, scaleX, scaleY, scaleZ, originX, originY);
     }
     if (originX != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_4_(unwrap_jso(this), scaleX, scaleY, scaleZ, originX));
+      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_4_(this, scaleX, scaleY, scaleZ, originX);
     }
     if (scaleZ != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_3_(unwrap_jso(this), scaleX, scaleY, scaleZ));
+      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_3_(this, scaleX, scaleY, scaleZ);
     }
     if (scaleY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_2_(unwrap_jso(this), scaleX, scaleY));
+      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_2_(this, scaleX, scaleY);
     }
-    return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_1_(unwrap_jso(this), scaleX));
+    return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_1_(this, scaleX);
   }
 
   DomMatrix scaleSelf(num scale, [num originX, num originY]) {
     if (originY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_3_(unwrap_jso(this), scale, originX, originY));
+      return _blink.BlinkDOMMatrix.instance.scaleSelf_Callback_3_(this, scale, originX, originY);
     }
     if (originX != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_2_(unwrap_jso(this), scale, originX));
+      return _blink.BlinkDOMMatrix.instance.scaleSelf_Callback_2_(this, scale, originX);
     }
-    return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_1_(unwrap_jso(this), scale));
+    return _blink.BlinkDOMMatrix.instance.scaleSelf_Callback_1_(this, scale);
   }
 
   DomMatrix translateSelf(num tx, num ty, [num tz]) {
     if (tz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrix.instance.translateSelf_Callback_3_(unwrap_jso(this), tx, ty, tz));
+      return _blink.BlinkDOMMatrix.instance.translateSelf_Callback_3_(this, tx, ty, tz);
     }
-    return wrap_jso(_blink.BlinkDOMMatrix.instance.translateSelf_Callback_2_(unwrap_jso(this), tx, ty));
+    return _blink.BlinkDOMMatrix.instance.translateSelf_Callback_2_(this, tx, ty);
   }
 
 }
@@ -12764,203 +11624,195 @@
   // To suppress missing implicit constructor warnings.
   factory DomMatrixReadOnly._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DomMatrixReadOnly internalCreateDomMatrixReadOnly() {
-    return new DomMatrixReadOnly._internalWrap();
-  }
 
-  factory DomMatrixReadOnly._internalWrap() {
-    return new DomMatrixReadOnly.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomMatrixReadOnly.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DOMMatrixReadOnly.a')
   @DocsEditable()
   @Experimental() // untriaged
-  num get a => _blink.BlinkDOMMatrixReadOnly.instance.a_Getter_(unwrap_jso(this));
+  num get a => _blink.BlinkDOMMatrixReadOnly.instance.a_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.b')
   @DocsEditable()
   @Experimental() // untriaged
-  num get b => _blink.BlinkDOMMatrixReadOnly.instance.b_Getter_(unwrap_jso(this));
+  num get b => _blink.BlinkDOMMatrixReadOnly.instance.b_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.c')
   @DocsEditable()
   @Experimental() // untriaged
-  num get c => _blink.BlinkDOMMatrixReadOnly.instance.c_Getter_(unwrap_jso(this));
+  num get c => _blink.BlinkDOMMatrixReadOnly.instance.c_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.d')
   @DocsEditable()
   @Experimental() // untriaged
-  num get d => _blink.BlinkDOMMatrixReadOnly.instance.d_Getter_(unwrap_jso(this));
+  num get d => _blink.BlinkDOMMatrixReadOnly.instance.d_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.e')
   @DocsEditable()
   @Experimental() // untriaged
-  num get e => _blink.BlinkDOMMatrixReadOnly.instance.e_Getter_(unwrap_jso(this));
+  num get e => _blink.BlinkDOMMatrixReadOnly.instance.e_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.f')
   @DocsEditable()
   @Experimental() // untriaged
-  num get f => _blink.BlinkDOMMatrixReadOnly.instance.f_Getter_(unwrap_jso(this));
+  num get f => _blink.BlinkDOMMatrixReadOnly.instance.f_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.is2D')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get is2D => _blink.BlinkDOMMatrixReadOnly.instance.is2D_Getter_(unwrap_jso(this));
+  bool get is2D => _blink.BlinkDOMMatrixReadOnly.instance.is2D_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.isIdentity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isIdentity => _blink.BlinkDOMMatrixReadOnly.instance.isIdentity_Getter_(unwrap_jso(this));
+  bool get isIdentity => _blink.BlinkDOMMatrixReadOnly.instance.isIdentity_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m11 => _blink.BlinkDOMMatrixReadOnly.instance.m11_Getter_(unwrap_jso(this));
+  num get m11 => _blink.BlinkDOMMatrixReadOnly.instance.m11_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m12 => _blink.BlinkDOMMatrixReadOnly.instance.m12_Getter_(unwrap_jso(this));
+  num get m12 => _blink.BlinkDOMMatrixReadOnly.instance.m12_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m13 => _blink.BlinkDOMMatrixReadOnly.instance.m13_Getter_(unwrap_jso(this));
+  num get m13 => _blink.BlinkDOMMatrixReadOnly.instance.m13_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m14 => _blink.BlinkDOMMatrixReadOnly.instance.m14_Getter_(unwrap_jso(this));
+  num get m14 => _blink.BlinkDOMMatrixReadOnly.instance.m14_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m21 => _blink.BlinkDOMMatrixReadOnly.instance.m21_Getter_(unwrap_jso(this));
+  num get m21 => _blink.BlinkDOMMatrixReadOnly.instance.m21_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m22 => _blink.BlinkDOMMatrixReadOnly.instance.m22_Getter_(unwrap_jso(this));
+  num get m22 => _blink.BlinkDOMMatrixReadOnly.instance.m22_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m23 => _blink.BlinkDOMMatrixReadOnly.instance.m23_Getter_(unwrap_jso(this));
+  num get m23 => _blink.BlinkDOMMatrixReadOnly.instance.m23_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m24 => _blink.BlinkDOMMatrixReadOnly.instance.m24_Getter_(unwrap_jso(this));
+  num get m24 => _blink.BlinkDOMMatrixReadOnly.instance.m24_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m31 => _blink.BlinkDOMMatrixReadOnly.instance.m31_Getter_(unwrap_jso(this));
+  num get m31 => _blink.BlinkDOMMatrixReadOnly.instance.m31_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m32 => _blink.BlinkDOMMatrixReadOnly.instance.m32_Getter_(unwrap_jso(this));
+  num get m32 => _blink.BlinkDOMMatrixReadOnly.instance.m32_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m33 => _blink.BlinkDOMMatrixReadOnly.instance.m33_Getter_(unwrap_jso(this));
+  num get m33 => _blink.BlinkDOMMatrixReadOnly.instance.m33_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m34 => _blink.BlinkDOMMatrixReadOnly.instance.m34_Getter_(unwrap_jso(this));
+  num get m34 => _blink.BlinkDOMMatrixReadOnly.instance.m34_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m41 => _blink.BlinkDOMMatrixReadOnly.instance.m41_Getter_(unwrap_jso(this));
+  num get m41 => _blink.BlinkDOMMatrixReadOnly.instance.m41_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m42 => _blink.BlinkDOMMatrixReadOnly.instance.m42_Getter_(unwrap_jso(this));
+  num get m42 => _blink.BlinkDOMMatrixReadOnly.instance.m42_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m43 => _blink.BlinkDOMMatrixReadOnly.instance.m43_Getter_(unwrap_jso(this));
+  num get m43 => _blink.BlinkDOMMatrixReadOnly.instance.m43_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m44 => _blink.BlinkDOMMatrixReadOnly.instance.m44_Getter_(unwrap_jso(this));
+  num get m44 => _blink.BlinkDOMMatrixReadOnly.instance.m44_Getter_(this);
   
   @DomName('DOMMatrixReadOnly.multiply')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiply(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.multiply_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
+  DomMatrix multiply(DomMatrix other) => _blink.BlinkDOMMatrixReadOnly.instance.multiply_Callback_1_(this, other);
   
   DomMatrix scale(num scale, [num originX, num originY]) {
     if (originY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_3_(unwrap_jso(this), scale, originX, originY));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_3_(this, scale, originX, originY);
     }
     if (originX != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_2_(unwrap_jso(this), scale, originX));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_2_(this, scale, originX);
     }
-    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_1_(unwrap_jso(this), scale));
+    return _blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_1_(this, scale);
   }
 
   DomMatrix scale3d(num scale, [num originX, num originY, num originZ]) {
     if (originZ != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_4_(unwrap_jso(this), scale, originX, originY, originZ));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_4_(this, scale, originX, originY, originZ);
     }
     if (originY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_3_(unwrap_jso(this), scale, originX, originY));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_3_(this, scale, originX, originY);
     }
     if (originX != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_2_(unwrap_jso(this), scale, originX));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_2_(this, scale, originX);
     }
-    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_1_(unwrap_jso(this), scale));
+    return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_1_(this, scale);
   }
 
   DomMatrix scaleNonUniform(num scaleX, [num scaleY, num scaleZn, num originX, num originY, num originZ]) {
     if (originZ != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_6_(unwrap_jso(this), scaleX, scaleY, scaleZn, originX, originY, originZ));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_6_(this, scaleX, scaleY, scaleZn, originX, originY, originZ);
     }
     if (originY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_5_(unwrap_jso(this), scaleX, scaleY, scaleZn, originX, originY));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_5_(this, scaleX, scaleY, scaleZn, originX, originY);
     }
     if (originX != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_4_(unwrap_jso(this), scaleX, scaleY, scaleZn, originX));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_4_(this, scaleX, scaleY, scaleZn, originX);
     }
     if (scaleZn != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_3_(unwrap_jso(this), scaleX, scaleY, scaleZn));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_3_(this, scaleX, scaleY, scaleZn);
     }
     if (scaleY != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), scaleX, scaleY));
+      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_2_(this, scaleX, scaleY);
     }
-    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_1_(unwrap_jso(this), scaleX));
+    return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_1_(this, scaleX);
   }
 
   @DomName('DOMMatrixReadOnly.toFloat32Array')
   @DocsEditable()
   @Experimental() // untriaged
-  Float32List toFloat32Array() => wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.toFloat32Array_Callback_0_(unwrap_jso(this)));
+  Float32List toFloat32Array() => _blink.BlinkDOMMatrixReadOnly.instance.toFloat32Array_Callback_0_(this);
   
   @DomName('DOMMatrixReadOnly.toFloat64Array')
   @DocsEditable()
   @Experimental() // untriaged
-  Float64List toFloat64Array() => wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.toFloat64Array_Callback_0_(unwrap_jso(this)));
+  Float64List toFloat64Array() => _blink.BlinkDOMMatrixReadOnly.instance.toFloat64Array_Callback_0_(this);
   
   DomMatrix translate(num tx, num ty, [num tz]) {
     if (tz != null) {
-      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_3_(unwrap_jso(this), tx, ty, tz));
+      return _blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_3_(this, tx, ty, tz);
     }
-    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_2_(unwrap_jso(this), tx, ty));
+    return _blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_2_(this, tx, ty);
   }
 
 }
@@ -12980,27 +11832,19 @@
   @DomName('DOMParser.DOMParser')
   @DocsEditable()
   factory DomParser() {
-    return wrap_jso(_blink.BlinkDOMParser.instance.constructorCallback_0_());
+    return _blink.BlinkDOMParser.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static DomParser internalCreateDomParser() {
-    return new DomParser._internalWrap();
-  }
-
-  factory DomParser._internalWrap() {
-    return new DomParser.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomParser.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String type) => wrap_jso(_blink.BlinkDOMParser.instance.parseFromString_Callback_2_(unwrap_jso(this), str, type));
+  Document parseFromString(String str, String type) => _blink.BlinkDOMParser.instance.parseFromString_Callback_2_(this, str, type);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13022,33 +11866,29 @@
   factory DomPoint([point_OR_x, num y, num z, num w]) {
     if ((point_OR_x is Map || point_OR_x == null) && y == null && z == null && w == null) {
       var point_1 = convertDartToNative_Dictionary(point_OR_x);
-      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_1_(point_1));
+      return _blink.BlinkDOMPoint.instance.constructorCallback_1_(point_1);
     }
     if (point_OR_x == null && y == null && z == null && w == null) {
-      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_0_());
+      return _blink.BlinkDOMPoint.instance.constructorCallback_0_();
     }
     if ((point_OR_x is num || point_OR_x == null) && y == null && z == null && w == null) {
-      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_1_(point_OR_x));
+      return _blink.BlinkDOMPoint.instance.constructorCallback_1_(point_OR_x);
     }
     if ((y is num || y == null) && (point_OR_x is num || point_OR_x == null) && z == null && w == null) {
-      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_2_(point_OR_x, y));
+      return _blink.BlinkDOMPoint.instance.constructorCallback_2_(point_OR_x, y);
     }
     if ((z is num || z == null) && (y is num || y == null) && (point_OR_x is num || point_OR_x == null) && w == null) {
-      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_3_(point_OR_x, y, z));
+      return _blink.BlinkDOMPoint.instance.constructorCallback_3_(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 wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_4_(point_OR_x, y, z, w));
+      return _blink.BlinkDOMPoint.instance.constructorCallback_4_(point_OR_x, y, z, w);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
 
   @Deprecated("Internal Use Only")
-  static DomPoint internalCreateDomPoint() {
-    return new DomPoint._internalWrap();
-  }
-
-  external factory DomPoint._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomPoint.internal_() : super.internal_();
@@ -13060,42 +11900,42 @@
   @DomName('DOMPoint.w')
   @DocsEditable()
   @Experimental() // untriaged
-  num get w => _blink.BlinkDOMPoint.instance.w_Getter_(unwrap_jso(this));
+  num get w => _blink.BlinkDOMPoint.instance.w_Getter_(this);
   
   @DomName('DOMPoint.w')
   @DocsEditable()
   @Experimental() // untriaged
-  set w(num value) => _blink.BlinkDOMPoint.instance.w_Setter_(unwrap_jso(this), value);
+  set w(num value) => _blink.BlinkDOMPoint.instance.w_Setter_(this, value);
   
   @DomName('DOMPoint.x')
   @DocsEditable()
   @Experimental() // untriaged
-  num get x => _blink.BlinkDOMPoint.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDOMPoint.instance.x_Getter_(this);
   
   @DomName('DOMPoint.x')
   @DocsEditable()
   @Experimental() // untriaged
-  set x(num value) => _blink.BlinkDOMPoint.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkDOMPoint.instance.x_Setter_(this, value);
   
   @DomName('DOMPoint.y')
   @DocsEditable()
   @Experimental() // untriaged
-  num get y => _blink.BlinkDOMPoint.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDOMPoint.instance.y_Getter_(this);
   
   @DomName('DOMPoint.y')
   @DocsEditable()
   @Experimental() // untriaged
-  set y(num value) => _blink.BlinkDOMPoint.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkDOMPoint.instance.y_Setter_(this, value);
   
   @DomName('DOMPoint.z')
   @DocsEditable()
   @Experimental() // untriaged
-  num get z => _blink.BlinkDOMPoint.instance.z_Getter_(unwrap_jso(this));
+  num get z => _blink.BlinkDOMPoint.instance.z_Getter_(this);
   
   @DomName('DOMPoint.z')
   @DocsEditable()
   @Experimental() // untriaged
-  set z(num value) => _blink.BlinkDOMPoint.instance.z_Setter_(unwrap_jso(this), value);
+  set z(num value) => _blink.BlinkDOMPoint.instance.z_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13115,43 +11955,35 @@
   @DomName('DOMPointReadOnly.DOMPointReadOnly')
   @DocsEditable()
   factory DomPointReadOnly(num x, num y, num z, num w) {
-    return wrap_jso(_blink.BlinkDOMPointReadOnly.instance.constructorCallback_4_(x, y, z, w));
+    return _blink.BlinkDOMPointReadOnly.instance.constructorCallback_4_(x, y, z, w);
   }
 
+
   @Deprecated("Internal Use Only")
-  static DomPointReadOnly internalCreateDomPointReadOnly() {
-    return new DomPointReadOnly._internalWrap();
-  }
-
-  factory DomPointReadOnly._internalWrap() {
-    return new DomPointReadOnly.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomPointReadOnly.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DOMPointReadOnly.w')
   @DocsEditable()
   @Experimental() // untriaged
-  num get w => _blink.BlinkDOMPointReadOnly.instance.w_Getter_(unwrap_jso(this));
+  num get w => _blink.BlinkDOMPointReadOnly.instance.w_Getter_(this);
   
   @DomName('DOMPointReadOnly.x')
   @DocsEditable()
   @Experimental() // untriaged
-  num get x => _blink.BlinkDOMPointReadOnly.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDOMPointReadOnly.instance.x_Getter_(this);
   
   @DomName('DOMPointReadOnly.y')
   @DocsEditable()
   @Experimental() // untriaged
-  num get y => _blink.BlinkDOMPointReadOnly.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDOMPointReadOnly.instance.y_Getter_(this);
   
   @DomName('DOMPointReadOnly.z')
   @DocsEditable()
   @Experimental() // untriaged
-  num get z => _blink.BlinkDOMPointReadOnly.instance.z_Getter_(unwrap_jso(this));
+  num get z => _blink.BlinkDOMPointReadOnly.instance.z_Getter_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -13259,61 +12091,55 @@
   @DomName('DOMRectReadOnly.DOMRectReadOnly')
   @DocsEditable()
   factory DomRectReadOnly(num x, num y, num width, num height) {
-    return wrap_jso(_blink.BlinkDOMRectReadOnly.instance.constructorCallback_4_(x, y, width, height));
+    return _blink.BlinkDOMRectReadOnly.instance.constructorCallback_4_(x, y, width, height);
   }
 
+
   @Deprecated("Internal Use Only")
-  static DomRectReadOnly internalCreateDomRectReadOnly() {
-    return new DomRectReadOnly._internalWrap();
-  }
-
-  factory DomRectReadOnly._internalWrap() {
-    return new DomRectReadOnly.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomRectReadOnly.internal_() { }
 
-
   @DomName('DOMRectReadOnly.bottom')
   @DocsEditable()
   @Experimental() // untriaged
-  num get bottom => _blink.BlinkDOMRectReadOnly.instance.bottom_Getter_(unwrap_jso(this));
+  num get bottom => _blink.BlinkDOMRectReadOnly.instance.bottom_Getter_(this);
   
   @DomName('DOMRectReadOnly.height')
   @DocsEditable()
   @Experimental() // untriaged
-  num get height => _blink.BlinkDOMRectReadOnly.instance.height_Getter_(unwrap_jso(this));
+  num get height => _blink.BlinkDOMRectReadOnly.instance.height_Getter_(this);
   
   @DomName('DOMRectReadOnly.left')
   @DocsEditable()
   @Experimental() // untriaged
-  num get left => _blink.BlinkDOMRectReadOnly.instance.left_Getter_(unwrap_jso(this));
+  num get left => _blink.BlinkDOMRectReadOnly.instance.left_Getter_(this);
   
   @DomName('DOMRectReadOnly.right')
   @DocsEditable()
   @Experimental() // untriaged
-  num get right => _blink.BlinkDOMRectReadOnly.instance.right_Getter_(unwrap_jso(this));
+  num get right => _blink.BlinkDOMRectReadOnly.instance.right_Getter_(this);
   
   @DomName('DOMRectReadOnly.top')
   @DocsEditable()
   @Experimental() // untriaged
-  num get top => _blink.BlinkDOMRectReadOnly.instance.top_Getter_(unwrap_jso(this));
+  num get top => _blink.BlinkDOMRectReadOnly.instance.top_Getter_(this);
   
   @DomName('DOMRectReadOnly.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.BlinkDOMRectReadOnly.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkDOMRectReadOnly.instance.width_Getter_(this);
   
   @DomName('DOMRectReadOnly.x')
   @DocsEditable()
   @Experimental() // untriaged
-  num get x => _blink.BlinkDOMRectReadOnly.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDOMRectReadOnly.instance.x_Getter_(this);
   
   @DomName('DOMRectReadOnly.y')
   @DocsEditable()
   @Experimental() // untriaged
-  num get y => _blink.BlinkDOMRectReadOnly.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDOMRectReadOnly.instance.y_Getter_(this);
   }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13331,11 +12157,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DomSettableTokenList internalCreateDomSettableTokenList() {
-    return new DomSettableTokenList._internalWrap();
-  }
-
-  external factory DomSettableTokenList._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomSettableTokenList.internal_() : super.internal_();
@@ -13343,16 +12165,16 @@
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  String get value => _blink.BlinkDOMSettableTokenList.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkDOMSettableTokenList.instance.value_Getter_(this);
   
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkDOMSettableTokenList.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkDOMSettableTokenList.instance.value_Setter_(this, value);
   
   @DomName('DOMSettableTokenList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  String item(int index) => _blink.BlinkDOMSettableTokenList.instance.item_Callback_1_(unwrap_jso(this), index);
+  String item(int index) => _blink.BlinkDOMSettableTokenList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13368,32 +12190,24 @@
   // To suppress missing implicit constructor warnings.
   factory DomStringList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DomStringList internalCreateDomStringList() {
-    return new DomStringList._internalWrap();
-  }
 
-  factory DomStringList._internalWrap() {
-    return new DomStringList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomStringList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DOMStringList.length')
   @DocsEditable()
-  int get length => _blink.BlinkDOMStringList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkDOMStringList.instance.length_Getter_(this);
   
   String operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return _blink.BlinkDOMStringList.instance.item_Callback_1_(unwrap_jso(this), index);
+    return _nativeIndexedGetter(index);
   }
 
-  String _nativeIndexedGetter(int index) => _blink.BlinkDOMStringList.instance.item_Callback_1_(unwrap_jso(this), index);
+  String _nativeIndexedGetter(int index) => (_blink.BlinkDOMStringList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -13436,15 +12250,15 @@
   @DomName('DOMStringList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  String __getter__(int index) => _blink.BlinkDOMStringList.instance.$__getter___Callback_1_(unwrap_jso(this), index);
+  String __getter__(int index) => _blink.BlinkDOMStringList.instance.$__getter___Callback_1_(this, index);
   
   @DomName('DOMStringList.contains')
   @DocsEditable()
-  bool contains(String string) => _blink.BlinkDOMStringList.instance.contains_Callback_1_(unwrap_jso(this), string);
+  bool contains(String string) => _blink.BlinkDOMStringList.instance.contains_Callback_1_(this, string);
   
   @DomName('DOMStringList.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkDOMStringList.instance.item_Callback_1_(unwrap_jso(this), index);
+  String item(int index) => _blink.BlinkDOMStringList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13462,11 +12276,11 @@
 
   void __delete__(index_OR_name) {
     if ((index_OR_name is String || index_OR_name == null)) {
-      _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(this, index_OR_name);
       return;
     }
     if ((index_OR_name is int || index_OR_name == null)) {
-      _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(this, index_OR_name);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -13478,11 +12292,11 @@
 
   void __setter__(index_OR_name, String value) {
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), value);
+      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), value);
+      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -13507,48 +12321,40 @@
   // To suppress missing implicit constructor warnings.
   factory DomTokenList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DomTokenList internalCreateDomTokenList() {
-    return new DomTokenList._internalWrap();
-  }
 
-  factory DomTokenList._internalWrap() {
-    return new DomTokenList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DomTokenList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('DOMTokenList.length')
   @DocsEditable()
-  int get length => _blink.BlinkDOMTokenList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkDOMTokenList.instance.length_Getter_(this);
   
   @DomName('DOMTokenList.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(String tokens) => _blink.BlinkDOMTokenList.instance.add_Callback_1_(unwrap_jso(this), tokens);
+  void add(String tokens) => _blink.BlinkDOMTokenList.instance.add_Callback_1_(this, tokens);
   
   @DomName('DOMTokenList.contains')
   @DocsEditable()
-  bool contains(String token) => _blink.BlinkDOMTokenList.instance.contains_Callback_1_(unwrap_jso(this), token);
+  bool contains(String token) => _blink.BlinkDOMTokenList.instance.contains_Callback_1_(this, token);
   
   @DomName('DOMTokenList.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkDOMTokenList.instance.item_Callback_1_(unwrap_jso(this), index);
+  String item(int index) => _blink.BlinkDOMTokenList.instance.item_Callback_1_(this, index);
   
   @DomName('DOMTokenList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(String tokens) => _blink.BlinkDOMTokenList.instance.remove_Callback_1_(unwrap_jso(this), tokens);
+  void remove(String tokens) => _blink.BlinkDOMTokenList.instance.remove_Callback_1_(this, tokens);
   
   bool toggle(String token, [bool force]) {
     if (force != null) {
-      return _blink.BlinkDOMTokenList.instance.toggle_Callback_2_(unwrap_jso(this), token, force);
+      return _blink.BlinkDOMTokenList.instance.toggle_Callback_2_(this, token, force);
     }
-    return _blink.BlinkDOMTokenList.instance.toggle_Callback_1_(unwrap_jso(this), token);
+    return _blink.BlinkDOMTokenList.instance.toggle_Callback_1_(this, token);
   }
 
 }
@@ -13566,21 +12372,13 @@
   // To suppress missing implicit constructor warnings.
   factory EffectModel._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static EffectModel internalCreateEffectModel() {
-    return new EffectModel._internalWrap();
-  }
 
-  factory EffectModel._internalWrap() {
-    return new EffectModel.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   EffectModel.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -14891,7 +13689,11 @@
    *     }
    *     document.registerElement('x-custom', CustomElement);
    */
-  Element.created() : super._created();
+  Element.created() : super._created() {
+    // Validate that this is a custom element & possibly perform additional
+    // initialization.
+    _blink.Blink_Utils.initializeCustomElement(this);
+  }
 
   /**
    * Creates the HTML element specified by the tag name.
@@ -15780,24 +14582,20 @@
   static var _htmlCollection = js.context["HTMLCollection"];
   static var _nodeList = js.context["NodeList"];
 
+  static const _evilAttributeNames =
+      const ['attributes', 'lastChild', 'children', 'childNodes'];
+
   static bool _hasCorruptedAttributes(Element element) {
-    var attributes = unwrap_jso(element)["attributes"];
-    if (!attributes.instanceof(_namedNodeMap)) {
-      return true;
-    }
-    var childNodes = unwrap_jso(element.childNodes);
-    var length = childNodes["length"];
-    var lastChild = unwrap_jso(element.lastChild);
-    if (null != lastChild &&
-        lastChild != childNodes[length - 1]) {
-      return true;
-    }
-    var children = unwrap_jso(element._children);
-    if (null != children) { // On Safari, children can apparently be null.
-      if (!children.instanceof(_htmlCollection) ||
-          children.instanceof(_nodeList)) {
-	return true;
-      }
+    // We have trusted access to children and to attributes of objects,
+    // so we can inspect directly for attempts at DOM clobbering.
+    var child = element.firstChild;
+    while( child != null)  {
+      if (child is Element) {
+      for (var attributeName in ["id", "name"]) {
+        var childAttribute = child.getAttribute(attributeName);
+        if (_evilAttributeNames.contains(childAttribute)) return true;
+      }}
+      child = child.nextNode;
     }
     return false;
   }
@@ -15806,62 +14604,60 @@
   static bool _hasCorruptedAttributesAdditionalCheck(Element element) => false;
 
   static String _safeTagName(element) {
-    String result = 'element tag unavailable';
     try {
-      if (element.tagName is String) {
-        result = element.tagName;
-      }
+      // Safe as we plumb directly to a C++ native method.
+      return element.tagName;
     } catch (e) {}
-    return result;
+    return 'element tag unavailable';
   }
 
   // Need to explicitly delegate because Element is no longer abstract for Dartium.
-  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
-  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
+  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(this);
+  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(this);
 
   @DomName('Element.offsetParent')
   @DocsEditable()
-  Element get offsetParent => wrap_jso(_blink.BlinkElement.instance.offsetParent_Getter_(unwrap_jso(this)));
+  Element get offsetParent => _blink.BlinkElement.instance.offsetParent_Getter_(this);
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this));
+  int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(this);
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(unwrap_jso(this));
+  int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(this);
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(unwrap_jso(this));
+  int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(this);
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(unwrap_jso(this));
+  int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(this);
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(unwrap_jso(this)).round();
+  int get scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(unwrap_jso(this)).round();
+  int get scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
+  set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(this, value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(unwrap_jso(this)).round();
+  int get scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(this).round();
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
+  set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(this, value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(unwrap_jso(this)).round();
+  int get scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(this).round();
 
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
@@ -16536,11 +15332,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Element internalCreateElement() {
-    return new Element._internalWrap();
-  }
-
-  external factory Element._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Element.internal_() : super.internal_();
@@ -16576,115 +15368,115 @@
 
   @DomName('Element.attributes')
   @DocsEditable()
-  _NamedNodeMap get _attributes => wrap_jso(_blink.BlinkElement.instance.attributes_Getter_(unwrap_jso(this)));
+  _NamedNodeMap get _attributes => _blink.BlinkElement.instance.attributes_Getter_(this);
   
   @DomName('Element.className')
   @DocsEditable()
-  String get className => _blink.BlinkElement.instance.className_Getter_(unwrap_jso(this));
+  String get className => _blink.BlinkElement.instance.className_Getter_(this);
   
   @DomName('Element.className')
   @DocsEditable()
-  set className(String value) => _blink.BlinkElement.instance.className_Setter_(unwrap_jso(this), value);
+  set className(String value) => _blink.BlinkElement.instance.className_Setter_(this, value);
   
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight => _blink.BlinkElement.instance.clientHeight_Getter_(unwrap_jso(this));
+  int get clientHeight => _blink.BlinkElement.instance.clientHeight_Getter_(this);
   
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft => _blink.BlinkElement.instance.clientLeft_Getter_(unwrap_jso(this));
+  int get clientLeft => _blink.BlinkElement.instance.clientLeft_Getter_(this);
   
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop => _blink.BlinkElement.instance.clientTop_Getter_(unwrap_jso(this));
+  int get clientTop => _blink.BlinkElement.instance.clientTop_Getter_(this);
   
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth => _blink.BlinkElement.instance.clientWidth_Getter_(unwrap_jso(this));
+  int get clientWidth => _blink.BlinkElement.instance.clientWidth_Getter_(this);
   
   @DomName('Element.computedName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get computedName => _blink.BlinkElement.instance.computedName_Getter_(unwrap_jso(this));
+  String get computedName => _blink.BlinkElement.instance.computedName_Getter_(this);
   
   @DomName('Element.computedRole')
   @DocsEditable()
   @Experimental() // untriaged
-  String get computedRole => _blink.BlinkElement.instance.computedRole_Getter_(unwrap_jso(this));
+  String get computedRole => _blink.BlinkElement.instance.computedRole_Getter_(this);
   
   @DomName('Element.id')
   @DocsEditable()
-  String get id => _blink.BlinkElement.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkElement.instance.id_Getter_(this);
   
   @DomName('Element.id')
   @DocsEditable()
-  set id(String value) => _blink.BlinkElement.instance.id_Setter_(unwrap_jso(this), value);
+  set id(String value) => _blink.BlinkElement.instance.id_Setter_(this, value);
   
   @DomName('Element.innerHTML')
   @DocsEditable()
-  String get _innerHtml => _blink.BlinkElement.instance.innerHTML_Getter_(unwrap_jso(this));
+  String get _innerHtml => _blink.BlinkElement.instance.innerHTML_Getter_(this);
   
   @DomName('Element.innerHTML')
   @DocsEditable()
-  set _innerHtml(String value) => _blink.BlinkElement.instance.innerHTML_Setter_(unwrap_jso(this), value);
+  set _innerHtml(String value) => _blink.BlinkElement.instance.innerHTML_Setter_(this, value);
   
   @DomName('Element.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.BlinkElement.instance.localName_Getter_(unwrap_jso(this));
+  String get _localName => _blink.BlinkElement.instance.localName_Getter_(this);
   
   @DomName('Element.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.BlinkElement.instance.namespaceURI_Getter_(unwrap_jso(this));
+  String get _namespaceUri => _blink.BlinkElement.instance.namespaceURI_Getter_(this);
   
   @DomName('Element.outerHTML')
   @DocsEditable()
-  String get outerHtml => _blink.BlinkElement.instance.outerHTML_Getter_(unwrap_jso(this));
+  String get outerHtml => _blink.BlinkElement.instance.outerHTML_Getter_(this);
   
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get _scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(unwrap_jso(this));
+  int get _scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(this);
   
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  num get _scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(unwrap_jso(this));
+  num get _scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(this);
   
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  set _scrollLeft(num value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value);
+  set _scrollLeft(num value) => _blink.BlinkElement.instance.scrollLeft_Setter_(this, value);
   
   @DomName('Element.scrollTop')
   @DocsEditable()
-  num get _scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(unwrap_jso(this));
+  num get _scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(this);
   
   @DomName('Element.scrollTop')
   @DocsEditable()
-  set _scrollTop(num value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value);
+  set _scrollTop(num value) => _blink.BlinkElement.instance.scrollTop_Setter_(this, value);
   
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get _scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(unwrap_jso(this));
+  int get _scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(this);
   
   @DomName('Element.shadowRoot')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   @Experimental()
-  ShadowRoot get shadowRoot => wrap_jso(_blink.BlinkElement.instance.shadowRoot_Getter_(unwrap_jso(this)));
+  ShadowRoot get shadowRoot => _blink.BlinkElement.instance.shadowRoot_Getter_(this);
   
   @DomName('Element.tagName')
   @DocsEditable()
-  String get tagName => _blink.BlinkElement.instance.tagName_Getter_(unwrap_jso(this));
+  String get tagName => _blink.BlinkElement.instance.tagName_Getter_(this);
   
   Animation _animate(Object effect, [timing]) {
     if (effect != null && timing == null) {
-      return wrap_jso(_blink.BlinkElement.instance.animate_Callback_1_(unwrap_jso(this), effect));
+      return _blink.BlinkElement.instance.animate_Callback_1_(this, effect);
     }
     if ((timing is num) && effect != null) {
-      return wrap_jso(_blink.BlinkElement.instance.animate_Callback_2_(unwrap_jso(this), effect, unwrap_jso(timing)));
+      return _blink.BlinkElement.instance.animate_Callback_2_(this, effect, timing);
     }
     if (timing != null && effect != null) {
-      return wrap_jso(_blink.BlinkElement.instance.animate_Callback_2_(unwrap_jso(this), effect, unwrap_jso(timing)));
+      return _blink.BlinkElement.instance.animate_Callback_2_(this, effect, timing);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -16692,14 +15484,14 @@
   @DomName('Element.closest')
   @DocsEditable()
   @Experimental() // untriaged
-  Element closest(String selectors) => wrap_jso(_blink.BlinkElement.instance.closest_Callback_1_(unwrap_jso(this), selectors));
+  Element closest(String selectors) => _blink.BlinkElement.instance.closest_Callback_1_(this, selectors);
   
   ShadowRoot createShadowRoot([Map shadowRootInitDict]) {
     if (shadowRootInitDict == null) {
-      return wrap_jso(_blink.BlinkElement.instance.createShadowRoot_Callback_0_(unwrap_jso(this)));
+      return _blink.BlinkElement.instance.createShadowRoot_Callback_0_(this);
     }
     if ((shadowRootInitDict is Map)) {
-      return wrap_jso(_blink.BlinkElement.instance.createShadowRoot_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(shadowRootInitDict)));
+      return _blink.BlinkElement.instance.createShadowRoot_Callback_1_(this, convertDartToNative_Dictionary(shadowRootInitDict));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -16707,17 +15499,17 @@
   @DomName('Element.getAnimations')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Animation> getAnimations() => wrap_jso(_blink.BlinkElement.instance.getAnimations_Callback_0_(unwrap_jso(this)));
+  List<Animation> getAnimations() => (_blink.BlinkElement.instance.getAnimations_Callback_0_(this));
   
   @DomName('Element.getAttribute')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttribute(String name) => _blink.BlinkElement.instance.getAttribute_Callback_1_(unwrap_jso(this), name);
+  String getAttribute(String name) => _blink.BlinkElement.instance.getAttribute_Callback_1_(this, name);
   
   @DomName('Element.getAttributeNS')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.getAttributeNS_Callback_2_(unwrap_jso(this), namespaceURI, localName);
+  String getAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.getAttributeNS_Callback_2_(this, namespaceURI, localName);
   
   /**
    * Returns the smallest bounding rectangle that encompasses this element's
@@ -16733,7 +15525,7 @@
    */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => make_dart_rectangle(_blink.BlinkElement.instance.getBoundingClientRect_Callback_0_(unwrap_jso(this)));
+  Rectangle getBoundingClientRect() => make_dart_rectangle(_blink.BlinkElement.instance.getBoundingClientRect_Callback_0_(this));
   
   /**
    * Returns a list of bounding rectangles for each box associated with this
@@ -16749,7 +15541,7 @@
    */
   @DomName('Element.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => wrap_jso(_blink.BlinkElement.instance.getClientRects_Callback_0_(unwrap_jso(this)));
+  List<Rectangle> getClientRects() => _blink.BlinkElement.instance.getClientRects_Callback_0_(this);
   
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -16764,7 +15556,7 @@
   @DomName('Element.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => wrap_jso(_blink.BlinkElement.instance.getDestinationInsertionPoints_Callback_0_(unwrap_jso(this)));
+  List<Node> getDestinationInsertionPoints() => (_blink.BlinkElement.instance.getDestinationInsertionPoints_Callback_0_(this));
   
   /**
    * Returns a list of nodes with the given class name inside this element.
@@ -16777,69 +15569,69 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => wrap_jso(_blink.BlinkElement.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), classNames));
+  List<Node> getElementsByClassName(String classNames) => (_blink.BlinkElement.instance.getElementsByClassName_Callback_1_(this, classNames));
   
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  List<Node> _getElementsByTagName(String localName) => wrap_jso(_blink.BlinkElement.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), localName));
+  List<Node> _getElementsByTagName(String localName) => (_blink.BlinkElement.instance.getElementsByTagName_Callback_1_(this, localName));
   
   @DomName('Element.hasAttribute')
   @DocsEditable()
-  bool _hasAttribute(String name) => _blink.BlinkElement.instance.hasAttribute_Callback_1_(unwrap_jso(this), name);
+  bool _hasAttribute(String name) => _blink.BlinkElement.instance.hasAttribute_Callback_1_(this, name);
   
   @DomName('Element.hasAttributeNS')
   @DocsEditable()
-  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.hasAttributeNS_Callback_2_(unwrap_jso(this), namespaceURI, localName);
+  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.hasAttributeNS_Callback_2_(this, namespaceURI, localName);
   
   @DomName('Element.insertAdjacentElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element insertAdjacentElement(String where, Element element) => wrap_jso(_blink.BlinkElement.instance.insertAdjacentElement_Callback_2_(unwrap_jso(this), where, unwrap_jso(element)));
+  Element insertAdjacentElement(String where, Element element) => _blink.BlinkElement.instance.insertAdjacentElement_Callback_2_(this, where, element);
   
   @DomName('Element.insertAdjacentHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  void _insertAdjacentHtml(String position, String text) => _blink.BlinkElement.instance.insertAdjacentHTML_Callback_2_(unwrap_jso(this), position, text);
+  void _insertAdjacentHtml(String position, String text) => _blink.BlinkElement.instance.insertAdjacentHTML_Callback_2_(this, position, text);
   
   @DomName('Element.insertAdjacentText')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentText(String where, String text) => _blink.BlinkElement.instance.insertAdjacentText_Callback_2_(unwrap_jso(this), where, text);
+  void insertAdjacentText(String where, String text) => _blink.BlinkElement.instance.insertAdjacentText_Callback_2_(this, where, text);
   
   @DomName('Element.matches')
   @DocsEditable()
   @Experimental() // untriaged
-  bool matches(String selectors) => _blink.BlinkElement.instance.matches_Callback_1_(unwrap_jso(this), selectors);
+  bool matches(String selectors) => _blink.BlinkElement.instance.matches_Callback_1_(this, selectors);
   
   @DomName('Element.removeAttribute')
   @DocsEditable()
-  void _removeAttribute(String name) => _blink.BlinkElement.instance.removeAttribute_Callback_1_(unwrap_jso(this), name);
+  void _removeAttribute(String name) => _blink.BlinkElement.instance.removeAttribute_Callback_1_(this, name);
   
   @DomName('Element.removeAttributeNS')
   @DocsEditable()
-  void _removeAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.removeAttributeNS_Callback_2_(unwrap_jso(this), namespaceURI, localName);
+  void _removeAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.removeAttributeNS_Callback_2_(this, namespaceURI, localName);
   
   @DomName('Element.requestFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestFullscreen() => _blink.BlinkElement.instance.requestFullscreen_Callback_0_(unwrap_jso(this));
+  void requestFullscreen() => _blink.BlinkElement.instance.requestFullscreen_Callback_0_(this);
   
   @DomName('Element.requestPointerLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestPointerLock() => _blink.BlinkElement.instance.requestPointerLock_Callback_0_(unwrap_jso(this));
+  void requestPointerLock() => _blink.BlinkElement.instance.requestPointerLock_Callback_0_(this);
   
   void scroll([options_OR_x, num y]) {
     if (options_OR_x == null && y == null) {
-      _blink.BlinkElement.instance.scroll_Callback_0_(unwrap_jso(this));
+      _blink.BlinkElement.instance.scroll_Callback_0_(this);
       return;
     }
     if ((options_OR_x is Map) && y == null) {
-      _blink.BlinkElement.instance.scroll_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      _blink.BlinkElement.instance.scroll_Callback_1_(this, options_OR_x);
       return;
     }
     if ((y is num) && (options_OR_x is num)) {
-      _blink.BlinkElement.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), y);
+      _blink.BlinkElement.instance.scroll_Callback_2_(this, options_OR_x, y);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -16847,15 +15639,15 @@
 
   void scrollBy([options_OR_x, num y]) {
     if (options_OR_x == null && y == null) {
-      _blink.BlinkElement.instance.scrollBy_Callback_0_(unwrap_jso(this));
+      _blink.BlinkElement.instance.scrollBy_Callback_0_(this);
       return;
     }
     if ((options_OR_x is Map) && y == null) {
-      _blink.BlinkElement.instance.scrollBy_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      _blink.BlinkElement.instance.scrollBy_Callback_1_(this, options_OR_x);
       return;
     }
     if ((y is num) && (options_OR_x is num)) {
-      _blink.BlinkElement.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), y);
+      _blink.BlinkElement.instance.scrollBy_Callback_2_(this, options_OR_x, y);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -16863,33 +15655,33 @@
 
   void _scrollIntoView([bool alignWithTop]) {
     if (alignWithTop != null) {
-      _blink.BlinkElement.instance.scrollIntoView_Callback_1_(unwrap_jso(this), alignWithTop);
+      _blink.BlinkElement.instance.scrollIntoView_Callback_1_(this, alignWithTop);
       return;
     }
-    _blink.BlinkElement.instance.scrollIntoView_Callback_0_(unwrap_jso(this));
+    _blink.BlinkElement.instance.scrollIntoView_Callback_0_(this);
     return;
   }
 
   void _scrollIntoViewIfNeeded([bool centerIfNeeded]) {
     if (centerIfNeeded != null) {
-      _blink.BlinkElement.instance.scrollIntoViewIfNeeded_Callback_1_(unwrap_jso(this), centerIfNeeded);
+      _blink.BlinkElement.instance.scrollIntoViewIfNeeded_Callback_1_(this, centerIfNeeded);
       return;
     }
-    _blink.BlinkElement.instance.scrollIntoViewIfNeeded_Callback_0_(unwrap_jso(this));
+    _blink.BlinkElement.instance.scrollIntoViewIfNeeded_Callback_0_(this);
     return;
   }
 
   void scrollTo([options_OR_x, num y]) {
     if (options_OR_x == null && y == null) {
-      _blink.BlinkElement.instance.scrollTo_Callback_0_(unwrap_jso(this));
+      _blink.BlinkElement.instance.scrollTo_Callback_0_(this);
       return;
     }
     if ((options_OR_x is Map) && y == null) {
-      _blink.BlinkElement.instance.scrollTo_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      _blink.BlinkElement.instance.scrollTo_Callback_1_(this, options_OR_x);
       return;
     }
     if ((y is num) && (options_OR_x is num)) {
-      _blink.BlinkElement.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), y);
+      _blink.BlinkElement.instance.scrollTo_Callback_2_(this, options_OR_x, y);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -16897,49 +15689,49 @@
 
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void setAttribute(String name, String value) => _blink.BlinkElement.instance.setAttribute_Callback_2_(unwrap_jso(this), name, value);
+  void setAttribute(String name, String value) => _blink.BlinkElement.instance.setAttribute_Callback_2_(this, name, value);
   
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String name, String value) => _blink.BlinkElement.instance.setAttributeNS_Callback_3_(unwrap_jso(this), namespaceURI, name, value);
+  void setAttributeNS(String namespaceURI, String name, String value) => _blink.BlinkElement.instance.setAttributeNS_Callback_3_(this, namespaceURI, name, value);
   
   @DomName('Element.after')
   @DocsEditable()
   @Experimental() // untriaged
-  void after(Object nodes) => _blink.BlinkElement.instance.after_Callback_1_(unwrap_jso(this), nodes);
+  void after(Object nodes) => _blink.BlinkElement.instance.after_Callback_1_(this, nodes);
   
   @DomName('Element.before')
   @DocsEditable()
   @Experimental() // untriaged
-  void before(Object nodes) => _blink.BlinkElement.instance.before_Callback_1_(unwrap_jso(this), nodes);
+  void before(Object nodes) => _blink.BlinkElement.instance.before_Callback_1_(this, nodes);
   
   @DomName('Element.remove')
   @DocsEditable()
-  void remove() => _blink.BlinkElement.instance.remove_Callback_0_(unwrap_jso(this));
+  void remove() => _blink.BlinkElement.instance.remove_Callback_0_(this);
   
   @DomName('Element.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => wrap_jso(_blink.BlinkElement.instance.nextElementSibling_Getter_(unwrap_jso(this)));
+  Element get nextElementSibling => _blink.BlinkElement.instance.nextElementSibling_Getter_(this);
   
   @DomName('Element.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => wrap_jso(_blink.BlinkElement.instance.previousElementSibling_Getter_(unwrap_jso(this)));
+  Element get previousElementSibling => _blink.BlinkElement.instance.previousElementSibling_Getter_(this);
   
   @DomName('Element.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.BlinkElement.instance.childElementCount_Getter_(unwrap_jso(this));
+  int get _childElementCount => _blink.BlinkElement.instance.childElementCount_Getter_(this);
   
   @DomName('Element.children')
   @DocsEditable()
-  List<Node> get _children => wrap_jso(_blink.BlinkElement.instance.children_Getter_(unwrap_jso(this)));
+  List<Node> get _children => (_blink.BlinkElement.instance.children_Getter_(this));
   
   @DomName('Element.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => wrap_jso(_blink.BlinkElement.instance.firstElementChild_Getter_(unwrap_jso(this)));
+  Element get _firstElementChild => _blink.BlinkElement.instance.firstElementChild_Getter_(this);
   
   @DomName('Element.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => wrap_jso(_blink.BlinkElement.instance.lastElementChild_Getter_(unwrap_jso(this)));
+  Element get _lastElementChild => _blink.BlinkElement.instance.lastElementChild_Getter_(this);
   
   /**
    * Finds the first descendant element of this element that matches the
@@ -16959,11 +15751,11 @@
    */
   @DomName('Element.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => wrap_jso(_blink.BlinkElement.instance.querySelector_Callback_1_(unwrap_jso(this), selectors));
+  Element querySelector(String selectors) => _blink.BlinkElement.instance.querySelector_Callback_1_(this, selectors);
   
   @DomName('Element.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => wrap_jso(_blink.BlinkElement.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
+  List<Node> _querySelectorAll(String selectors) => (_blink.BlinkElement.instance.querySelectorAll_Callback_1_(this, selectors));
   
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
@@ -17480,11 +16272,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static EmbedElement internalCreateEmbedElement() {
-    return new EmbedElement._internalWrap();
-  }
-
-  external factory EmbedElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   EmbedElement.internal_() : super.internal_();
@@ -17501,51 +16289,51 @@
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  String get height => _blink.BlinkHTMLEmbedElement.instance.height_Getter_(unwrap_jso(this));
+  String get height => _blink.BlinkHTMLEmbedElement.instance.height_Getter_(this);
   
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  set height(String value) => _blink.BlinkHTMLEmbedElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(String value) => _blink.BlinkHTMLEmbedElement.instance.height_Setter_(this, value);
   
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLEmbedElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLEmbedElement.instance.name_Getter_(this);
   
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLEmbedElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLEmbedElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLEmbedElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLEmbedElement.instance.src_Getter_(this);
   
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLEmbedElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLEmbedElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLEmbedElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLEmbedElement.instance.type_Getter_(this);
   
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLEmbedElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLEmbedElement.instance.type_Setter_(this, value);
   
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  String get width => _blink.BlinkHTMLEmbedElement.instance.width_Getter_(unwrap_jso(this));
+  String get width => _blink.BlinkHTMLEmbedElement.instance.width_Getter_(this);
   
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  set width(String value) => _blink.BlinkHTMLEmbedElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(String value) => _blink.BlinkHTMLEmbedElement.instance.width_Setter_(this, value);
   
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.BlinkHTMLEmbedElement.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLEmbedElement.instance.$__getter___Callback_1_(this, index_OR_name);
   
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLEmbedElement.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), unwrap_jso(value));
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLEmbedElement.instance.$__setter___Callback_2_(this, index_OR_name, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17574,55 +16362,47 @@
   // To suppress missing implicit constructor warnings.
   factory Entry._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Entry internalCreateEntry() {
-    return new Entry._internalWrap();
-  }
 
-  factory Entry._internalWrap() {
-    return new Entry.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Entry.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Entry.filesystem')
   @DocsEditable()
-  FileSystem get filesystem => wrap_jso(_blink.BlinkEntry.instance.filesystem_Getter_(unwrap_jso(this)));
+  FileSystem get filesystem => _blink.BlinkEntry.instance.filesystem_Getter_(this);
   
   @DomName('Entry.fullPath')
   @DocsEditable()
-  String get fullPath => _blink.BlinkEntry.instance.fullPath_Getter_(unwrap_jso(this));
+  String get fullPath => _blink.BlinkEntry.instance.fullPath_Getter_(this);
   
   @DomName('Entry.isDirectory')
   @DocsEditable()
-  bool get isDirectory => _blink.BlinkEntry.instance.isDirectory_Getter_(unwrap_jso(this));
+  bool get isDirectory => _blink.BlinkEntry.instance.isDirectory_Getter_(this);
   
   @DomName('Entry.isFile')
   @DocsEditable()
-  bool get isFile => _blink.BlinkEntry.instance.isFile_Getter_(unwrap_jso(this));
+  bool get isFile => _blink.BlinkEntry.instance.isFile_Getter_(this);
   
   @DomName('Entry.name')
   @DocsEditable()
-  String get name => _blink.BlinkEntry.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkEntry.instance.name_Getter_(this);
   
   void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.copyTo_Callback_4_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkEntry.instance.copyTo_Callback_4_(this, parent, name, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.instance.copyTo_Callback_3_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
+      _blink.BlinkEntry.instance.copyTo_Callback_3_(this, parent, name, successCallback);
       return;
     }
     if (name != null) {
-      _blink.BlinkEntry.instance.copyTo_Callback_2_(unwrap_jso(this), unwrap_jso(parent), name);
+      _blink.BlinkEntry.instance.copyTo_Callback_2_(this, parent, name);
       return;
     }
-    _blink.BlinkEntry.instance.copyTo_Callback_1_(unwrap_jso(this), unwrap_jso(parent));
+    _blink.BlinkEntry.instance.copyTo_Callback_1_(this, parent);
     return;
   }
 
@@ -17636,10 +16416,10 @@
 
   void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.getMetadata_Callback_2_(unwrap_jso(this), unwrap_jso((metadata) => successCallback(wrap_jso(metadata))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkEntry.instance.getMetadata_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkEntry.instance.getMetadata_Callback_1_(unwrap_jso(this), unwrap_jso((metadata) => successCallback(wrap_jso(metadata))));
+    _blink.BlinkEntry.instance.getMetadata_Callback_1_(this, successCallback);
     return;
   }
 
@@ -17653,14 +16433,14 @@
 
   void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.getParent_Callback_2_(unwrap_jso(this), unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkEntry.instance.getParent_Callback_2_(this, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.instance.getParent_Callback_1_(unwrap_jso(this), unwrap_jso((entry) => successCallback(wrap_jso(entry))));
+      _blink.BlinkEntry.instance.getParent_Callback_1_(this, successCallback);
       return;
     }
-    _blink.BlinkEntry.instance.getParent_Callback_0_(unwrap_jso(this));
+    _blink.BlinkEntry.instance.getParent_Callback_0_(this);
     return;
   }
 
@@ -17674,18 +16454,18 @@
 
   void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.moveTo_Callback_4_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkEntry.instance.moveTo_Callback_4_(this, parent, name, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.instance.moveTo_Callback_3_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
+      _blink.BlinkEntry.instance.moveTo_Callback_3_(this, parent, name, successCallback);
       return;
     }
     if (name != null) {
-      _blink.BlinkEntry.instance.moveTo_Callback_2_(unwrap_jso(this), unwrap_jso(parent), name);
+      _blink.BlinkEntry.instance.moveTo_Callback_2_(this, parent, name);
       return;
     }
-    _blink.BlinkEntry.instance.moveTo_Callback_1_(unwrap_jso(this), unwrap_jso(parent));
+    _blink.BlinkEntry.instance.moveTo_Callback_1_(this, parent);
     return;
   }
 
@@ -17699,10 +16479,10 @@
 
   void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.remove_Callback_2_(unwrap_jso(this), unwrap_jso(() => successCallback()), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkEntry.instance.remove_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkEntry.instance.remove_Callback_1_(unwrap_jso(this), unwrap_jso(() => successCallback()));
+    _blink.BlinkEntry.instance.remove_Callback_1_(this, successCallback);
     return;
   }
 
@@ -17716,7 +16496,7 @@
 
   @DomName('Entry.toURL')
   @DocsEditable()
-  String toUrl() => _blink.BlinkEntry.instance.toURL_Callback_0_(unwrap_jso(this));
+  String toUrl() => _blink.BlinkEntry.instance.toURL_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17760,18 +16540,14 @@
   factory ErrorEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkErrorEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkErrorEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkErrorEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static ErrorEvent internalCreateErrorEvent() {
-    return new ErrorEvent._internalWrap();
-  }
-
-  external factory ErrorEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ErrorEvent.internal_() : super.internal_();
@@ -17780,24 +16556,24 @@
   @DomName('ErrorEvent.colno')
   @DocsEditable()
   @Experimental() // untriaged
-  int get colno => _blink.BlinkErrorEvent.instance.colno_Getter_(unwrap_jso(this));
+  int get colno => _blink.BlinkErrorEvent.instance.colno_Getter_(this);
   
   @DomName('ErrorEvent.error')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get error => wrap_jso(_blink.BlinkErrorEvent.instance.error_Getter_(unwrap_jso(this)));
+  Object get error => (_blink.BlinkErrorEvent.instance.error_Getter_(this));
   
   @DomName('ErrorEvent.filename')
   @DocsEditable()
-  String get filename => _blink.BlinkErrorEvent.instance.filename_Getter_(unwrap_jso(this));
+  String get filename => _blink.BlinkErrorEvent.instance.filename_Getter_(this);
   
   @DomName('ErrorEvent.lineno')
   @DocsEditable()
-  int get lineno => _blink.BlinkErrorEvent.instance.lineno_Getter_(unwrap_jso(this));
+  int get lineno => _blink.BlinkErrorEvent.instance.lineno_Getter_(this);
   
   @DomName('ErrorEvent.message')
   @DocsEditable()
-  String get message => _blink.BlinkErrorEvent.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkErrorEvent.instance.message_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17864,26 +16640,18 @@
   factory Event._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkEvent.instance.constructorCallback_1_(type);
   }
 
+
   @Deprecated("Internal Use Only")
-  static Event internalCreateEvent() {
-    return new Event._internalWrap();
-  }
-
-  factory Event._internalWrap() {
-    return new Event.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Event.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /**
    * This event is being handled by the event target.
    *
@@ -17923,23 +16691,23 @@
 
   @DomName('Event.bubbles')
   @DocsEditable()
-  bool get bubbles => _blink.BlinkEvent.instance.bubbles_Getter_(unwrap_jso(this));
+  bool get bubbles => _blink.BlinkEvent.instance.bubbles_Getter_(this);
   
   @DomName('Event.cancelable')
   @DocsEditable()
-  bool get cancelable => _blink.BlinkEvent.instance.cancelable_Getter_(unwrap_jso(this));
+  bool get cancelable => _blink.BlinkEvent.instance.cancelable_Getter_(this);
   
   @DomName('Event.currentTarget')
   @DocsEditable()
-  EventTarget get currentTarget => wrap_jso(_blink.BlinkEvent.instance.currentTarget_Getter_(unwrap_jso(this)));
+  EventTarget get currentTarget => _blink.BlinkEvent.instance.currentTarget_Getter_(this);
   
   @DomName('Event.defaultPrevented')
   @DocsEditable()
-  bool get defaultPrevented => _blink.BlinkEvent.instance.defaultPrevented_Getter_(unwrap_jso(this));
+  bool get defaultPrevented => _blink.BlinkEvent.instance.defaultPrevented_Getter_(this);
   
   @DomName('Event.eventPhase')
   @DocsEditable()
-  int get eventPhase => _blink.BlinkEvent.instance.eventPhase_Getter_(unwrap_jso(this));
+  int get eventPhase => _blink.BlinkEvent.instance.eventPhase_Getter_(this);
   
   /**
    * This event's path, taking into account shadow DOM.
@@ -17954,35 +16722,35 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  List<EventTarget> get path => wrap_jso(_blink.BlinkEvent.instance.path_Getter_(unwrap_jso(this)));
+  List<EventTarget> get path => (_blink.BlinkEvent.instance.path_Getter_(this));
   
   @DomName('Event.target')
   @DocsEditable()
-  EventTarget get target => wrap_jso(_blink.BlinkEvent.instance.target_Getter_(unwrap_jso(this)));
+  EventTarget get target => _blink.BlinkEvent.instance.target_Getter_(this);
   
   @DomName('Event.timeStamp')
   @DocsEditable()
-  int get timeStamp => _blink.BlinkEvent.instance.timeStamp_Getter_(unwrap_jso(this));
+  int get timeStamp => _blink.BlinkEvent.instance.timeStamp_Getter_(this);
   
   @DomName('Event.type')
   @DocsEditable()
-  String get type => _blink.BlinkEvent.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkEvent.instance.type_Getter_(this);
   
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String type, bool bubbles, bool cancelable) => _blink.BlinkEvent.instance.initEvent_Callback_3_(unwrap_jso(this), type, bubbles, cancelable);
+  void _initEvent(String type, bool bubbles, bool cancelable) => _blink.BlinkEvent.instance.initEvent_Callback_3_(this, type, bubbles, cancelable);
   
   @DomName('Event.preventDefault')
   @DocsEditable()
-  void preventDefault() => _blink.BlinkEvent.instance.preventDefault_Callback_0_(unwrap_jso(this));
+  void preventDefault() => _blink.BlinkEvent.instance.preventDefault_Callback_0_(this);
   
   @DomName('Event.stopImmediatePropagation')
   @DocsEditable()
-  void stopImmediatePropagation() => _blink.BlinkEvent.instance.stopImmediatePropagation_Callback_0_(unwrap_jso(this));
+  void stopImmediatePropagation() => _blink.BlinkEvent.instance.stopImmediatePropagation_Callback_0_(this);
   
   @DomName('Event.stopPropagation')
   @DocsEditable()
-  void stopPropagation() => _blink.BlinkEvent.instance.stopPropagation_Callback_0_(unwrap_jso(this));
+  void stopPropagation() => _blink.BlinkEvent.instance.stopPropagation_Callback_0_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -18038,18 +16806,14 @@
   static EventSource _factoryEventSource(String url, [Map eventSourceInitDict]) {
     if (eventSourceInitDict != null) {
       var eventSourceInitDict_1 = convertDartToNative_Dictionary(eventSourceInitDict);
-      return wrap_jso(_blink.BlinkEventSource.instance.constructorCallback_2_(url, eventSourceInitDict_1));
+      return _blink.BlinkEventSource.instance.constructorCallback_2_(url, eventSourceInitDict_1);
     }
-    return wrap_jso(_blink.BlinkEventSource.instance.constructorCallback_1_(url));
+    return _blink.BlinkEventSource.instance.constructorCallback_1_(url);
   }
 
 
   @Deprecated("Internal Use Only")
-  static EventSource internalCreateEventSource() {
-    return new EventSource._internalWrap();
-  }
-
-  external factory EventSource._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   EventSource.internal_() : super.internal_();
@@ -18069,19 +16833,19 @@
 
   @DomName('EventSource.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkEventSource.instance.readyState_Getter_(unwrap_jso(this));
+  int get readyState => _blink.BlinkEventSource.instance.readyState_Getter_(this);
   
   @DomName('EventSource.url')
   @DocsEditable()
-  String get url => _blink.BlinkEventSource.instance.url_Getter_(unwrap_jso(this));
+  String get url => _blink.BlinkEventSource.instance.url_Getter_(this);
   
   @DomName('EventSource.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.BlinkEventSource.instance.withCredentials_Getter_(unwrap_jso(this));
+  bool get withCredentials => _blink.BlinkEventSource.instance.withCredentials_Getter_(this);
   
   @DomName('EventSource.close')
   @DocsEditable()
-  void close() => _blink.BlinkEventSource.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkEventSource.instance.close_Callback_0_(this);
   
   /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
@@ -18227,32 +16991,24 @@
   // To suppress missing implicit constructor warnings.
   factory EventTarget._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static EventTarget internalCreateEventTarget() {
-    return new EventTarget._internalWrap();
-  }
 
-  factory EventTarget._internalWrap() {
-    return new EventTarget.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   EventTarget.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('EventTarget.addEventListener')
   @DocsEditable()
-  void _addEventListener(String type, EventListener listener, [bool capture]) => _blink.BlinkEventTarget.instance.addEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)), capture);
+  void _addEventListener(String type, EventListener listener, [bool capture]) => _blink.BlinkEventTarget.instance.addEventListener_Callback_3_(this, type, listener, capture);
   
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.BlinkEventTarget.instance.dispatchEvent_Callback_1_(unwrap_jso(this), unwrap_jso(event));
+  bool dispatchEvent(Event event) => _blink.BlinkEventTarget.instance.dispatchEvent_Callback_1_(this, event);
   
   @DomName('EventTarget.removeEventListener')
   @DocsEditable()
-  void _removeEventListener(String type, EventListener listener, [bool capture]) => _blink.BlinkEventTarget.instance.removeEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(js.allowInterop(listener)), capture);
+  void _removeEventListener(String type, EventListener listener, [bool capture]) => _blink.BlinkEventTarget.instance.removeEventListener_Callback_3_(this, type, listener, capture);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18274,18 +17030,14 @@
   factory ExtendableEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkExtendableEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkExtendableEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkExtendableEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkExtendableEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static ExtendableEvent internalCreateExtendableEvent() {
-    return new ExtendableEvent._internalWrap();
-  }
-
-  external factory ExtendableEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ExtendableEvent.internal_() : super.internal_();
@@ -18294,7 +17046,7 @@
   @DomName('ExtendableEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
-  void waitUntil(Object value) => _blink.BlinkExtendableEvent.instance.waitUntil_Callback_1_(unwrap_jso(this), value);
+  void waitUntil(Object value) => _blink.BlinkExtendableEvent.instance.waitUntil_Callback_1_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18315,16 +17067,12 @@
   @DocsEditable()
   factory FederatedCredential(Map data) {
     var data_1 = convertDartToNative_Dictionary(data);
-    return wrap_jso(_blink.BlinkFederatedCredential.instance.constructorCallback_1_(data_1));
+    return _blink.BlinkFederatedCredential.instance.constructorCallback_1_(data_1);
   }
 
 
   @Deprecated("Internal Use Only")
-  static FederatedCredential internalCreateFederatedCredential() {
-    return new FederatedCredential._internalWrap();
-  }
-
-  external factory FederatedCredential._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FederatedCredential.internal_() : super.internal_();
@@ -18333,12 +17081,12 @@
   @DomName('FederatedCredential.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.BlinkFederatedCredential.instance.protocol_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkFederatedCredential.instance.protocol_Getter_(this);
   
   @DomName('FederatedCredential.provider')
   @DocsEditable()
   @Experimental() // untriaged
-  String get provider => _blink.BlinkFederatedCredential.instance.provider_Getter_(unwrap_jso(this));
+  String get provider => _blink.BlinkFederatedCredential.instance.provider_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18360,18 +17108,14 @@
   factory FetchEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkFetchEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkFetchEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkFetchEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkFetchEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static FetchEvent internalCreateFetchEvent() {
-    return new FetchEvent._internalWrap();
-  }
-
-  external factory FetchEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FetchEvent.internal_() : super.internal_();
@@ -18380,17 +17124,17 @@
   @DomName('FetchEvent.isReload')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isReload => _blink.BlinkFetchEvent.instance.isReload_Getter_(unwrap_jso(this));
+  bool get isReload => _blink.BlinkFetchEvent.instance.isReload_Getter_(this);
   
   @DomName('FetchEvent.request')
   @DocsEditable()
   @Experimental() // untriaged
-  _Request get request => wrap_jso(_blink.BlinkFetchEvent.instance.request_Getter_(unwrap_jso(this)));
+  _Request get request => _blink.BlinkFetchEvent.instance.request_Getter_(this);
   
   @DomName('FetchEvent.respondWith')
   @DocsEditable()
   @Experimental() // untriaged
-  void respondWith(Object value) => _blink.BlinkFetchEvent.instance.respondWith_Callback_1_(unwrap_jso(this), value);
+  void respondWith(Object value) => _blink.BlinkFetchEvent.instance.respondWith_Callback_1_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18413,11 +17157,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FieldSetElement internalCreateFieldSetElement() {
-    return new FieldSetElement._internalWrap();
-  }
-
-  external factory FieldSetElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FieldSetElement.internal_() : super.internal_();
@@ -18431,56 +17171,56 @@
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLFieldSetElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLFieldSetElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  HtmlFormControlsCollection get elements => wrap_jso(_blink.BlinkHTMLFieldSetElement.instance.elements_Getter_(unwrap_jso(this)));
+  HtmlFormControlsCollection get elements => _blink.BlinkHTMLFieldSetElement.instance.elements_Getter_(this);
   
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLFieldSetElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLFieldSetElement.instance.form_Getter_(this);
   
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLFieldSetElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLFieldSetElement.instance.name_Getter_(this);
   
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLFieldSetElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLFieldSetElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLFieldSetElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLFieldSetElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLFieldSetElement.instance.type_Getter_(this);
   
   @DomName('HTMLFieldSetElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLFieldSetElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLFieldSetElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLFieldSetElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLFieldSetElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLFieldSetElement.instance.validity_Getter_(this);
   
   @DomName('HTMLFieldSetElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLFieldSetElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLFieldSetElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLFieldSetElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLFieldSetElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLFieldSetElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLFieldSetElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLFieldSetElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLFieldSetElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLFieldSetElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLFieldSetElement.instance.setCustomValidity_Callback_1_(this, error);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18501,18 +17241,14 @@
   factory File(List<Object> fileBits, String fileName, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
-      return wrap_jso(_blink.BlinkFile.instance.constructorCallback_3_(fileBits, fileName, options_1));
+      return _blink.BlinkFile.instance.constructorCallback_3_(fileBits, fileName, options_1);
     }
-    return wrap_jso(_blink.BlinkFile.instance.constructorCallback_2_(fileBits, fileName));
+    return _blink.BlinkFile.instance.constructorCallback_2_(fileBits, fileName);
   }
 
 
   @Deprecated("Internal Use Only")
-  static File internalCreateFile() {
-    return new File._internalWrap();
-  }
-
-  external factory File._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   File.internal_() : super.internal_();
@@ -18521,15 +17257,15 @@
   @DomName('File.lastModified')
   @DocsEditable()
   @Experimental() // untriaged
-  int get lastModified => _blink.BlinkFile.instance.lastModified_Getter_(unwrap_jso(this));
+  int get lastModified => _blink.BlinkFile.instance.lastModified_Getter_(this);
   
   @DomName('File.lastModifiedDate')
   @DocsEditable()
-  DateTime get lastModifiedDate => _blink.BlinkFile.instance.lastModifiedDate_Getter_(unwrap_jso(this));
+  DateTime get lastModifiedDate => _blink.BlinkFile.instance.lastModifiedDate_Getter_(this);
   
   @DomName('File.name')
   @DocsEditable()
-  String get name => _blink.BlinkFile.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkFile.instance.name_Getter_(this);
   
   @DomName('File.webkitRelativePath')
   @DocsEditable()
@@ -18537,7 +17273,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  String get relativePath => _blink.BlinkFile.instance.webkitRelativePath_Getter_(unwrap_jso(this));
+  String get relativePath => _blink.BlinkFile.instance.webkitRelativePath_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18568,11 +17304,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FileEntry internalCreateFileEntry() {
-    return new FileEntry._internalWrap();
-  }
-
-  external factory FileEntry._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FileEntry.internal_() : super.internal_();
@@ -18580,10 +17312,10 @@
 
   void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkFileEntry.instance.createWriter_Callback_2_(unwrap_jso(this), unwrap_jso((fileWriter) => successCallback(wrap_jso(fileWriter))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkFileEntry.instance.createWriter_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkFileEntry.instance.createWriter_Callback_1_(unwrap_jso(this), unwrap_jso((fileWriter) => successCallback(wrap_jso(fileWriter))));
+    _blink.BlinkFileEntry.instance.createWriter_Callback_1_(this, successCallback);
     return;
   }
 
@@ -18597,10 +17329,10 @@
 
   void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkFileEntry.instance.file_Callback_2_(unwrap_jso(this), unwrap_jso((file) => successCallback(wrap_jso(file))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkFileEntry.instance.file_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkFileEntry.instance.file_Callback_1_(unwrap_jso(this), unwrap_jso((file) => successCallback(wrap_jso(file))));
+    _blink.BlinkFileEntry.instance.file_Callback_1_(this, successCallback);
     return;
   }
 
@@ -18630,11 +17362,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FileError internalCreateFileError() {
-    return new FileError._internalWrap();
-  }
-
-  external factory FileError._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FileError.internal_() : super.internal_();
@@ -18690,7 +17418,7 @@
 
   @DomName('FileError.code')
   @DocsEditable()
-  int get code => _blink.BlinkFileError.instance.code_Getter_(unwrap_jso(this));
+  int get code => _blink.BlinkFileError.instance.code_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18706,32 +17434,24 @@
   // To suppress missing implicit constructor warnings.
   factory FileList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static FileList internalCreateFileList() {
-    return new FileList._internalWrap();
-  }
 
-  factory FileList._internalWrap() {
-    return new FileList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FileList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('FileList.length')
   @DocsEditable()
-  int get length => _blink.BlinkFileList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkFileList.instance.length_Getter_(this);
   
   File operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkFileList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  File _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkFileList.instance.item_Callback_1_(unwrap_jso(this), index));
+  File _nativeIndexedGetter(int index) => (_blink.BlinkFileList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, File value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -18773,7 +17493,7 @@
 
   @DomName('FileList.item')
   @DocsEditable()
-  File item(int index) => wrap_jso(_blink.BlinkFileList.instance.item_Callback_1_(unwrap_jso(this), index));
+  File item(int index) => _blink.BlinkFileList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -18788,7 +17508,7 @@
   @DomName('FileReader.result')
   @DocsEditable()
   Object get result {
-    var res = _blink.BlinkFileReader.instance.result_Getter_(unwrap_jso(this));
+    var res = _blink.BlinkFileReader.instance.result_Getter_(this);
     if (res is ByteBuffer) {
       return new Uint8List.view(res);
     }
@@ -18861,16 +17581,12 @@
   @DomName('FileReader.FileReader')
   @DocsEditable()
   factory FileReader() {
-    return wrap_jso(_blink.BlinkFileReader.instance.constructorCallback_0_());
+    return _blink.BlinkFileReader.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static FileReader internalCreateFileReader() {
-    return new FileReader._internalWrap();
-  }
-
-  external factory FileReader._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FileReader.internal_() : super.internal_();
@@ -18890,34 +17606,34 @@
 
   @DomName('FileReader.error')
   @DocsEditable()
-  FileError get error => wrap_jso(_blink.BlinkFileReader.instance.error_Getter_(unwrap_jso(this)));
+  FileError get error => _blink.BlinkFileReader.instance.error_Getter_(this);
   
   @DomName('FileReader.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkFileReader.instance.readyState_Getter_(unwrap_jso(this));
+  int get readyState => _blink.BlinkFileReader.instance.readyState_Getter_(this);
   
   @DomName('FileReader.result')
   @DocsEditable()
-  Object get _result => wrap_jso(_blink.BlinkFileReader.instance.result_Getter_(unwrap_jso(this)));
+  Object get _result => (_blink.BlinkFileReader.instance.result_Getter_(this));
   
   @DomName('FileReader.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkFileReader.instance.abort_Callback_0_(unwrap_jso(this));
+  void abort() => _blink.BlinkFileReader.instance.abort_Callback_0_(this);
   
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
-  void readAsArrayBuffer(Blob blob) => _blink.BlinkFileReader.instance.readAsArrayBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(blob));
+  void readAsArrayBuffer(Blob blob) => _blink.BlinkFileReader.instance.readAsArrayBuffer_Callback_1_(this, blob);
   
   @DomName('FileReader.readAsDataURL')
   @DocsEditable()
-  void readAsDataUrl(Blob blob) => _blink.BlinkFileReader.instance.readAsDataURL_Callback_1_(unwrap_jso(this), unwrap_jso(blob));
+  void readAsDataUrl(Blob blob) => _blink.BlinkFileReader.instance.readAsDataURL_Callback_1_(this, blob);
   
   void readAsText(Blob blob, [String label]) {
     if (label != null) {
-      _blink.BlinkFileReader.instance.readAsText_Callback_2_(unwrap_jso(this), unwrap_jso(blob), label);
+      _blink.BlinkFileReader.instance.readAsText_Callback_2_(this, blob, label);
       return;
     }
-    _blink.BlinkFileReader.instance.readAsText_Callback_1_(unwrap_jso(this), unwrap_jso(blob));
+    _blink.BlinkFileReader.instance.readAsText_Callback_1_(this, blob);
     return;
   }
 
@@ -18966,25 +17682,17 @@
   // To suppress missing implicit constructor warnings.
   factory FileStream._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static FileStream internalCreateFileStream() {
-    return new FileStream._internalWrap();
-  }
 
-  factory FileStream._internalWrap() {
-    return new FileStream.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FileStream.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Stream.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkStream.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkStream.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19003,31 +17711,23 @@
   // To suppress missing implicit constructor warnings.
   factory FileSystem._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static FileSystem internalCreateFileSystem() {
-    return new FileSystem._internalWrap();
-  }
 
-  factory FileSystem._internalWrap() {
-    return new FileSystem.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FileSystem.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('DOMFileSystem.name')
   @DocsEditable()
-  String get name => _blink.BlinkDOMFileSystem.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkDOMFileSystem.instance.name_Getter_(this);
   
   @DomName('DOMFileSystem.root')
   @DocsEditable()
-  DirectoryEntry get root => wrap_jso(_blink.BlinkDOMFileSystem.instance.root_Getter_(unwrap_jso(this)));
+  DirectoryEntry get root => _blink.BlinkDOMFileSystem.instance.root_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19118,11 +17818,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FileWriter internalCreateFileWriter() {
-    return new FileWriter._internalWrap();
-  }
-
-  external factory FileWriter._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FileWriter.internal_() : super.internal_();
@@ -19142,35 +17838,35 @@
 
   @DomName('FileWriter.error')
   @DocsEditable()
-  FileError get error => wrap_jso(_blink.BlinkFileWriter.instance.error_Getter_(unwrap_jso(this)));
+  FileError get error => _blink.BlinkFileWriter.instance.error_Getter_(this);
   
   @DomName('FileWriter.length')
   @DocsEditable()
-  int get length => _blink.BlinkFileWriter.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkFileWriter.instance.length_Getter_(this);
   
   @DomName('FileWriter.position')
   @DocsEditable()
-  int get position => _blink.BlinkFileWriter.instance.position_Getter_(unwrap_jso(this));
+  int get position => _blink.BlinkFileWriter.instance.position_Getter_(this);
   
   @DomName('FileWriter.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkFileWriter.instance.readyState_Getter_(unwrap_jso(this));
+  int get readyState => _blink.BlinkFileWriter.instance.readyState_Getter_(this);
   
   @DomName('FileWriter.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkFileWriter.instance.abort_Callback_0_(unwrap_jso(this));
+  void abort() => _blink.BlinkFileWriter.instance.abort_Callback_0_(this);
   
   @DomName('FileWriter.seek')
   @DocsEditable()
-  void seek(int position) => _blink.BlinkFileWriter.instance.seek_Callback_1_(unwrap_jso(this), position);
+  void seek(int position) => _blink.BlinkFileWriter.instance.seek_Callback_1_(this, position);
   
   @DomName('FileWriter.truncate')
   @DocsEditable()
-  void truncate(int size) => _blink.BlinkFileWriter.instance.truncate_Callback_1_(unwrap_jso(this), size);
+  void truncate(int size) => _blink.BlinkFileWriter.instance.truncate_Callback_1_(this, size);
   
   @DomName('FileWriter.write')
   @DocsEditable()
-  void write(Blob data) => _blink.BlinkFileWriter.instance.write_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void write(Blob data) => _blink.BlinkFileWriter.instance.write_Callback_1_(this, data);
   
   /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
@@ -19232,18 +17928,14 @@
   factory FocusEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkFocusEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkFocusEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkFocusEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkFocusEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static FocusEvent internalCreateFocusEvent() {
-    return new FocusEvent._internalWrap();
-  }
-
-  external factory FocusEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FocusEvent.internal_() : super.internal_();
@@ -19251,7 +17943,7 @@
 
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => wrap_jso(_blink.BlinkFocusEvent.instance.relatedTarget_Getter_(unwrap_jso(this)));
+  EventTarget get relatedTarget => _blink.BlinkFocusEvent.instance.relatedTarget_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19273,110 +17965,102 @@
   factory FontFace(String family, Object source, [Map descriptors]) {
     if (descriptors != null) {
       var descriptors_1 = convertDartToNative_Dictionary(descriptors);
-      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1));
+      return _blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1);
     }
-    return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_2_(family, source));
+    return _blink.BlinkFontFace.instance.constructorCallback_2_(family, source);
   }
 
+
   @Deprecated("Internal Use Only")
-  static FontFace internalCreateFontFace() {
-    return new FontFace._internalWrap();
-  }
-
-  factory FontFace._internalWrap() {
-    return new FontFace.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FontFace.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  String get family => _blink.BlinkFontFace.instance.family_Getter_(unwrap_jso(this));
+  String get family => _blink.BlinkFontFace.instance.family_Getter_(this);
   
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  set family(String value) => _blink.BlinkFontFace.instance.family_Setter_(unwrap_jso(this), value);
+  set family(String value) => _blink.BlinkFontFace.instance.family_Setter_(this, value);
   
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  String get featureSettings => _blink.BlinkFontFace.instance.featureSettings_Getter_(unwrap_jso(this));
+  String get featureSettings => _blink.BlinkFontFace.instance.featureSettings_Getter_(this);
   
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  set featureSettings(String value) => _blink.BlinkFontFace.instance.featureSettings_Setter_(unwrap_jso(this), value);
+  set featureSettings(String value) => _blink.BlinkFontFace.instance.featureSettings_Setter_(this, value);
   
   @DomName('FontFace.loaded')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get loaded => wrap_jso(_blink.BlinkFontFace.instance.loaded_Getter_(unwrap_jso(this)));
+  Future get loaded => convertNativePromiseToDartFuture(_blink.BlinkFontFace.instance.loaded_Getter_(this));
   
   @DomName('FontFace.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.BlinkFontFace.instance.status_Getter_(unwrap_jso(this));
+  String get status => _blink.BlinkFontFace.instance.status_Getter_(this);
   
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  String get stretch => _blink.BlinkFontFace.instance.stretch_Getter_(unwrap_jso(this));
+  String get stretch => _blink.BlinkFontFace.instance.stretch_Getter_(this);
   
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  set stretch(String value) => _blink.BlinkFontFace.instance.stretch_Setter_(unwrap_jso(this), value);
+  set stretch(String value) => _blink.BlinkFontFace.instance.stretch_Setter_(this, value);
   
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  String get style => _blink.BlinkFontFace.instance.style_Getter_(unwrap_jso(this));
+  String get style => _blink.BlinkFontFace.instance.style_Getter_(this);
   
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  set style(String value) => _blink.BlinkFontFace.instance.style_Setter_(unwrap_jso(this), value);
+  set style(String value) => _blink.BlinkFontFace.instance.style_Setter_(this, value);
   
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  String get unicodeRange => _blink.BlinkFontFace.instance.unicodeRange_Getter_(unwrap_jso(this));
+  String get unicodeRange => _blink.BlinkFontFace.instance.unicodeRange_Getter_(this);
   
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  set unicodeRange(String value) => _blink.BlinkFontFace.instance.unicodeRange_Setter_(unwrap_jso(this), value);
+  set unicodeRange(String value) => _blink.BlinkFontFace.instance.unicodeRange_Setter_(this, value);
   
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  String get variant => _blink.BlinkFontFace.instance.variant_Getter_(unwrap_jso(this));
+  String get variant => _blink.BlinkFontFace.instance.variant_Getter_(this);
   
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  set variant(String value) => _blink.BlinkFontFace.instance.variant_Setter_(unwrap_jso(this), value);
+  set variant(String value) => _blink.BlinkFontFace.instance.variant_Setter_(this, value);
   
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  String get weight => _blink.BlinkFontFace.instance.weight_Getter_(unwrap_jso(this));
+  String get weight => _blink.BlinkFontFace.instance.weight_Getter_(this);
   
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  set weight(String value) => _blink.BlinkFontFace.instance.weight_Setter_(unwrap_jso(this), value);
+  set weight(String value) => _blink.BlinkFontFace.instance.weight_Setter_(this, value);
   
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load() => wrap_jso(_blink.BlinkFontFace.instance.load_Callback_0_(unwrap_jso(this)));
+  Future load() => convertNativePromiseToDartFuture(_blink.BlinkFontFace.instance.load_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19395,11 +18079,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FontFaceSet internalCreateFontFaceSet() {
-    return new FontFaceSet._internalWrap();
-  }
-
-  external factory FontFaceSet._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FontFaceSet.internal_() : super.internal_();
@@ -19408,48 +18088,48 @@
   @DomName('FontFaceSet.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkFontFaceSet.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkFontFaceSet.instance.size_Getter_(this);
   
   @DomName('FontFaceSet.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.BlinkFontFaceSet.instance.status_Getter_(unwrap_jso(this));
+  String get status => _blink.BlinkFontFaceSet.instance.status_Getter_(this);
   
   @DomName('FontFaceSet.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.add_Callback_1_(unwrap_jso(this), unwrap_jso(fontFace));
+  void add(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.add_Callback_1_(this, fontFace);
   
   bool check(String font, [String text]) {
     if (text != null) {
-      return _blink.BlinkFontFaceSet.instance.check_Callback_2_(unwrap_jso(this), font, text);
+      return _blink.BlinkFontFaceSet.instance.check_Callback_2_(this, font, text);
     }
-    return _blink.BlinkFontFaceSet.instance.check_Callback_1_(unwrap_jso(this), font);
+    return _blink.BlinkFontFaceSet.instance.check_Callback_1_(this, font);
   }
 
   @DomName('FontFaceSet.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear() => _blink.BlinkFontFaceSet.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkFontFaceSet.instance.clear_Callback_0_(this);
   
   @DomName('FontFaceSet.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  bool delete(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.delete_Callback_1_(unwrap_jso(this), unwrap_jso(fontFace));
+  bool delete(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.delete_Callback_1_(this, fontFace);
   
   void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) {
     if (thisArg != null) {
-      _blink.BlinkFontFaceSet.instance.forEach_Callback_2_(unwrap_jso(this), unwrap_jso((fontFace, fontFaceAgain, set) => callback(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set))), thisArg);
+      _blink.BlinkFontFaceSet.instance.forEach_Callback_2_(this, callback, thisArg);
       return;
     }
-    _blink.BlinkFontFaceSet.instance.forEach_Callback_1_(unwrap_jso(this), unwrap_jso((fontFace, fontFaceAgain, set) => callback(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set))));
+    _blink.BlinkFontFaceSet.instance.forEach_Callback_1_(this, callback);
     return;
   }
 
   @DomName('FontFaceSet.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.has_Callback_1_(unwrap_jso(this), unwrap_jso(fontFace));
+  bool has(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.has_Callback_1_(this, fontFace);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19478,11 +18158,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FontFaceSetLoadEvent internalCreateFontFaceSetLoadEvent() {
-    return new FontFaceSetLoadEvent._internalWrap();
-  }
-
-  external factory FontFaceSetLoadEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FontFaceSetLoadEvent.internal_() : super.internal_();
@@ -19491,7 +18167,7 @@
   @DomName('FontFaceSetLoadEvent.fontfaces')
   @DocsEditable()
   @Experimental() // untriaged
-  List<FontFace> get fontfaces => wrap_jso(_blink.BlinkFontFaceSetLoadEvent.instance.fontfaces_Getter_(unwrap_jso(this)));
+  List<FontFace> get fontfaces => (_blink.BlinkFontFaceSetLoadEvent.instance.fontfaces_Getter_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19513,68 +18189,60 @@
 
   @DomName('FormData.FormData')
   @DocsEditable()
-  factory FormData([FormElement form]) => wrap_jso(_create(form));
+  factory FormData([FormElement form]) => _create(form);
 
   @DocsEditable()
-  static FormData _create(form) => wrap_jso(_blink.BlinkFormData.instance.constructorCallback_1_(form));
+  static FormData _create(form) => _blink.BlinkFormData.instance.constructorCallback_1_(form);
+
 
   @Deprecated("Internal Use Only")
-  static FormData internalCreateFormData() {
-    return new FormData._internalWrap();
-  }
-
-  factory FormData._internalWrap() {
-    return new FormData.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FormData.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('FormData.append')
   @DocsEditable()
-  void append(String name, String value) => _blink.BlinkFormData.instance.append_Callback_2_(unwrap_jso(this), name, value);
+  void append(String name, String value) => _blink.BlinkFormData.instance.append_Callback_2_(this, name, value);
   
   @DomName('FormData.appendBlob')
   @DocsEditable()
-  void appendBlob(String name, Blob value, [String filename]) => _blink.BlinkFormData.instance.append_Callback_3_(unwrap_jso(this), name, unwrap_jso(value), filename);
+  void appendBlob(String name, Blob value, [String filename]) => _blink.BlinkFormData.instance.append_Callback_3_(this, name, value, filename);
   
   @DomName('FormData.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  void delete(String name) => _blink.BlinkFormData.instance.delete_Callback_1_(unwrap_jso(this), name);
+  void delete(String name) => _blink.BlinkFormData.instance.delete_Callback_1_(this, name);
   
   @DomName('FormData.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get(String name) => wrap_jso(_blink.BlinkFormData.instance.get_Callback_1_(unwrap_jso(this), name));
+  Object get(String name) => (_blink.BlinkFormData.instance.get_Callback_1_(this, name));
   
   @DomName('FormData.getAll')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Object> getAll(String name) => _blink.BlinkFormData.instance.getAll_Callback_1_(unwrap_jso(this), name);
+  List<Object> getAll(String name) => _blink.BlinkFormData.instance.getAll_Callback_1_(this, name);
   
   @DomName('FormData.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(String name) => _blink.BlinkFormData.instance.has_Callback_1_(unwrap_jso(this), name);
+  bool has(String name) => _blink.BlinkFormData.instance.has_Callback_1_(this, name);
   
   void set(String name, value, [String filename]) {
     if ((value is Blob || value == null) && (name is String || name == null) && filename == null) {
-      _blink.BlinkFormData.instance.set_Callback_2_(unwrap_jso(this), name, unwrap_jso(value));
+      _blink.BlinkFormData.instance.set_Callback_2_(this, name, value);
       return;
     }
     if ((filename is String || filename == null) && (value is Blob || value == null) && (name is String || name == null)) {
-      _blink.BlinkFormData.instance.set_Callback_3_(unwrap_jso(this), name, unwrap_jso(value), filename);
+      _blink.BlinkFormData.instance.set_Callback_3_(this, name, value, filename);
       return;
     }
     if ((value is String || value == null) && (name is String || name == null) && filename == null) {
-      _blink.BlinkFormData.instance.set_Callback_2_(unwrap_jso(this), name, unwrap_jso(value));
+      _blink.BlinkFormData.instance.set_Callback_2_(this, name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -19600,11 +18268,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FormElement internalCreateFormElement() {
-    return new FormElement._internalWrap();
-  }
-
-  external factory FormElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FormElement.internal_() : super.internal_();
@@ -19618,115 +18282,115 @@
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  String get acceptCharset => _blink.BlinkHTMLFormElement.instance.acceptCharset_Getter_(unwrap_jso(this));
+  String get acceptCharset => _blink.BlinkHTMLFormElement.instance.acceptCharset_Getter_(this);
   
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  set acceptCharset(String value) => _blink.BlinkHTMLFormElement.instance.acceptCharset_Setter_(unwrap_jso(this), value);
+  set acceptCharset(String value) => _blink.BlinkHTMLFormElement.instance.acceptCharset_Setter_(this, value);
   
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  String get action => _blink.BlinkHTMLFormElement.instance.action_Getter_(unwrap_jso(this));
+  String get action => _blink.BlinkHTMLFormElement.instance.action_Getter_(this);
   
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  set action(String value) => _blink.BlinkHTMLFormElement.instance.action_Setter_(unwrap_jso(this), value);
+  set action(String value) => _blink.BlinkHTMLFormElement.instance.action_Setter_(this, value);
   
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  String get autocomplete => _blink.BlinkHTMLFormElement.instance.autocomplete_Getter_(unwrap_jso(this));
+  String get autocomplete => _blink.BlinkHTMLFormElement.instance.autocomplete_Getter_(this);
   
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  set autocomplete(String value) => _blink.BlinkHTMLFormElement.instance.autocomplete_Setter_(unwrap_jso(this), value);
+  set autocomplete(String value) => _blink.BlinkHTMLFormElement.instance.autocomplete_Setter_(this, value);
   
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  String get encoding => _blink.BlinkHTMLFormElement.instance.encoding_Getter_(unwrap_jso(this));
+  String get encoding => _blink.BlinkHTMLFormElement.instance.encoding_Getter_(this);
   
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  set encoding(String value) => _blink.BlinkHTMLFormElement.instance.encoding_Setter_(unwrap_jso(this), value);
+  set encoding(String value) => _blink.BlinkHTMLFormElement.instance.encoding_Setter_(this, value);
   
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  String get enctype => _blink.BlinkHTMLFormElement.instance.enctype_Getter_(unwrap_jso(this));
+  String get enctype => _blink.BlinkHTMLFormElement.instance.enctype_Getter_(this);
   
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  set enctype(String value) => _blink.BlinkHTMLFormElement.instance.enctype_Setter_(unwrap_jso(this), value);
+  set enctype(String value) => _blink.BlinkHTMLFormElement.instance.enctype_Setter_(this, value);
   
   @DomName('HTMLFormElement.length')
   @DocsEditable()
-  int get length => _blink.BlinkHTMLFormElement.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkHTMLFormElement.instance.length_Getter_(this);
   
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  String get method => _blink.BlinkHTMLFormElement.instance.method_Getter_(unwrap_jso(this));
+  String get method => _blink.BlinkHTMLFormElement.instance.method_Getter_(this);
   
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  set method(String value) => _blink.BlinkHTMLFormElement.instance.method_Setter_(unwrap_jso(this), value);
+  set method(String value) => _blink.BlinkHTMLFormElement.instance.method_Setter_(this, value);
   
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLFormElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLFormElement.instance.name_Getter_(this);
   
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLFormElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLFormElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  bool get noValidate => _blink.BlinkHTMLFormElement.instance.noValidate_Getter_(unwrap_jso(this));
+  bool get noValidate => _blink.BlinkHTMLFormElement.instance.noValidate_Getter_(this);
   
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  set noValidate(bool value) => _blink.BlinkHTMLFormElement.instance.noValidate_Setter_(unwrap_jso(this), value);
+  set noValidate(bool value) => _blink.BlinkHTMLFormElement.instance.noValidate_Setter_(this, value);
   
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLFormElement.instance.target_Getter_(unwrap_jso(this));
+  String get target => _blink.BlinkHTMLFormElement.instance.target_Getter_(this);
   
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  set target(String value) => _blink.BlinkHTMLFormElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLFormElement.instance.target_Setter_(this, value);
   
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable()
-  Object __getter__(String name) => wrap_jso(_blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(unwrap_jso(this), name));
+  Object __getter__(String name) => (_blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(this, name));
   
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLFormElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLFormElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLFormElement.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Element item(int index) => wrap_jso(_blink.BlinkHTMLFormElement.instance.item_Callback_1_(unwrap_jso(this), index));
+  Element item(int index) => _blink.BlinkHTMLFormElement.instance.item_Callback_1_(this, index);
   
   @DomName('HTMLFormElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLFormElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLFormElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
   @Experimental()
-  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.instance.requestAutocomplete_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(details));
+  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.instance.requestAutocomplete_Callback_1_(this, convertDartToNative_Dictionary(details));
   
   @DomName('HTMLFormElement.reset')
   @DocsEditable()
-  void reset() => _blink.BlinkHTMLFormElement.instance.reset_Callback_0_(unwrap_jso(this));
+  void reset() => _blink.BlinkHTMLFormElement.instance.reset_Callback_0_(this);
   
   @DomName('HTMLFormElement.submit')
   @DocsEditable()
-  void submit() => _blink.BlinkHTMLFormElement.instance.submit_Callback_0_(unwrap_jso(this));
+  void submit() => _blink.BlinkHTMLFormElement.instance.submit_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19754,50 +18418,42 @@
   // To suppress missing implicit constructor warnings.
   factory Gamepad._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Gamepad internalCreateGamepad() {
-    return new Gamepad._internalWrap();
-  }
 
-  factory Gamepad._internalWrap() {
-    return new Gamepad.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Gamepad.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Gamepad.axes')
   @DocsEditable()
-  List<num> get axes => wrap_jso(_blink.BlinkGamepad.instance.axes_Getter_(unwrap_jso(this)));
+  List<num> get axes => _blink.BlinkGamepad.instance.axes_Getter_(this);
   
   @DomName('Gamepad.buttons')
   @DocsEditable()
-  List<GamepadButton> get buttons => wrap_jso(_blink.BlinkGamepad.instance.buttons_Getter_(unwrap_jso(this)));
+  List<GamepadButton> get buttons => (_blink.BlinkGamepad.instance.buttons_Getter_(this));
   
   @DomName('Gamepad.connected')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get connected => _blink.BlinkGamepad.instance.connected_Getter_(unwrap_jso(this));
+  bool get connected => _blink.BlinkGamepad.instance.connected_Getter_(this);
   
   @DomName('Gamepad.id')
   @DocsEditable()
-  String get id => _blink.BlinkGamepad.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkGamepad.instance.id_Getter_(this);
   
   @DomName('Gamepad.index')
   @DocsEditable()
-  int get index => _blink.BlinkGamepad.instance.index_Getter_(unwrap_jso(this));
+  int get index => _blink.BlinkGamepad.instance.index_Getter_(this);
   
   @DomName('Gamepad.mapping')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mapping => _blink.BlinkGamepad.instance.mapping_Getter_(unwrap_jso(this));
+  String get mapping => _blink.BlinkGamepad.instance.mapping_Getter_(this);
   
   @DomName('Gamepad.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.BlinkGamepad.instance.timestamp_Getter_(unwrap_jso(this));
+  int get timestamp => _blink.BlinkGamepad.instance.timestamp_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19814,30 +18470,22 @@
   // To suppress missing implicit constructor warnings.
   factory GamepadButton._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static GamepadButton internalCreateGamepadButton() {
-    return new GamepadButton._internalWrap();
-  }
 
-  factory GamepadButton._internalWrap() {
-    return new GamepadButton.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GamepadButton.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('GamepadButton.pressed')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get pressed => _blink.BlinkGamepadButton.instance.pressed_Getter_(unwrap_jso(this));
+  bool get pressed => _blink.BlinkGamepadButton.instance.pressed_Getter_(this);
   
   @DomName('GamepadButton.value')
   @DocsEditable()
   @Experimental() // untriaged
-  num get value => _blink.BlinkGamepadButton.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkGamepadButton.instance.value_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19859,18 +18507,14 @@
   factory GamepadEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkGamepadEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkGamepadEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkGamepadEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkGamepadEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static GamepadEvent internalCreateGamepadEvent() {
-    return new GamepadEvent._internalWrap();
-  }
-
-  external factory GamepadEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GamepadEvent.internal_() : super.internal_();
@@ -19879,7 +18523,7 @@
   @DomName('GamepadEvent.gamepad')
   @DocsEditable()
   @Experimental() // untriaged
-  Gamepad get gamepad => wrap_jso(_blink.BlinkGamepadEvent.instance.gamepad_Getter_(unwrap_jso(this)));
+  Gamepad get gamepad => _blink.BlinkGamepadEvent.instance.gamepad_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19896,35 +18540,27 @@
   // To suppress missing implicit constructor warnings.
   factory Geofencing._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Geofencing internalCreateGeofencing() {
-    return new Geofencing._internalWrap();
-  }
 
-  factory Geofencing._internalWrap() {
-    return new Geofencing.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Geofencing.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Geofencing.getRegisteredRegions')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegisteredRegions() => wrap_jso(_blink.BlinkGeofencing.instance.getRegisteredRegions_Callback_0_(unwrap_jso(this)));
+  Future getRegisteredRegions() => convertNativePromiseToDartFuture(_blink.BlinkGeofencing.instance.getRegisteredRegions_Callback_0_(this));
   
   @DomName('Geofencing.registerRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future registerRegion(GeofencingRegion region) => wrap_jso(_blink.BlinkGeofencing.instance.registerRegion_Callback_1_(unwrap_jso(this), unwrap_jso(region)));
+  Future registerRegion(GeofencingRegion region) => convertNativePromiseToDartFuture(_blink.BlinkGeofencing.instance.registerRegion_Callback_1_(this, region));
   
   @DomName('Geofencing.unregisterRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregisterRegion(String regionId) => wrap_jso(_blink.BlinkGeofencing.instance.unregisterRegion_Callback_1_(unwrap_jso(this), regionId));
+  Future unregisterRegion(String regionId) => convertNativePromiseToDartFuture(_blink.BlinkGeofencing.instance.unregisterRegion_Callback_1_(this, regionId));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19943,11 +18579,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static GeofencingEvent internalCreateGeofencingEvent() {
-    return new GeofencingEvent._internalWrap();
-  }
-
-  external factory GeofencingEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GeofencingEvent.internal_() : super.internal_();
@@ -19956,12 +18588,12 @@
   @DomName('GeofencingEvent.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkGeofencingEvent.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkGeofencingEvent.instance.id_Getter_(this);
   
   @DomName('GeofencingEvent.region')
   @DocsEditable()
   @Experimental() // untriaged
-  GeofencingRegion get region => wrap_jso(_blink.BlinkGeofencingEvent.instance.region_Getter_(unwrap_jso(this)));
+  GeofencingRegion get region => _blink.BlinkGeofencingEvent.instance.region_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19978,25 +18610,17 @@
   // To suppress missing implicit constructor warnings.
   factory GeofencingRegion._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static GeofencingRegion internalCreateGeofencingRegion() {
-    return new GeofencingRegion._internalWrap();
-  }
 
-  factory GeofencingRegion._internalWrap() {
-    return new GeofencingRegion.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GeofencingRegion.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('GeofencingRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkGeofencingRegion.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkGeofencingRegion.instance.id_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20082,46 +18706,38 @@
   // To suppress missing implicit constructor warnings.
   factory Geolocation._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Geolocation internalCreateGeolocation() {
-    return new Geolocation._internalWrap();
-  }
 
-  factory Geolocation._internalWrap() {
-    return new Geolocation.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Geolocation.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Geolocation.clearWatch')
   @DocsEditable()
-  void _clearWatch(int watchID) => _blink.BlinkGeolocation.instance.clearWatch_Callback_1_(unwrap_jso(this), watchID);
+  void _clearWatch(int watchID) => _blink.BlinkGeolocation.instance.clearWatch_Callback_1_(this, watchID);
   
   void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
-      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_3_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))), convertDartToNative_Dictionary(options));
+      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_3_(this, successCallback, errorCallback, convertDartToNative_Dictionary(options));
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_2_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_1_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))));
+    _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_1_(this, successCallback);
     return;
   }
 
   int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
-      return _blink.BlinkGeolocation.instance.watchPosition_Callback_3_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))), convertDartToNative_Dictionary(options));
+      return _blink.BlinkGeolocation.instance.watchPosition_Callback_3_(this, successCallback, errorCallback, convertDartToNative_Dictionary(options));
     }
     if (errorCallback != null) {
-      return _blink.BlinkGeolocation.instance.watchPosition_Callback_2_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      return _blink.BlinkGeolocation.instance.watchPosition_Callback_2_(this, successCallback, errorCallback);
     }
-    return _blink.BlinkGeolocation.instance.watchPosition_Callback_1_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))));
+    return _blink.BlinkGeolocation.instance.watchPosition_Callback_1_(this, successCallback);
   }
 }
 
@@ -20139,28 +18755,20 @@
   // To suppress missing implicit constructor warnings.
   factory Geoposition._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Geoposition internalCreateGeoposition() {
-    return new Geoposition._internalWrap();
-  }
 
-  factory Geoposition._internalWrap() {
-    return new Geoposition.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Geoposition.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Geoposition.coords')
   @DocsEditable()
-  Coordinates get coords => wrap_jso(_blink.BlinkGeoposition.instance.coords_Getter_(unwrap_jso(this)));
+  Coordinates get coords => _blink.BlinkGeoposition.instance.coords_Getter_(this);
   
   @DomName('Geoposition.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.BlinkGeoposition.instance.timestamp_Getter_(unwrap_jso(this));
+  int get timestamp => _blink.BlinkGeoposition.instance.timestamp_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20726,11 +19334,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HRElement internalCreateHRElement() {
-    return new HRElement._internalWrap();
-  }
-
-  external factory HRElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HRElement.internal_() : super.internal_();
@@ -20745,12 +19349,12 @@
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  String get color => _blink.BlinkHTMLHRElement.instance.color_Getter_(unwrap_jso(this));
+  String get color => _blink.BlinkHTMLHRElement.instance.color_Getter_(this);
   
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  set color(String value) => _blink.BlinkHTMLHRElement.instance.color_Setter_(unwrap_jso(this), value);
+  set color(String value) => _blink.BlinkHTMLHRElement.instance.color_Setter_(this, value);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -20782,18 +19386,14 @@
   factory HashChangeEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkHashChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkHashChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkHashChangeEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkHashChangeEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static HashChangeEvent internalCreateHashChangeEvent() {
-    return new HashChangeEvent._internalWrap();
-  }
-
-  external factory HashChangeEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HashChangeEvent.internal_() : super.internal_();
@@ -20804,15 +19404,15 @@
 
   @DomName('HashChangeEvent.newURL')
   @DocsEditable()
-  String get newUrl => _blink.BlinkHashChangeEvent.instance.newURL_Getter_(unwrap_jso(this));
+  String get newUrl => _blink.BlinkHashChangeEvent.instance.newURL_Getter_(this);
   
   @DomName('HashChangeEvent.oldURL')
   @DocsEditable()
-  String get oldUrl => _blink.BlinkHashChangeEvent.instance.oldURL_Getter_(unwrap_jso(this));
+  String get oldUrl => _blink.BlinkHashChangeEvent.instance.oldURL_Getter_(this);
   
   @DomName('HashChangeEvent.initHashChangeEvent')
   @DocsEditable()
-  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.BlinkHashChangeEvent.instance.initHashChangeEvent_Callback_5_(unwrap_jso(this), type, canBubble, cancelable, oldURL, newURL);
+  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.BlinkHashChangeEvent.instance.initHashChangeEvent_Callback_5_(this, type, canBubble, cancelable, oldURL, newURL);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20834,11 +19434,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HeadElement internalCreateHeadElement() {
-    return new HeadElement._internalWrap();
-  }
-
-  external factory HeadElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HeadElement.internal_() : super.internal_();
@@ -20869,36 +19465,28 @@
   @DocsEditable()
   factory Headers([input]) {
     if (input == null) {
-      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_0_());
+      return _blink.BlinkHeaders.instance.constructorCallback_0_();
     }
     if ((input is Headers)) {
-      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input));
+      return _blink.BlinkHeaders.instance.constructorCallback_1_(input);
     }
     if ((input is Map)) {
       var input_1 = convertDartToNative_Dictionary(input);
-      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input_1));
+      return _blink.BlinkHeaders.instance.constructorCallback_1_(input_1);
     }
     if ((input is List<Object>)) {
-      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input));
+      return _blink.BlinkHeaders.instance.constructorCallback_1_(input);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @Deprecated("Internal Use Only")
-  static Headers internalCreateHeaders() {
-    return new Headers._internalWrap();
-  }
 
-  factory Headers._internalWrap() {
-    return new Headers.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Headers.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -20939,11 +19527,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HeadingElement internalCreateHeadingElement() {
-    return new HeadingElement._internalWrap();
-  }
-
-  external factory HeadingElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HeadingElement.internal_() : super.internal_();
@@ -20977,66 +19561,58 @@
   // To suppress missing implicit constructor warnings.
   factory History._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static History internalCreateHistory() {
-    return new History._internalWrap();
-  }
 
-  factory History._internalWrap() {
-    return new History.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   History.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('History.length')
   @DocsEditable()
-  int get length => _blink.BlinkHistory.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkHistory.instance.length_Getter_(this);
   
   @DomName('History.options')
   @DocsEditable()
   @Experimental() // untriaged
-   get options => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkHistory.instance.options_Getter_(unwrap_jso(this))));
+   get options => convertNativeDictionaryToDartDictionary((_blink.BlinkHistory.instance.options_Getter_(this)));
   
   @DomName('History.state')
   @DocsEditable()
-  dynamic get state => wrap_jso(_blink.BlinkHistory.instance.state_Getter_(unwrap_jso(this)));
+  dynamic get state => convertNativeToDart_SerializedScriptValue(_blink.BlinkHistory.instance.state_Getter_(this));
   
   @DomName('History.back')
   @DocsEditable()
-  void back() => _blink.BlinkHistory.instance.back_Callback_0_(unwrap_jso(this));
+  void back() => _blink.BlinkHistory.instance.back_Callback_0_(this);
   
   @DomName('History.forward')
   @DocsEditable()
-  void forward() => _blink.BlinkHistory.instance.forward_Callback_0_(unwrap_jso(this));
+  void forward() => _blink.BlinkHistory.instance.forward_Callback_0_(this);
   
   void go([int delta]) {
     if (delta != null) {
-      _blink.BlinkHistory.instance.go_Callback_1_(unwrap_jso(this), delta);
+      _blink.BlinkHistory.instance.go_Callback_1_(this, delta);
       return;
     }
-    _blink.BlinkHistory.instance.go_Callback_0_(unwrap_jso(this));
+    _blink.BlinkHistory.instance.go_Callback_0_(this);
     return;
   }
 
   void pushState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
     if (options != null) {
-      _blink.BlinkHistory.instance.pushState_Callback_4_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url, convertDartToNative_Dictionary(options));
+      _blink.BlinkHistory.instance.pushState_Callback_4_(this, convertDartToNative_SerializedScriptValue(data), title, url, convertDartToNative_Dictionary(options));
       return;
     }
-    _blink.BlinkHistory.instance.pushState_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url);
+    _blink.BlinkHistory.instance.pushState_Callback_3_(this, convertDartToNative_SerializedScriptValue(data), title, url);
     return;
   }
 
   void replaceState(/*SerializedScriptValue*/ data, String title, String url, [Map options]) {
     if (options != null) {
-      _blink.BlinkHistory.instance.replaceState_Callback_4_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url, convertDartToNative_Dictionary(options));
+      _blink.BlinkHistory.instance.replaceState_Callback_4_(this, convertDartToNative_SerializedScriptValue(data), title, url, convertDartToNative_Dictionary(options));
       return;
     }
-    _blink.BlinkHistory.instance.replaceState_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(data), title, url);
+    _blink.BlinkHistory.instance.replaceState_Callback_3_(this, convertDartToNative_SerializedScriptValue(data), title, url);
     return;
   }
 }
@@ -21056,11 +19632,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HmdvrDevice internalCreateHmdvrDevice() {
-    return new HmdvrDevice._internalWrap();
-  }
-
-  external factory HmdvrDevice._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HmdvrDevice.internal_() : super.internal_();
@@ -21069,18 +19641,18 @@
   @DomName('HMDVRDevice.getEyeParameters')
   @DocsEditable()
   @Experimental() // untriaged
-  VREyeParameters getEyeParameters(String whichEye) => wrap_jso(_blink.BlinkHMDVRDevice.instance.getEyeParameters_Callback_1_(unwrap_jso(this), whichEye));
+  VREyeParameters getEyeParameters(String whichEye) => _blink.BlinkHMDVRDevice.instance.getEyeParameters_Callback_1_(this, whichEye);
   
   void setFieldOfView([VRFieldOfView leftFov, VRFieldOfView rightFov]) {
     if (rightFov != null) {
-      _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_2_(unwrap_jso(this), unwrap_jso(leftFov), unwrap_jso(rightFov));
+      _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_2_(this, leftFov, rightFov);
       return;
     }
     if (leftFov != null) {
-      _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_1_(unwrap_jso(this), unwrap_jso(leftFov));
+      _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_1_(this, leftFov);
       return;
     }
-    _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_0_(unwrap_jso(this));
+    _blink.BlinkHMDVRDevice.instance.setFieldOfView_Callback_0_(this);
     return;
   }
 
@@ -21098,32 +19670,24 @@
   // To suppress missing implicit constructor warnings.
   factory HtmlCollection._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static HtmlCollection internalCreateHtmlCollection() {
-    return new HtmlCollection._internalWrap();
-  }
 
-  factory HtmlCollection._internalWrap() {
-    return new HtmlCollection.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HtmlCollection.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('HTMLCollection.length')
   @DocsEditable()
-  int get length => _blink.BlinkHTMLCollection.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkHTMLCollection.instance.length_Getter_(this);
   
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkHTMLCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Node _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkHTMLCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+  Node _nativeIndexedGetter(int index) => (_blink.BlinkHTMLCollection.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -21165,11 +19729,11 @@
 
   @DomName('HTMLCollection.item')
   @DocsEditable()
-  Element item(int index) => wrap_jso(_blink.BlinkHTMLCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+  Element item(int index) => _blink.BlinkHTMLCollection.instance.item_Callback_1_(this, index);
   
   @DomName('HTMLCollection.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => wrap_jso(_blink.BlinkHTMLCollection.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+  Element namedItem(String name) => _blink.BlinkHTMLCollection.instance.namedItem_Callback_1_(this, name);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21186,11 +19750,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HtmlDocument internalCreateHtmlDocument() {
-    return new HtmlDocument._internalWrap();
-  }
-
-  external factory HtmlDocument._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HtmlDocument.internal_() : super.internal_();
@@ -21579,9 +20139,6 @@
       }
       var elemProto = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object'), "create", [js.JsNative.getProperty(baseElement, 'prototype')]);
 
-      // Remember for any upgrading done in wrap_jso.
-      addCustomElementType(tag, customElementClass, extendsTag);
-
       // TODO(terry): Hack to stop recursion re-creating custom element when the
       //              created() constructor of the custom element does e.g.,
       //
@@ -21593,77 +20150,42 @@
       //              until stack overflow.
       //
       //              See https://github.com/dart-lang/sdk/issues/23666
-      int creating = 0;
+      int creating = 0; // TODO(jacobr): I think I broke thise case. Will fix monday.
 
       // If any JS code is hooked we want to call it too.
-      var oldCreatedCallback = elemProto['createdCallback'];
-      var oldAttributeChangedCallback = elemProto['attributeChangedCallback'];
-      var oldAttachedCallback = elemProto['attachedCallback'];
-      var oldDetachedCallback = elemProto['detachedCallback'];
+      var oldCreatedCallback = js.JsNative.getProperty(elemProto, 'createdCallback');
+      var oldAttributeChangedCallback = js.JsNative.getProperty(elemProto, 'attributeChangedCallback');
+      var oldAttachedCallback = js.JsNative.getProperty(elemProto, 'attachedCallback');
+      var oldDetachedCallback = js.JsNative.getProperty(elemProto, 'detachedCallback');
 
-      // TODO(jacobr): warning:
-      elemProto['createdCallback'] = js.JsNative.withThis(($this) {
-        if (_getJSClassName(reflectClass(customElementClass).superclass) != null && creating < 2) {
-          creating++;
-
-          var dartClass;
-          try {
-            if (extendsTag != null) {
-              // If we're extending a native element then create that element.
-              // Then upgrade that element to the customElementClass through
-              // normal flow.
-              dartClass = document.createElement(extendsTag);
-              js.setDartHtmlWrapperFor($this, dartClass);
-              dartClass.blink_jsObject = $this;
-            }
-
-            // Upgrade to the CustomElement Dart class.
-            dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
-          } catch (e) {
-            // Got a problem make it an HtmlElement and rethrow the error.
-            dartClass = HtmlElement.internalCreateHtmlElement();
-            // We need to remember the JS object (because constructElement failed
-            // it normally sets up the blink_jsObject.
-            dartClass.blink_jsObject = $this;
-
-            // Mark to only try this once don't try upgrading from HtmlElement
-            // to the user's Dart class - we had a problem.
-            dartClass._badUpgrade();
-            throw e;
-          } finally {
-            // Need to remember the Dart class that was created for this custom so
-            // return it and setup the blink_jsObject to the $this that we'll be working
-            // with as we talk to blink.
-            js.setDartHtmlWrapperFor($this, dartClass);
-
-            creating--;
-          }
-        }
-
+      js.JsNative.setProperty(elemProto, 'createdCallback', js.allowInteropCaptureThis(($this) {
+        // The created callback has already been called by the very act of passing a JS
+        // custom element from JS to Dart.
         if (oldCreatedCallback != null)
-          oldCreatedCallback.apply([], thisArg: unwrap_jso($this));
-      });
-      elemProto['attributeChangedCallback'] = new js.JsFunction.withThis(($this, attrName, oldVal, newVal) {
+          oldCreatedCallback.apply([], thisArg: $this);
+      }));
+      js.JsNative.setProperty(elemProto, 'attributeChangedCallback', js.allowInteropCaptureThis(($this, attrName, oldVal, newVal) {
         $this.attributeChanged(attrName, oldVal, newVal);
 
         if (oldAttributeChangedCallback != null)
-          oldAttributeChangedCallback.apply([], thisArg: unwrap_jso($this));
-      });
-      elemProto['attachedCallback'] = new js.JsFunction.withThis(($this) {
+          oldAttributeChangedCallback.apply([], thisArg: $this);
+      }));
+      js.JsNative.setProperty(elemProto, 'attachedCallback', js.allowInteropCaptureThis(($this) {
         $this.attached();
 
         if (oldAttachedCallback != null)
-          oldAttachedCallback.apply([], thisArg: unwrap_jso($this));
-      });
-      elemProto['detachedCallback'] = new js.JsFunction.withThis(($this) {
+          oldAttachedCallback.apply([], thisArg: $this);
+      }));
+      js.JsNative.setProperty(elemProto, 'detachedCallback', js.allowInteropCaptureThis(($this) {
         $this.detached();
 
         if (oldDetachedCallback != null)
-          oldDetachedCallback.apply([], thisArg: unwrap_jso($this));
-      });
+          oldDetachedCallback.apply([], thisArg: $this);
+      }));
       // document.registerElement('x-foo', {prototype: elemProto, extends: extendsTag});
       var jsMap = new js.JsObject.jsify({'prototype': elemProto, 'extends': extendsTag});
-      js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'document'), 'registerElement', [tag, jsMap]);
+      _blink.Blink_Utils.defineInterceptorCustomElement(elemProto, customElementClass);
+      js.JsNative.callMethod(document, 'registerElement', [tag, jsMap]);
     }
   }
 
@@ -21986,11 +20508,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HtmlElement internalCreateHtmlElement() {
-    return new HtmlElement._internalWrap();
-  }
-
-  external factory HtmlElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HtmlElement.internal_() : super.internal_();
@@ -22004,98 +20522,98 @@
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  String get contentEditable => _blink.BlinkHTMLElement.instance.contentEditable_Getter_(unwrap_jso(this));
+  String get contentEditable => _blink.BlinkHTMLElement.instance.contentEditable_Getter_(this);
   
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  set contentEditable(String value) => _blink.BlinkHTMLElement.instance.contentEditable_Setter_(unwrap_jso(this), value);
+  set contentEditable(String value) => _blink.BlinkHTMLElement.instance.contentEditable_Setter_(this, value);
   
   @DomName('HTMLElement.contextMenu')
   @DocsEditable()
   @Experimental() // untriaged
-  MenuElement get contextMenu => wrap_jso(_blink.BlinkHTMLElement.instance.contextMenu_Getter_(unwrap_jso(this)));
+  MenuElement get contextMenu => _blink.BlinkHTMLElement.instance.contextMenu_Getter_(this);
   
   @DomName('HTMLElement.contextMenu')
   @DocsEditable()
   @Experimental() // untriaged
-  set contextMenu(MenuElement value) => _blink.BlinkHTMLElement.instance.contextMenu_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set contextMenu(MenuElement value) => _blink.BlinkHTMLElement.instance.contextMenu_Setter_(this, value);
   
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  String get dir => _blink.BlinkHTMLElement.instance.dir_Getter_(unwrap_jso(this));
+  String get dir => _blink.BlinkHTMLElement.instance.dir_Getter_(this);
   
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  set dir(String value) => _blink.BlinkHTMLElement.instance.dir_Setter_(unwrap_jso(this), value);
+  set dir(String value) => _blink.BlinkHTMLElement.instance.dir_Setter_(this, value);
   
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  bool get draggable => _blink.BlinkHTMLElement.instance.draggable_Getter_(unwrap_jso(this));
+  bool get draggable => _blink.BlinkHTMLElement.instance.draggable_Getter_(this);
   
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  set draggable(bool value) => _blink.BlinkHTMLElement.instance.draggable_Setter_(unwrap_jso(this), value);
+  set draggable(bool value) => _blink.BlinkHTMLElement.instance.draggable_Setter_(this, value);
   
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  bool get hidden => _blink.BlinkHTMLElement.instance.hidden_Getter_(unwrap_jso(this));
+  bool get hidden => _blink.BlinkHTMLElement.instance.hidden_Getter_(this);
   
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  set hidden(bool value) => _blink.BlinkHTMLElement.instance.hidden_Setter_(unwrap_jso(this), value);
+  set hidden(bool value) => _blink.BlinkHTMLElement.instance.hidden_Setter_(this, value);
   
   @DomName('HTMLElement.isContentEditable')
   @DocsEditable()
-  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
+  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(this);
   
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkHTMLElement.instance.lang_Getter_(unwrap_jso(this));
+  String get lang => _blink.BlinkHTMLElement.instance.lang_Getter_(this);
   
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  set lang(String value) => _blink.BlinkHTMLElement.instance.lang_Setter_(unwrap_jso(this), value);
+  set lang(String value) => _blink.BlinkHTMLElement.instance.lang_Setter_(this, value);
   
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  bool get spellcheck => _blink.BlinkHTMLElement.instance.spellcheck_Getter_(unwrap_jso(this));
+  bool get spellcheck => _blink.BlinkHTMLElement.instance.spellcheck_Getter_(this);
   
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  set spellcheck(bool value) => _blink.BlinkHTMLElement.instance.spellcheck_Setter_(unwrap_jso(this), value);
+  set spellcheck(bool value) => _blink.BlinkHTMLElement.instance.spellcheck_Setter_(this, value);
   
   @DomName('HTMLElement.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkHTMLElement.instance.style_Getter_(unwrap_jso(this)));
+  CssStyleDeclaration get style => _blink.BlinkHTMLElement.instance.style_Getter_(this);
   
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  int get tabIndex => _blink.BlinkHTMLElement.instance.tabIndex_Getter_(unwrap_jso(this));
+  int get tabIndex => _blink.BlinkHTMLElement.instance.tabIndex_Getter_(this);
   
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  set tabIndex(int value) => _blink.BlinkHTMLElement.instance.tabIndex_Setter_(unwrap_jso(this), value);
+  set tabIndex(int value) => _blink.BlinkHTMLElement.instance.tabIndex_Setter_(this, value);
   
   @DomName('HTMLElement.title')
   @DocsEditable()
-  String get title => _blink.BlinkHTMLElement.instance.title_Getter_(unwrap_jso(this));
+  String get title => _blink.BlinkHTMLElement.instance.title_Getter_(this);
   
   @DomName('HTMLElement.title')
   @DocsEditable()
-  set title(String value) => _blink.BlinkHTMLElement.instance.title_Setter_(unwrap_jso(this), value);
+  set title(String value) => _blink.BlinkHTMLElement.instance.title_Setter_(this, value);
   
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  bool get translate => _blink.BlinkHTMLElement.instance.translate_Getter_(unwrap_jso(this));
+  bool get translate => _blink.BlinkHTMLElement.instance.translate_Getter_(this);
   
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  set translate(bool value) => _blink.BlinkHTMLElement.instance.translate_Setter_(unwrap_jso(this), value);
+  set translate(bool value) => _blink.BlinkHTMLElement.instance.translate_Setter_(this, value);
   
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -22103,7 +20621,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  String get dropzone => _blink.BlinkHTMLElement.instance.webkitdropzone_Getter_(unwrap_jso(this));
+  String get dropzone => _blink.BlinkHTMLElement.instance.webkitdropzone_Getter_(this);
   
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -22111,21 +20629,21 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  set dropzone(String value) => _blink.BlinkHTMLElement.instance.webkitdropzone_Setter_(unwrap_jso(this), value);
+  set dropzone(String value) => _blink.BlinkHTMLElement.instance.webkitdropzone_Setter_(this, value);
   
   @DomName('HTMLElement.blur')
   @DocsEditable()
   @Experimental() // untriaged
-  void blur() => _blink.BlinkHTMLElement.instance.blur_Callback_0_(unwrap_jso(this));
+  void blur() => _blink.BlinkHTMLElement.instance.blur_Callback_0_(this);
   
   @DomName('HTMLElement.click')
   @DocsEditable()
-  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
+  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(this);
   
   @DomName('HTMLElement.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  void focus() => _blink.BlinkHTMLElement.instance.focus_Callback_0_(unwrap_jso(this));
+  void focus() => _blink.BlinkHTMLElement.instance.focus_Callback_0_(this);
   
   @DomName('HTMLElement.onabort')
   @DocsEditable()
@@ -22387,18 +20905,6 @@
   @Experimental() // untriaged
   ElementStream<Event> get onWaiting => waitingEvent.forElement(this);
 
-  // Flags to only try upgrading once. If there's a failure don't try upgrading
-  // anymore.
-  bool _badUpgradeOccurred = false;
-
-  /// Required for SDK Infrastructure. Internal use only.
-  ///
-  /// Did this encounter a failure attempting to upgrade to
-  /// a custom element.
-  @Deprecated("Required for SDK Infrastructure. Internal use only.")
-  bool get isBadUpgrade => _badUpgradeOccurred;
-
-  void _badUpgrade() { _badUpgradeOccurred = true; }
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -22415,11 +20921,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HtmlFormControlsCollection internalCreateHtmlFormControlsCollection() {
-    return new HtmlFormControlsCollection._internalWrap();
-  }
-
-  external factory HtmlFormControlsCollection._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HtmlFormControlsCollection.internal_() : super.internal_();
@@ -22428,11 +20930,11 @@
   @DomName('HTMLFormControlsCollection.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Node item(int index) => wrap_jso(_blink.BlinkHTMLFormControlsCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+  Node item(int index) => _blink.BlinkHTMLFormControlsCollection.instance.item_Callback_1_(this, index);
   
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable()
-  Object namedItem(String name) => wrap_jso(_blink.BlinkHTMLFormControlsCollection.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+  Object namedItem(String name) => (_blink.BlinkHTMLFormControlsCollection.instance.namedItem_Callback_1_(this, name));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22454,11 +20956,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HtmlHtmlElement internalCreateHtmlHtmlElement() {
-    return new HtmlHtmlElement._internalWrap();
-  }
-
-  external factory HtmlHtmlElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HtmlHtmlElement.internal_() : super.internal_();
@@ -22486,11 +20984,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HtmlOptionsCollection internalCreateHtmlOptionsCollection() {
-    return new HtmlOptionsCollection._internalWrap();
-  }
-
-  external factory HtmlOptionsCollection._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HtmlOptionsCollection.internal_() : super.internal_();
@@ -22499,7 +20993,7 @@
   @DomName('HTMLOptionsCollection.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Node _item(int index) => wrap_jso(_blink.BlinkHTMLOptionsCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+  Node _item(int index) => _blink.BlinkHTMLOptionsCollection.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22857,9 +21351,9 @@
   @DocsEditable()
   void open(String method, String url, {bool async, String user, String password}) {
     if (async == null && user == null && password == null) {
-      _blink.BlinkXMLHttpRequest.instance.open_Callback_2_(unwrap_jso(this), method, url);
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_2_(this, method, url);
     } else {
-      _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(unwrap_jso(this), method, url, async, user, password);
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(this, method, url, async, user, password);
     }
   }
 
@@ -22895,16 +21389,12 @@
   @DomName('XMLHttpRequest.XMLHttpRequest')
   @DocsEditable()
   factory HttpRequest() {
-    return wrap_jso(_blink.BlinkXMLHttpRequest.instance.constructorCallback_0_());
+    return _blink.BlinkXMLHttpRequest.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static HttpRequest internalCreateHttpRequest() {
-    return new HttpRequest._internalWrap();
-  }
-
-  external factory HttpRequest._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HttpRequest.internal_() : super.internal_();
@@ -22964,7 +21454,7 @@
    */
   @DomName('XMLHttpRequest.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkXMLHttpRequest.instance.readyState_Getter_(unwrap_jso(this));
+  int get readyState => _blink.BlinkXMLHttpRequest.instance.readyState_Getter_(this);
   
   /**
    * The data received as a reponse from the request.
@@ -22979,14 +21469,14 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Object get response => wrap_jso(_blink.BlinkXMLHttpRequest.instance.response_Getter_(unwrap_jso(this)));
+  Object get response => _convertNativeToDart_XHR_Response(_blink.BlinkXMLHttpRequest.instance.response_Getter_(this));
   
   /**
    * The response in String form or empty String on failure.
    */
   @DomName('XMLHttpRequest.responseText')
   @DocsEditable()
-  String get responseText => _blink.BlinkXMLHttpRequest.instance.responseText_Getter_(unwrap_jso(this));
+  String get responseText => _blink.BlinkXMLHttpRequest.instance.responseText_Getter_(this);
   
   /**
    * [String] telling the server the desired response format.
@@ -23001,7 +21491,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  String get responseType => _blink.BlinkXMLHttpRequest.instance.responseType_Getter_(unwrap_jso(this));
+  String get responseType => _blink.BlinkXMLHttpRequest.instance.responseType_Getter_(this);
   
   /**
    * [String] telling the server the desired response format.
@@ -23016,12 +21506,12 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  set responseType(String value) => _blink.BlinkXMLHttpRequest.instance.responseType_Setter_(unwrap_jso(this), value);
+  set responseType(String value) => _blink.BlinkXMLHttpRequest.instance.responseType_Setter_(this, value);
   
   @DomName('XMLHttpRequest.responseURL')
   @DocsEditable()
   @Experimental() // untriaged
-  String get responseUrl => _blink.BlinkXMLHttpRequest.instance.responseURL_Getter_(unwrap_jso(this));
+  String get responseUrl => _blink.BlinkXMLHttpRequest.instance.responseURL_Getter_(this);
   
   /**
    * The request response, or null on failure.
@@ -23032,7 +21522,7 @@
    */
   @DomName('XMLHttpRequest.responseXML')
   @DocsEditable()
-  Document get responseXml => wrap_jso(_blink.BlinkXMLHttpRequest.instance.responseXML_Getter_(unwrap_jso(this)));
+  Document get responseXml => _blink.BlinkXMLHttpRequest.instance.responseXML_Getter_(this);
   
   /**
    * The HTTP result code from the request (200, 404, etc).
@@ -23040,7 +21530,7 @@
    */
   @DomName('XMLHttpRequest.status')
   @DocsEditable()
-  int get status => _blink.BlinkXMLHttpRequest.instance.status_Getter_(unwrap_jso(this));
+  int get status => _blink.BlinkXMLHttpRequest.instance.status_Getter_(this);
   
   /**
    * The request response string (such as \"200 OK\").
@@ -23048,7 +21538,7 @@
    */
   @DomName('XMLHttpRequest.statusText')
   @DocsEditable()
-  String get statusText => _blink.BlinkXMLHttpRequest.instance.statusText_Getter_(unwrap_jso(this));
+  String get statusText => _blink.BlinkXMLHttpRequest.instance.statusText_Getter_(this);
   
   /**
    * Length of time before a request is automatically terminated.
@@ -23067,7 +21557,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int get timeout => _blink.BlinkXMLHttpRequest.instance.timeout_Getter_(unwrap_jso(this));
+  int get timeout => _blink.BlinkXMLHttpRequest.instance.timeout_Getter_(this);
   
   /**
    * Length of time before a request is automatically terminated.
@@ -23086,7 +21576,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  set timeout(int value) => _blink.BlinkXMLHttpRequest.instance.timeout_Setter_(unwrap_jso(this), value);
+  set timeout(int value) => _blink.BlinkXMLHttpRequest.instance.timeout_Setter_(this, value);
   
   /**
    * [EventTarget] that can hold listeners to track the progress of the request.
@@ -23095,7 +21585,7 @@
   @DomName('XMLHttpRequest.upload')
   @DocsEditable()
   @Unstable()
-  HttpRequestUpload get upload => wrap_jso(_blink.BlinkXMLHttpRequest.instance.upload_Getter_(unwrap_jso(this)));
+  HttpRequestUpload get upload => _blink.BlinkXMLHttpRequest.instance.upload_Getter_(this);
   
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -23105,7 +21595,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.BlinkXMLHttpRequest.instance.withCredentials_Getter_(unwrap_jso(this));
+  bool get withCredentials => _blink.BlinkXMLHttpRequest.instance.withCredentials_Getter_(this);
   
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -23115,7 +21605,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.instance.withCredentials_Setter_(unwrap_jso(this), value);
+  set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.instance.withCredentials_Setter_(this, value);
   
   /**
    * Stop the current request.
@@ -23126,7 +21616,7 @@
    */
   @DomName('XMLHttpRequest.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkXMLHttpRequest.instance.abort_Callback_0_(unwrap_jso(this));
+  void abort() => _blink.BlinkXMLHttpRequest.instance.abort_Callback_0_(this);
   
   /**
    * Retrieve all the response headers from a request.
@@ -23142,7 +21632,7 @@
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable()
   @Unstable()
-  String getAllResponseHeaders() => _blink.BlinkXMLHttpRequest.instance.getAllResponseHeaders_Callback_0_(unwrap_jso(this));
+  String getAllResponseHeaders() => _blink.BlinkXMLHttpRequest.instance.getAllResponseHeaders_Callback_0_(this);
   
   /**
    * Return the response header named `header`, or null if not found.
@@ -23154,7 +21644,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String name) => _blink.BlinkXMLHttpRequest.instance.getResponseHeader_Callback_1_(unwrap_jso(this), name);
+  String getResponseHeader(String name) => _blink.BlinkXMLHttpRequest.instance.getResponseHeader_Callback_1_(this, name);
   
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -23168,39 +21658,39 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String mime) => _blink.BlinkXMLHttpRequest.instance.overrideMimeType_Callback_1_(unwrap_jso(this), mime);
+  void overrideMimeType(String mime) => _blink.BlinkXMLHttpRequest.instance.overrideMimeType_Callback_1_(this, mime);
   
   void send([body_OR_data]) {
     if (body_OR_data != null) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
     }
     if ((body_OR_data is TypedData || body_OR_data == null)) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
     }
     if ((body_OR_data is ByteBuffer || body_OR_data == null)) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
     }
     if ((body_OR_data is Document || body_OR_data == null)) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
     }
     if ((body_OR_data is String || body_OR_data == null)) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
     }
     if ((body_OR_data is FormData || body_OR_data == null)) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
     }
     if ((body_OR_data is Blob || body_OR_data == null)) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(body_OR_data));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, body_OR_data);
       return;
     }
     if (body_OR_data == null) {
-      _blink.BlinkXMLHttpRequest.instance.send_Callback_0_(unwrap_jso(this));
+      _blink.BlinkXMLHttpRequest.instance.send_Callback_0_(this);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -23225,7 +21715,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String name, String value) => _blink.BlinkXMLHttpRequest.instance.setRequestHeader_Callback_2_(unwrap_jso(this), name, value);
+  void setRequestHeader(String name, String value) => _blink.BlinkXMLHttpRequest.instance.setRequestHeader_Callback_2_(this, name, value);
   
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -23330,11 +21820,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HttpRequestEventTarget internalCreateHttpRequestEventTarget() {
-    return new HttpRequestEventTarget._internalWrap();
-  }
-
-  external factory HttpRequestEventTarget._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HttpRequestEventTarget.internal_() : super.internal_();
@@ -23408,11 +21894,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static HttpRequestUpload internalCreateHttpRequestUpload() {
-    return new HttpRequestUpload._internalWrap();
-  }
-
-  external factory HttpRequestUpload._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   HttpRequestUpload.internal_() : super.internal_();
@@ -23438,11 +21920,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static IFrameElement internalCreateIFrameElement() {
-    return new IFrameElement._internalWrap();
-  }
-
-  external factory IFrameElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   IFrameElement.internal_() : super.internal_();
@@ -23457,60 +21935,60 @@
   @DomName('HTMLIFrameElement.allowFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get allowFullscreen => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Getter_(unwrap_jso(this));
+  bool get allowFullscreen => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Getter_(this);
   
   @DomName('HTMLIFrameElement.allowFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  set allowFullscreen(bool value) => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Setter_(unwrap_jso(this), value);
+  set allowFullscreen(bool value) => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Setter_(this, value);
   
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
-  WindowBase get contentWindow => wrap_jso(_blink.BlinkHTMLIFrameElement.instance.contentWindow_Getter_(unwrap_jso(this)));
+  WindowBase get contentWindow => _blink.BlinkHTMLIFrameElement.instance.contentWindow_Getter_(this);
   
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  String get height => _blink.BlinkHTMLIFrameElement.instance.height_Getter_(unwrap_jso(this));
+  String get height => _blink.BlinkHTMLIFrameElement.instance.height_Getter_(this);
   
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  set height(String value) => _blink.BlinkHTMLIFrameElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(String value) => _blink.BlinkHTMLIFrameElement.instance.height_Setter_(this, value);
   
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLIFrameElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLIFrameElement.instance.name_Getter_(this);
   
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLIFrameElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLIFrameElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  DomSettableTokenList get sandbox => wrap_jso(_blink.BlinkHTMLIFrameElement.instance.sandbox_Getter_(unwrap_jso(this)));
+  DomSettableTokenList get sandbox => _blink.BlinkHTMLIFrameElement.instance.sandbox_Getter_(this);
   
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLIFrameElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLIFrameElement.instance.src_Getter_(this);
   
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLIFrameElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLIFrameElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  String get srcdoc => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Getter_(unwrap_jso(this));
+  String get srcdoc => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Getter_(this);
   
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Setter_(unwrap_jso(this), value);
+  set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Setter_(this, value);
   
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  String get width => _blink.BlinkHTMLIFrameElement.instance.width_Getter_(unwrap_jso(this));
+  String get width => _blink.BlinkHTMLIFrameElement.instance.width_Getter_(this);
   
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  set width(String value) => _blink.BlinkHTMLIFrameElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(String value) => _blink.BlinkHTMLIFrameElement.instance.width_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23527,30 +22005,22 @@
   // To suppress missing implicit constructor warnings.
   factory ImageBitmap._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ImageBitmap internalCreateImageBitmap() {
-    return new ImageBitmap._internalWrap();
-  }
 
-  factory ImageBitmap._internalWrap() {
-    return new ImageBitmap.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ImageBitmap.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ImageBitmap.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.BlinkImageBitmap.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkImageBitmap.instance.height_Getter_(this);
   
   @DomName('ImageBitmap.width')
   @DocsEditable()
   @Experimental() // untriaged
-  int get width => _blink.BlinkImageBitmap.instance.width_Getter_(unwrap_jso(this));
+  int get width => _blink.BlinkImageBitmap.instance.width_Getter_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -23575,43 +22045,35 @@
   @DocsEditable()
   factory ImageData(data_OR_sw, int sh_OR_sw, [int sh]) {
     if ((sh_OR_sw is int) && (data_OR_sw is int) && sh == null) {
-      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_2_(data_OR_sw, sh_OR_sw));
+      return _blink.BlinkImageData.instance.constructorCallback_2_(data_OR_sw, sh_OR_sw);
     }
     if ((sh_OR_sw is int) && (data_OR_sw is Uint8ClampedList) && sh == null) {
-      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_2_(data_OR_sw, sh_OR_sw));
+      return _blink.BlinkImageData.instance.constructorCallback_2_(data_OR_sw, sh_OR_sw);
     }
     if ((sh is int) && (sh_OR_sw is int) && (data_OR_sw is Uint8ClampedList)) {
-      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_3_(data_OR_sw, sh_OR_sw, sh));
+      return _blink.BlinkImageData.instance.constructorCallback_3_(data_OR_sw, sh_OR_sw, sh);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @Deprecated("Internal Use Only")
-  static ImageData internalCreateImageData() {
-    return new ImageData._internalWrap();
-  }
 
-  factory ImageData._internalWrap() {
-    return new ImageData.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ImageData.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ImageData.data')
   @DocsEditable()
-  Uint8ClampedList get _data => wrap_jso(_blink.BlinkImageData.instance.data_Getter_(unwrap_jso(this)));
+  Uint8ClampedList get _data => _blink.BlinkImageData.instance.data_Getter_(this);
   
   @DomName('ImageData.height')
   @DocsEditable()
-  int get height => _blink.BlinkImageData.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkImageData.instance.height_Getter_(this);
   
   @DomName('ImageData.width')
   @DocsEditable()
-  int get width => _blink.BlinkImageData.instance.width_Getter_(unwrap_jso(this));
+  int get width => _blink.BlinkImageData.instance.width_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23636,11 +22098,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ImageElement internalCreateImageElement() {
-    return new ImageElement._internalWrap();
-  }
-
-  external factory ImageElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ImageElement.internal_() : super.internal_();
@@ -23654,96 +22112,96 @@
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  String get alt => _blink.BlinkHTMLImageElement.instance.alt_Getter_(unwrap_jso(this));
+  String get alt => _blink.BlinkHTMLImageElement.instance.alt_Getter_(this);
   
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  set alt(String value) => _blink.BlinkHTMLImageElement.instance.alt_Setter_(unwrap_jso(this), value);
+  set alt(String value) => _blink.BlinkHTMLImageElement.instance.alt_Setter_(this, value);
   
   @DomName('HTMLImageElement.complete')
   @DocsEditable()
-  bool get complete => _blink.BlinkHTMLImageElement.instance.complete_Getter_(unwrap_jso(this));
+  bool get complete => _blink.BlinkHTMLImageElement.instance.complete_Getter_(this);
   
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  String get crossOrigin => _blink.BlinkHTMLImageElement.instance.crossOrigin_Getter_(unwrap_jso(this));
+  String get crossOrigin => _blink.BlinkHTMLImageElement.instance.crossOrigin_Getter_(this);
   
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  set crossOrigin(String value) => _blink.BlinkHTMLImageElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLImageElement.instance.crossOrigin_Setter_(this, value);
   
   @DomName('HTMLImageElement.currentSrc')
   @DocsEditable()
   @Experimental() // untriaged
-  String get currentSrc => _blink.BlinkHTMLImageElement.instance.currentSrc_Getter_(unwrap_jso(this));
+  String get currentSrc => _blink.BlinkHTMLImageElement.instance.currentSrc_Getter_(this);
   
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLImageElement.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkHTMLImageElement.instance.height_Getter_(this);
   
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  set height(int value) => _blink.BlinkHTMLImageElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLImageElement.instance.height_Setter_(this, value);
   
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  bool get isMap => _blink.BlinkHTMLImageElement.instance.isMap_Getter_(unwrap_jso(this));
+  bool get isMap => _blink.BlinkHTMLImageElement.instance.isMap_Getter_(this);
   
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  set isMap(bool value) => _blink.BlinkHTMLImageElement.instance.isMap_Setter_(unwrap_jso(this), value);
+  set isMap(bool value) => _blink.BlinkHTMLImageElement.instance.isMap_Setter_(this, value);
   
   @DomName('HTMLImageElement.naturalHeight')
   @DocsEditable()
-  int get naturalHeight => _blink.BlinkHTMLImageElement.instance.naturalHeight_Getter_(unwrap_jso(this));
+  int get naturalHeight => _blink.BlinkHTMLImageElement.instance.naturalHeight_Getter_(this);
   
   @DomName('HTMLImageElement.naturalWidth')
   @DocsEditable()
-  int get naturalWidth => _blink.BlinkHTMLImageElement.instance.naturalWidth_Getter_(unwrap_jso(this));
+  int get naturalWidth => _blink.BlinkHTMLImageElement.instance.naturalWidth_Getter_(this);
   
   @DomName('HTMLImageElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  String get sizes => _blink.BlinkHTMLImageElement.instance.sizes_Getter_(unwrap_jso(this));
+  String get sizes => _blink.BlinkHTMLImageElement.instance.sizes_Getter_(this);
   
   @DomName('HTMLImageElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  set sizes(String value) => _blink.BlinkHTMLImageElement.instance.sizes_Setter_(unwrap_jso(this), value);
+  set sizes(String value) => _blink.BlinkHTMLImageElement.instance.sizes_Setter_(this, value);
   
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLImageElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLImageElement.instance.src_Getter_(this);
   
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLImageElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLImageElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  String get srcset => _blink.BlinkHTMLImageElement.instance.srcset_Getter_(unwrap_jso(this));
+  String get srcset => _blink.BlinkHTMLImageElement.instance.srcset_Getter_(this);
   
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  set srcset(String value) => _blink.BlinkHTMLImageElement.instance.srcset_Setter_(unwrap_jso(this), value);
+  set srcset(String value) => _blink.BlinkHTMLImageElement.instance.srcset_Setter_(this, value);
   
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.BlinkHTMLImageElement.instance.useMap_Getter_(unwrap_jso(this));
+  String get useMap => _blink.BlinkHTMLImageElement.instance.useMap_Getter_(this);
   
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  set useMap(String value) => _blink.BlinkHTMLImageElement.instance.useMap_Setter_(unwrap_jso(this), value);
+  set useMap(String value) => _blink.BlinkHTMLImageElement.instance.useMap_Setter_(this, value);
   
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLImageElement.instance.width_Getter_(unwrap_jso(this));
+  int get width => _blink.BlinkHTMLImageElement.instance.width_Getter_(this);
   
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  set width(int value) => _blink.BlinkHTMLImageElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLImageElement.instance.width_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23760,25 +22218,17 @@
   // To suppress missing implicit constructor warnings.
   factory InjectedScriptHost._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static InjectedScriptHost internalCreateInjectedScriptHost() {
-    return new InjectedScriptHost._internalWrap();
-  }
 
-  factory InjectedScriptHost._internalWrap() {
-    return new InjectedScriptHost.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   InjectedScriptHost.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('InjectedScriptHost.inspect')
   @DocsEditable()
   @Experimental() // untriaged
-  void inspect(Object objectId, Object hints) => _blink.BlinkInjectedScriptHost.instance.inspect_Callback_2_(unwrap_jso(this), objectId, hints);
+  void inspect(Object objectId, Object hints) => _blink.BlinkInjectedScriptHost.instance.inspect_Callback_2_(this, objectId, hints);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23800,30 +22250,22 @@
   factory InputDevice([Map deviceInitDict]) {
     if (deviceInitDict != null) {
       var deviceInitDict_1 = convertDartToNative_Dictionary(deviceInitDict);
-      return wrap_jso(_blink.BlinkInputDevice.instance.constructorCallback_1_(deviceInitDict_1));
+      return _blink.BlinkInputDevice.instance.constructorCallback_1_(deviceInitDict_1);
     }
-    return wrap_jso(_blink.BlinkInputDevice.instance.constructorCallback_0_());
+    return _blink.BlinkInputDevice.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static InputDevice internalCreateInputDevice() {
-    return new InputDevice._internalWrap();
-  }
-
-  factory InputDevice._internalWrap() {
-    return new InputDevice.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   InputDevice.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('InputDevice.firesTouchEvents')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get firesTouchEvents => _blink.BlinkInputDevice.instance.firesTouchEvents_Getter_(unwrap_jso(this));
+  bool get firesTouchEvents => _blink.BlinkInputDevice.instance.firesTouchEvents_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23871,11 +22313,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static InputElement internalCreateInputElement() {
-    return new InputElement._internalWrap();
-  }
-
-  external factory InputElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   InputElement.internal_() : super.internal_();
@@ -23889,363 +22327,363 @@
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  String get accept => _blink.BlinkHTMLInputElement.instance.accept_Getter_(unwrap_jso(this));
+  String get accept => _blink.BlinkHTMLInputElement.instance.accept_Getter_(this);
   
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  set accept(String value) => _blink.BlinkHTMLInputElement.instance.accept_Setter_(unwrap_jso(this), value);
+  set accept(String value) => _blink.BlinkHTMLInputElement.instance.accept_Setter_(this, value);
   
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  String get alt => _blink.BlinkHTMLInputElement.instance.alt_Getter_(unwrap_jso(this));
+  String get alt => _blink.BlinkHTMLInputElement.instance.alt_Getter_(this);
   
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  set alt(String value) => _blink.BlinkHTMLInputElement.instance.alt_Setter_(unwrap_jso(this), value);
+  set alt(String value) => _blink.BlinkHTMLInputElement.instance.alt_Setter_(this, value);
   
   @DomName('HTMLInputElement.autocapitalize')
   @DocsEditable()
   @Experimental() // untriaged
-  String get autocapitalize => _blink.BlinkHTMLInputElement.instance.autocapitalize_Getter_(unwrap_jso(this));
+  String get autocapitalize => _blink.BlinkHTMLInputElement.instance.autocapitalize_Getter_(this);
   
   @DomName('HTMLInputElement.autocapitalize')
   @DocsEditable()
   @Experimental() // untriaged
-  set autocapitalize(String value) => _blink.BlinkHTMLInputElement.instance.autocapitalize_Setter_(unwrap_jso(this), value);
+  set autocapitalize(String value) => _blink.BlinkHTMLInputElement.instance.autocapitalize_Setter_(this, value);
   
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  String get autocomplete => _blink.BlinkHTMLInputElement.instance.autocomplete_Getter_(unwrap_jso(this));
+  String get autocomplete => _blink.BlinkHTMLInputElement.instance.autocomplete_Getter_(this);
   
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  set autocomplete(String value) => _blink.BlinkHTMLInputElement.instance.autocomplete_Setter_(unwrap_jso(this), value);
+  set autocomplete(String value) => _blink.BlinkHTMLInputElement.instance.autocomplete_Setter_(this, value);
   
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLInputElement.instance.autofocus_Getter_(unwrap_jso(this));
+  bool get autofocus => _blink.BlinkHTMLInputElement.instance.autofocus_Getter_(this);
   
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  set autofocus(bool value) => _blink.BlinkHTMLInputElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLInputElement.instance.autofocus_Setter_(this, value);
   
   @DomName('HTMLInputElement.capture')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get capture => _blink.BlinkHTMLInputElement.instance.capture_Getter_(unwrap_jso(this));
+  bool get capture => _blink.BlinkHTMLInputElement.instance.capture_Getter_(this);
   
   @DomName('HTMLInputElement.capture')
   @DocsEditable()
   @Experimental() // untriaged
-  set capture(bool value) => _blink.BlinkHTMLInputElement.instance.capture_Setter_(unwrap_jso(this), value);
+  set capture(bool value) => _blink.BlinkHTMLInputElement.instance.capture_Setter_(this, value);
   
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  bool get checked => _blink.BlinkHTMLInputElement.instance.checked_Getter_(unwrap_jso(this));
+  bool get checked => _blink.BlinkHTMLInputElement.instance.checked_Getter_(this);
   
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  set checked(bool value) => _blink.BlinkHTMLInputElement.instance.checked_Setter_(unwrap_jso(this), value);
+  set checked(bool value) => _blink.BlinkHTMLInputElement.instance.checked_Setter_(this, value);
   
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  bool get defaultChecked => _blink.BlinkHTMLInputElement.instance.defaultChecked_Getter_(unwrap_jso(this));
+  bool get defaultChecked => _blink.BlinkHTMLInputElement.instance.defaultChecked_Getter_(this);
   
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.instance.defaultChecked_Setter_(unwrap_jso(this), value);
+  set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.instance.defaultChecked_Setter_(this, value);
   
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.BlinkHTMLInputElement.instance.defaultValue_Getter_(unwrap_jso(this));
+  String get defaultValue => _blink.BlinkHTMLInputElement.instance.defaultValue_Getter_(this);
   
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  set defaultValue(String value) => _blink.BlinkHTMLInputElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
+  set defaultValue(String value) => _blink.BlinkHTMLInputElement.instance.defaultValue_Setter_(this, value);
   
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  String get dirName => _blink.BlinkHTMLInputElement.instance.dirName_Getter_(unwrap_jso(this));
+  String get dirName => _blink.BlinkHTMLInputElement.instance.dirName_Getter_(this);
   
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  set dirName(String value) => _blink.BlinkHTMLInputElement.instance.dirName_Setter_(unwrap_jso(this), value);
+  set dirName(String value) => _blink.BlinkHTMLInputElement.instance.dirName_Setter_(this, value);
   
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLInputElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLInputElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLInputElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLInputElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  List<File> get files => wrap_jso(_blink.BlinkHTMLInputElement.instance.files_Getter_(unwrap_jso(this)));
+  List<File> get files => (_blink.BlinkHTMLInputElement.instance.files_Getter_(this));
   
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  set files(List<File> value) => _blink.BlinkHTMLInputElement.instance.files_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set files(List<File> value) => _blink.BlinkHTMLInputElement.instance.files_Setter_(this, value);
   
   @DomName('HTMLInputElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLInputElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLInputElement.instance.form_Getter_(this);
   
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.BlinkHTMLInputElement.instance.formAction_Getter_(unwrap_jso(this));
+  String get formAction => _blink.BlinkHTMLInputElement.instance.formAction_Getter_(this);
   
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  set formAction(String value) => _blink.BlinkHTMLInputElement.instance.formAction_Setter_(unwrap_jso(this), value);
+  set formAction(String value) => _blink.BlinkHTMLInputElement.instance.formAction_Setter_(this, value);
   
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.BlinkHTMLInputElement.instance.formEnctype_Getter_(unwrap_jso(this));
+  String get formEnctype => _blink.BlinkHTMLInputElement.instance.formEnctype_Getter_(this);
   
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  set formEnctype(String value) => _blink.BlinkHTMLInputElement.instance.formEnctype_Setter_(unwrap_jso(this), value);
+  set formEnctype(String value) => _blink.BlinkHTMLInputElement.instance.formEnctype_Setter_(this, value);
   
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.BlinkHTMLInputElement.instance.formMethod_Getter_(unwrap_jso(this));
+  String get formMethod => _blink.BlinkHTMLInputElement.instance.formMethod_Getter_(this);
   
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  set formMethod(String value) => _blink.BlinkHTMLInputElement.instance.formMethod_Setter_(unwrap_jso(this), value);
+  set formMethod(String value) => _blink.BlinkHTMLInputElement.instance.formMethod_Setter_(this, value);
   
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.BlinkHTMLInputElement.instance.formNoValidate_Getter_(unwrap_jso(this));
+  bool get formNoValidate => _blink.BlinkHTMLInputElement.instance.formNoValidate_Getter_(this);
   
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.instance.formNoValidate_Setter_(unwrap_jso(this), value);
+  set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.instance.formNoValidate_Setter_(this, value);
   
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.BlinkHTMLInputElement.instance.formTarget_Getter_(unwrap_jso(this));
+  String get formTarget => _blink.BlinkHTMLInputElement.instance.formTarget_Getter_(this);
   
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  set formTarget(String value) => _blink.BlinkHTMLInputElement.instance.formTarget_Setter_(unwrap_jso(this), value);
+  set formTarget(String value) => _blink.BlinkHTMLInputElement.instance.formTarget_Setter_(this, value);
   
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLInputElement.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkHTMLInputElement.instance.height_Getter_(this);
   
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  set height(int value) => _blink.BlinkHTMLInputElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLInputElement.instance.height_Setter_(this, value);
   
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  bool get incremental => _blink.BlinkHTMLInputElement.instance.incremental_Getter_(unwrap_jso(this));
+  bool get incremental => _blink.BlinkHTMLInputElement.instance.incremental_Getter_(this);
   
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  set incremental(bool value) => _blink.BlinkHTMLInputElement.instance.incremental_Setter_(unwrap_jso(this), value);
+  set incremental(bool value) => _blink.BlinkHTMLInputElement.instance.incremental_Setter_(this, value);
   
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  bool get indeterminate => _blink.BlinkHTMLInputElement.instance.indeterminate_Getter_(unwrap_jso(this));
+  bool get indeterminate => _blink.BlinkHTMLInputElement.instance.indeterminate_Getter_(this);
   
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  set indeterminate(bool value) => _blink.BlinkHTMLInputElement.instance.indeterminate_Setter_(unwrap_jso(this), value);
+  set indeterminate(bool value) => _blink.BlinkHTMLInputElement.instance.indeterminate_Setter_(this, value);
   
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.BlinkHTMLInputElement.instance.inputMode_Getter_(unwrap_jso(this));
+  String get inputMode => _blink.BlinkHTMLInputElement.instance.inputMode_Getter_(this);
   
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  set inputMode(String value) => _blink.BlinkHTMLInputElement.instance.inputMode_Setter_(unwrap_jso(this), value);
+  set inputMode(String value) => _blink.BlinkHTMLInputElement.instance.inputMode_Setter_(this, value);
   
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLInputElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLInputElement.instance.labels_Getter_(this));
   
   @DomName('HTMLInputElement.list')
   @DocsEditable()
-  HtmlElement get list => wrap_jso(_blink.BlinkHTMLInputElement.instance.list_Getter_(unwrap_jso(this)));
+  HtmlElement get list => _blink.BlinkHTMLInputElement.instance.list_Getter_(this);
   
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  String get max => _blink.BlinkHTMLInputElement.instance.max_Getter_(unwrap_jso(this));
+  String get max => _blink.BlinkHTMLInputElement.instance.max_Getter_(this);
   
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  set max(String value) => _blink.BlinkHTMLInputElement.instance.max_Setter_(unwrap_jso(this), value);
+  set max(String value) => _blink.BlinkHTMLInputElement.instance.max_Setter_(this, value);
   
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.BlinkHTMLInputElement.instance.maxLength_Getter_(unwrap_jso(this));
+  int get maxLength => _blink.BlinkHTMLInputElement.instance.maxLength_Getter_(this);
   
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  set maxLength(int value) => _blink.BlinkHTMLInputElement.instance.maxLength_Setter_(unwrap_jso(this), value);
+  set maxLength(int value) => _blink.BlinkHTMLInputElement.instance.maxLength_Setter_(this, value);
   
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  String get min => _blink.BlinkHTMLInputElement.instance.min_Getter_(unwrap_jso(this));
+  String get min => _blink.BlinkHTMLInputElement.instance.min_Getter_(this);
   
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  set min(String value) => _blink.BlinkHTMLInputElement.instance.min_Setter_(unwrap_jso(this), value);
+  set min(String value) => _blink.BlinkHTMLInputElement.instance.min_Setter_(this, value);
   
   @DomName('HTMLInputElement.minLength')
   @DocsEditable()
   @Experimental() // untriaged
-  int get minLength => _blink.BlinkHTMLInputElement.instance.minLength_Getter_(unwrap_jso(this));
+  int get minLength => _blink.BlinkHTMLInputElement.instance.minLength_Getter_(this);
   
   @DomName('HTMLInputElement.minLength')
   @DocsEditable()
   @Experimental() // untriaged
-  set minLength(int value) => _blink.BlinkHTMLInputElement.instance.minLength_Setter_(unwrap_jso(this), value);
+  set minLength(int value) => _blink.BlinkHTMLInputElement.instance.minLength_Setter_(this, value);
   
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.BlinkHTMLInputElement.instance.multiple_Getter_(unwrap_jso(this));
+  bool get multiple => _blink.BlinkHTMLInputElement.instance.multiple_Getter_(this);
   
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  set multiple(bool value) => _blink.BlinkHTMLInputElement.instance.multiple_Setter_(unwrap_jso(this), value);
+  set multiple(bool value) => _blink.BlinkHTMLInputElement.instance.multiple_Setter_(this, value);
   
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLInputElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLInputElement.instance.name_Getter_(this);
   
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLInputElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLInputElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  String get pattern => _blink.BlinkHTMLInputElement.instance.pattern_Getter_(unwrap_jso(this));
+  String get pattern => _blink.BlinkHTMLInputElement.instance.pattern_Getter_(this);
   
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  set pattern(String value) => _blink.BlinkHTMLInputElement.instance.pattern_Setter_(unwrap_jso(this), value);
+  set pattern(String value) => _blink.BlinkHTMLInputElement.instance.pattern_Setter_(this, value);
   
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.BlinkHTMLInputElement.instance.placeholder_Getter_(unwrap_jso(this));
+  String get placeholder => _blink.BlinkHTMLInputElement.instance.placeholder_Getter_(this);
   
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  set placeholder(String value) => _blink.BlinkHTMLInputElement.instance.placeholder_Setter_(unwrap_jso(this), value);
+  set placeholder(String value) => _blink.BlinkHTMLInputElement.instance.placeholder_Setter_(this, value);
   
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.BlinkHTMLInputElement.instance.readOnly_Getter_(unwrap_jso(this));
+  bool get readOnly => _blink.BlinkHTMLInputElement.instance.readOnly_Getter_(this);
   
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  set readOnly(bool value) => _blink.BlinkHTMLInputElement.instance.readOnly_Setter_(unwrap_jso(this), value);
+  set readOnly(bool value) => _blink.BlinkHTMLInputElement.instance.readOnly_Setter_(this, value);
   
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  bool get required => _blink.BlinkHTMLInputElement.instance.required_Getter_(unwrap_jso(this));
+  bool get required => _blink.BlinkHTMLInputElement.instance.required_Getter_(this);
   
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  set required(bool value) => _blink.BlinkHTMLInputElement.instance.required_Setter_(unwrap_jso(this), value);
+  set required(bool value) => _blink.BlinkHTMLInputElement.instance.required_Setter_(this, value);
   
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.BlinkHTMLInputElement.instance.selectionDirection_Getter_(unwrap_jso(this));
+  String get selectionDirection => _blink.BlinkHTMLInputElement.instance.selectionDirection_Getter_(this);
   
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  set selectionDirection(String value) => _blink.BlinkHTMLInputElement.instance.selectionDirection_Setter_(unwrap_jso(this), value);
+  set selectionDirection(String value) => _blink.BlinkHTMLInputElement.instance.selectionDirection_Setter_(this, value);
   
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.BlinkHTMLInputElement.instance.selectionEnd_Getter_(unwrap_jso(this));
+  int get selectionEnd => _blink.BlinkHTMLInputElement.instance.selectionEnd_Getter_(this);
   
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  set selectionEnd(int value) => _blink.BlinkHTMLInputElement.instance.selectionEnd_Setter_(unwrap_jso(this), value);
+  set selectionEnd(int value) => _blink.BlinkHTMLInputElement.instance.selectionEnd_Setter_(this, value);
   
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.BlinkHTMLInputElement.instance.selectionStart_Getter_(unwrap_jso(this));
+  int get selectionStart => _blink.BlinkHTMLInputElement.instance.selectionStart_Getter_(this);
   
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  set selectionStart(int value) => _blink.BlinkHTMLInputElement.instance.selectionStart_Setter_(unwrap_jso(this), value);
+  set selectionStart(int value) => _blink.BlinkHTMLInputElement.instance.selectionStart_Setter_(this, value);
   
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  int get size => _blink.BlinkHTMLInputElement.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkHTMLInputElement.instance.size_Getter_(this);
   
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  set size(int value) => _blink.BlinkHTMLInputElement.instance.size_Setter_(unwrap_jso(this), value);
+  set size(int value) => _blink.BlinkHTMLInputElement.instance.size_Setter_(this, value);
   
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLInputElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLInputElement.instance.src_Getter_(this);
   
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLInputElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLInputElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  String get step => _blink.BlinkHTMLInputElement.instance.step_Getter_(unwrap_jso(this));
+  String get step => _blink.BlinkHTMLInputElement.instance.step_Getter_(this);
   
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  set step(String value) => _blink.BlinkHTMLInputElement.instance.step_Setter_(unwrap_jso(this), value);
+  set step(String value) => _blink.BlinkHTMLInputElement.instance.step_Setter_(this, value);
   
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLInputElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLInputElement.instance.type_Getter_(this);
   
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLInputElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLInputElement.instance.type_Setter_(this, value);
   
   @DomName('HTMLInputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLInputElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLInputElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLInputElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLInputElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLInputElement.instance.validity_Getter_(this);
   
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLInputElement.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkHTMLInputElement.instance.value_Getter_(this);
   
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkHTMLInputElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLInputElement.instance.value_Setter_(this, value);
   
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  DateTime get valueAsDate => _blink.BlinkHTMLInputElement.instance.valueAsDate_Getter_(unwrap_jso(this));
+  DateTime get valueAsDate => _blink.BlinkHTMLInputElement.instance.valueAsDate_Getter_(this);
   
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.instance.valueAsDate_Setter_(unwrap_jso(this), value);
+  set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.instance.valueAsDate_Setter_(this, value);
   
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  num get valueAsNumber => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Getter_(unwrap_jso(this));
+  num get valueAsNumber => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Getter_(this);
   
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Setter_(unwrap_jso(this), value);
+  set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Setter_(this, value);
   
   @DomName('HTMLInputElement.webkitEntries')
   @DocsEditable()
@@ -24253,7 +22691,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
-  List<Entry> get entries => wrap_jso(_blink.BlinkHTMLInputElement.instance.webkitEntries_Getter_(unwrap_jso(this)));
+  List<Entry> get entries => (_blink.BlinkHTMLInputElement.instance.webkitEntries_Getter_(this));
   
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -24261,7 +22699,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  bool get directory => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Getter_(unwrap_jso(this));
+  bool get directory => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Getter_(this);
   
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -24269,48 +22707,48 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  set directory(bool value) => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Setter_(unwrap_jso(this), value);
+  set directory(bool value) => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Setter_(this, value);
   
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLInputElement.instance.width_Getter_(unwrap_jso(this));
+  int get width => _blink.BlinkHTMLInputElement.instance.width_Getter_(this);
   
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  set width(int value) => _blink.BlinkHTMLInputElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLInputElement.instance.width_Setter_(this, value);
   
   @DomName('HTMLInputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLInputElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLInputElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLInputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLInputElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLInputElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLInputElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLInputElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLInputElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLInputElement.select')
   @DocsEditable()
-  void select() => _blink.BlinkHTMLInputElement.instance.select_Callback_0_(unwrap_jso(this));
+  void select() => _blink.BlinkHTMLInputElement.instance.select_Callback_0_(this);
   
   @DomName('HTMLInputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLInputElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLInputElement.instance.setCustomValidity_Callback_1_(this, error);
   
   void setRangeText(String replacement, {int start, int end, String selectionMode}) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_1_(unwrap_jso(this), replacement);
+      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_1_(this, replacement);
       return;
     }
     if ((end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null) && selectionMode == null) {
-      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_3_(unwrap_jso(this), replacement, start, end);
+      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_3_(this, replacement, start, end);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_4_(unwrap_jso(this), replacement, start, end, selectionMode);
+      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_4_(this, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -24318,28 +22756,28 @@
 
   void setSelectionRange(int start, int end, [String direction]) {
     if (direction != null) {
-      _blink.BlinkHTMLInputElement.instance.setSelectionRange_Callback_3_(unwrap_jso(this), start, end, direction);
+      _blink.BlinkHTMLInputElement.instance.setSelectionRange_Callback_3_(this, start, end, direction);
       return;
     }
-    _blink.BlinkHTMLInputElement.instance.setSelectionRange_Callback_2_(unwrap_jso(this), start, end);
+    _blink.BlinkHTMLInputElement.instance.setSelectionRange_Callback_2_(this, start, end);
     return;
   }
 
   void stepDown([int n]) {
     if (n != null) {
-      _blink.BlinkHTMLInputElement.instance.stepDown_Callback_1_(unwrap_jso(this), n);
+      _blink.BlinkHTMLInputElement.instance.stepDown_Callback_1_(this, n);
       return;
     }
-    _blink.BlinkHTMLInputElement.instance.stepDown_Callback_0_(unwrap_jso(this));
+    _blink.BlinkHTMLInputElement.instance.stepDown_Callback_0_(this);
     return;
   }
 
   void stepUp([int n]) {
     if (n != null) {
-      _blink.BlinkHTMLInputElement.instance.stepUp_Callback_1_(unwrap_jso(this), n);
+      _blink.BlinkHTMLInputElement.instance.stepUp_Callback_1_(this, n);
       return;
     }
-    _blink.BlinkHTMLInputElement.instance.stepUp_Callback_0_(unwrap_jso(this));
+    _blink.BlinkHTMLInputElement.instance.stepUp_Callback_0_(this);
     return;
   }
 
@@ -24934,18 +23372,14 @@
   factory KeyboardEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkKeyboardEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkKeyboardEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkKeyboardEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkKeyboardEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static KeyboardEvent internalCreateKeyboardEvent() {
-    return new KeyboardEvent._internalWrap();
-  }
-
-  external factory KeyboardEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   KeyboardEvent.internal_() : super.internal_();
@@ -24973,58 +23407,58 @@
 
   @DomName('KeyboardEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.BlinkKeyboardEvent.instance.altKey_Getter_(unwrap_jso(this));
+  bool get altKey => _blink.BlinkKeyboardEvent.instance.altKey_Getter_(this);
   
   @DomName('KeyboardEvent.code')
   @DocsEditable()
   @Experimental() // untriaged
-  String get code => _blink.BlinkKeyboardEvent.instance.code_Getter_(unwrap_jso(this));
+  String get code => _blink.BlinkKeyboardEvent.instance.code_Getter_(this);
   
   @DomName('KeyboardEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.BlinkKeyboardEvent.instance.ctrlKey_Getter_(unwrap_jso(this));
+  bool get ctrlKey => _blink.BlinkKeyboardEvent.instance.ctrlKey_Getter_(this);
   
   @DomName('KeyboardEvent.key')
   @DocsEditable()
   @Experimental() // untriaged
-  String get key => _blink.BlinkKeyboardEvent.instance.key_Getter_(unwrap_jso(this));
+  String get key => _blink.BlinkKeyboardEvent.instance.key_Getter_(this);
   
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get _keyIdentifier => _blink.BlinkKeyboardEvent.instance.keyIdentifier_Getter_(unwrap_jso(this));
+  String get _keyIdentifier => _blink.BlinkKeyboardEvent.instance.keyIdentifier_Getter_(this);
   
   @DomName('KeyboardEvent.keyLocation')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get keyLocation => _blink.BlinkKeyboardEvent.instance.keyLocation_Getter_(unwrap_jso(this));
+  int get keyLocation => _blink.BlinkKeyboardEvent.instance.keyLocation_Getter_(this);
   
   @DomName('KeyboardEvent.location')
   @DocsEditable()
   @Experimental() // untriaged
-  int get location => _blink.BlinkKeyboardEvent.instance.location_Getter_(unwrap_jso(this));
+  int get location => _blink.BlinkKeyboardEvent.instance.location_Getter_(this);
   
   @DomName('KeyboardEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.BlinkKeyboardEvent.instance.metaKey_Getter_(unwrap_jso(this));
+  bool get metaKey => _blink.BlinkKeyboardEvent.instance.metaKey_Getter_(this);
   
   @DomName('KeyboardEvent.repeat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get repeat => _blink.BlinkKeyboardEvent.instance.repeat_Getter_(unwrap_jso(this));
+  bool get repeat => _blink.BlinkKeyboardEvent.instance.repeat_Getter_(this);
   
   @DomName('KeyboardEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.BlinkKeyboardEvent.instance.shiftKey_Getter_(unwrap_jso(this));
+  bool get shiftKey => _blink.BlinkKeyboardEvent.instance.shiftKey_Getter_(this);
   
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArg) => _blink.BlinkKeyboardEvent.instance.getModifierState_Callback_1_(unwrap_jso(this), keyArg);
+  bool getModifierState(String keyArg) => _blink.BlinkKeyboardEvent.instance.getModifierState_Callback_1_(this, keyArg);
   
   @DomName('KeyboardEvent.initKeyboardEvent')
   @DocsEditable()
-  void _initKeyboardEvent(String type, bool bubbles, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkKeyboardEvent.instance.initKeyboardEvent_Callback_10_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
+  void _initKeyboardEvent(String type, bool bubbles, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkKeyboardEvent.instance.initKeyboardEvent_Callback_10_(this, type, bubbles, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25045,25 +23479,21 @@
   @DocsEditable()
   factory KeyframeEffect(Element target, List<Map> keyframes, [timing]) {
     if ((keyframes is List<Map>) && (target is Element || target == null) && timing == null) {
-      return wrap_jso(_blink.BlinkKeyframeEffect.instance.constructorCallback_2_(target, keyframes));
+      return _blink.BlinkKeyframeEffect.instance.constructorCallback_2_(target, keyframes);
     }
     if ((timing is num) && (keyframes is List<Map>) && (target is Element || target == null)) {
-      return wrap_jso(_blink.BlinkKeyframeEffect.instance.constructorCallback_3_(target, keyframes, timing));
+      return _blink.BlinkKeyframeEffect.instance.constructorCallback_3_(target, keyframes, timing);
     }
     if ((timing is Map) && (keyframes is List<Map>) && (target is Element || target == null)) {
       var timing_1 = convertDartToNative_Dictionary(timing);
-      return wrap_jso(_blink.BlinkKeyframeEffect.instance.constructorCallback_3_(target, keyframes, timing_1));
+      return _blink.BlinkKeyframeEffect.instance.constructorCallback_3_(target, keyframes, timing_1);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
 
   @Deprecated("Internal Use Only")
-  static KeyframeEffect internalCreateKeyframeEffect() {
-    return new KeyframeEffect._internalWrap();
-  }
-
-  external factory KeyframeEffect._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   KeyframeEffect.internal_() : super.internal_();
@@ -25093,11 +23523,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static KeygenElement internalCreateKeygenElement() {
-    return new KeygenElement._internalWrap();
-  }
-
-  external factory KeygenElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   KeygenElement.internal_() : super.internal_();
@@ -25114,81 +23540,81 @@
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLKeygenElement.instance.autofocus_Getter_(unwrap_jso(this));
+  bool get autofocus => _blink.BlinkHTMLKeygenElement.instance.autofocus_Getter_(this);
   
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.instance.autofocus_Setter_(this, value);
   
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  String get challenge => _blink.BlinkHTMLKeygenElement.instance.challenge_Getter_(unwrap_jso(this));
+  String get challenge => _blink.BlinkHTMLKeygenElement.instance.challenge_Getter_(this);
   
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  set challenge(String value) => _blink.BlinkHTMLKeygenElement.instance.challenge_Setter_(unwrap_jso(this), value);
+  set challenge(String value) => _blink.BlinkHTMLKeygenElement.instance.challenge_Setter_(this, value);
   
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLKeygenElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLKeygenElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLKeygenElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLKeygenElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLKeygenElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLKeygenElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLKeygenElement.instance.form_Getter_(this);
   
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  String get keytype => _blink.BlinkHTMLKeygenElement.instance.keytype_Getter_(unwrap_jso(this));
+  String get keytype => _blink.BlinkHTMLKeygenElement.instance.keytype_Getter_(this);
   
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  set keytype(String value) => _blink.BlinkHTMLKeygenElement.instance.keytype_Setter_(unwrap_jso(this), value);
+  set keytype(String value) => _blink.BlinkHTMLKeygenElement.instance.keytype_Setter_(this, value);
   
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLKeygenElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLKeygenElement.instance.labels_Getter_(this));
   
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLKeygenElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLKeygenElement.instance.name_Getter_(this);
   
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLKeygenElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLKeygenElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLKeygenElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLKeygenElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLKeygenElement.instance.type_Getter_(this);
   
   @DomName('HTMLKeygenElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLKeygenElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLKeygenElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLKeygenElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLKeygenElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLKeygenElement.instance.validity_Getter_(this);
   
   @DomName('HTMLKeygenElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLKeygenElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLKeygenElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLKeygenElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLKeygenElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLKeygenElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLKeygenElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLKeygenElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLKeygenElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLKeygenElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLKeygenElement.instance.setCustomValidity_Callback_1_(this, error);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25210,11 +23636,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static LIElement internalCreateLIElement() {
-    return new LIElement._internalWrap();
-  }
-
-  external factory LIElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LIElement.internal_() : super.internal_();
@@ -25228,11 +23650,11 @@
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  int get value => _blink.BlinkHTMLLIElement.instance.value_Getter_(unwrap_jso(this));
+  int get value => _blink.BlinkHTMLLIElement.instance.value_Getter_(this);
   
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  set value(int value) => _blink.BlinkHTMLLIElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(int value) => _blink.BlinkHTMLLIElement.instance.value_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25254,11 +23676,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static LabelElement internalCreateLabelElement() {
-    return new LabelElement._internalWrap();
-  }
-
-  external factory LabelElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LabelElement.internal_() : super.internal_();
@@ -25272,19 +23690,19 @@
 
   @DomName('HTMLLabelElement.control')
   @DocsEditable()
-  HtmlElement get control => wrap_jso(_blink.BlinkHTMLLabelElement.instance.control_Getter_(unwrap_jso(this)));
+  HtmlElement get control => _blink.BlinkHTMLLabelElement.instance.control_Getter_(this);
   
   @DomName('HTMLLabelElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLLabelElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLLabelElement.instance.form_Getter_(this);
   
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  String get htmlFor => _blink.BlinkHTMLLabelElement.instance.htmlFor_Getter_(unwrap_jso(this));
+  String get htmlFor => _blink.BlinkHTMLLabelElement.instance.htmlFor_Getter_(this);
   
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  set htmlFor(String value) => _blink.BlinkHTMLLabelElement.instance.htmlFor_Setter_(unwrap_jso(this), value);
+  set htmlFor(String value) => _blink.BlinkHTMLLabelElement.instance.htmlFor_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25306,11 +23724,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static LegendElement internalCreateLegendElement() {
-    return new LegendElement._internalWrap();
-  }
-
-  external factory LegendElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LegendElement.internal_() : super.internal_();
@@ -25324,7 +23738,7 @@
 
   @DomName('HTMLLegendElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLLegendElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLLegendElement.instance.form_Getter_(this);
   
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -25344,11 +23758,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static LinkElement internalCreateLinkElement() {
-    return new LinkElement._internalWrap();
-  }
-
-  external factory LinkElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LinkElement.internal_() : super.internal_();
@@ -25363,84 +23773,84 @@
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Getter_(unwrap_jso(this));
+  String get crossOrigin => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Getter_(this);
   
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Setter_(this, value);
   
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLLinkElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLLinkElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLLinkElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLLinkElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLLinkElement.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkHTMLLinkElement.instance.href_Getter_(this);
   
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  set href(String value) => _blink.BlinkHTMLLinkElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLLinkElement.instance.href_Setter_(this, value);
   
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.BlinkHTMLLinkElement.instance.hreflang_Getter_(unwrap_jso(this));
+  String get hreflang => _blink.BlinkHTMLLinkElement.instance.hreflang_Getter_(this);
   
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  set hreflang(String value) => _blink.BlinkHTMLLinkElement.instance.hreflang_Setter_(unwrap_jso(this), value);
+  set hreflang(String value) => _blink.BlinkHTMLLinkElement.instance.hreflang_Setter_(this, value);
   
   @DomName('HTMLLinkElement.import')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
   @Experimental()
-  Document get import => wrap_jso(_blink.BlinkHTMLLinkElement.instance.import_Getter_(unwrap_jso(this)));
+  Document get import => _blink.BlinkHTMLLinkElement.instance.import_Getter_(this);
   
   @DomName('HTMLLinkElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLLinkElement.instance.integrity_Getter_(unwrap_jso(this));
+  String get integrity => _blink.BlinkHTMLLinkElement.instance.integrity_Getter_(this);
   
   @DomName('HTMLLinkElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLLinkElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLLinkElement.instance.integrity_Setter_(this, value);
   
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkHTMLLinkElement.instance.media_Getter_(unwrap_jso(this));
+  String get media => _blink.BlinkHTMLLinkElement.instance.media_Getter_(this);
   
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  set media(String value) => _blink.BlinkHTMLLinkElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkHTMLLinkElement.instance.media_Setter_(this, value);
   
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  String get rel => _blink.BlinkHTMLLinkElement.instance.rel_Getter_(unwrap_jso(this));
+  String get rel => _blink.BlinkHTMLLinkElement.instance.rel_Getter_(this);
   
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  set rel(String value) => _blink.BlinkHTMLLinkElement.instance.rel_Setter_(unwrap_jso(this), value);
+  set rel(String value) => _blink.BlinkHTMLLinkElement.instance.rel_Setter_(this, value);
   
   @DomName('HTMLLinkElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => wrap_jso(_blink.BlinkHTMLLinkElement.instance.sheet_Getter_(unwrap_jso(this)));
+  StyleSheet get sheet => _blink.BlinkHTMLLinkElement.instance.sheet_Getter_(this);
   
   @DomName('HTMLLinkElement.sizes')
   @DocsEditable()
-  DomSettableTokenList get sizes => wrap_jso(_blink.BlinkHTMLLinkElement.instance.sizes_Getter_(unwrap_jso(this)));
+  DomSettableTokenList get sizes => _blink.BlinkHTMLLinkElement.instance.sizes_Getter_(this);
   
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLLinkElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLLinkElement.instance.type_Getter_(this);
   
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLLinkElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLLinkElement.instance.type_Setter_(this, value);
   
 
     /// Checks if HTML imports are supported on the current platform.
@@ -25459,111 +23869,103 @@
   // To suppress missing implicit constructor warnings.
   factory Location._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Location internalCreateLocation() {
-    return new Location._internalWrap();
-  }
 
-  factory Location._internalWrap() {
-    return new Location.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Location.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Location.ancestorOrigins')
   @DocsEditable()
   @Experimental() // nonstandard
-  List<String> get ancestorOrigins => wrap_jso(_blink.BlinkLocation.instance.ancestorOrigins_Getter_(unwrap_jso(this)));
+  List<String> get ancestorOrigins => _blink.BlinkLocation.instance.ancestorOrigins_Getter_(this);
   
   @DomName('Location.hash')
   @DocsEditable()
-  String get hash => _blink.BlinkLocation.instance.hash_Getter_(unwrap_jso(this));
+  String get hash => _blink.BlinkLocation.instance.hash_Getter_(this);
   
   @DomName('Location.hash')
   @DocsEditable()
-  set hash(String value) => _blink.BlinkLocation.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkLocation.instance.hash_Setter_(this, value);
   
   @DomName('Location.host')
   @DocsEditable()
-  String get host => _blink.BlinkLocation.instance.host_Getter_(unwrap_jso(this));
+  String get host => _blink.BlinkLocation.instance.host_Getter_(this);
   
   @DomName('Location.host')
   @DocsEditable()
-  set host(String value) => _blink.BlinkLocation.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkLocation.instance.host_Setter_(this, value);
   
   @DomName('Location.hostname')
   @DocsEditable()
-  String get hostname => _blink.BlinkLocation.instance.hostname_Getter_(unwrap_jso(this));
+  String get hostname => _blink.BlinkLocation.instance.hostname_Getter_(this);
   
   @DomName('Location.hostname')
   @DocsEditable()
-  set hostname(String value) => _blink.BlinkLocation.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkLocation.instance.hostname_Setter_(this, value);
   
   @DomName('Location.href')
   @DocsEditable()
-  String get href => _blink.BlinkLocation.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkLocation.instance.href_Getter_(this);
   
   @DomName('Location.href')
   @DocsEditable()
-  set href(String value) => _blink.BlinkLocation.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkLocation.instance.href_Setter_(this, value);
   
   @DomName('Location.origin')
   @DocsEditable()
   // http://url.spec.whatwg.org/#urlutils Webkit Only
   @Experimental() // non-standard
-  String get origin => _blink.BlinkLocation.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkLocation.instance.origin_Getter_(this);
   
   @DomName('Location.pathname')
   @DocsEditable()
-  String get pathname => _blink.BlinkLocation.instance.pathname_Getter_(unwrap_jso(this));
+  String get pathname => _blink.BlinkLocation.instance.pathname_Getter_(this);
   
   @DomName('Location.pathname')
   @DocsEditable()
-  set pathname(String value) => _blink.BlinkLocation.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkLocation.instance.pathname_Setter_(this, value);
   
   @DomName('Location.port')
   @DocsEditable()
-  String get port => _blink.BlinkLocation.instance.port_Getter_(unwrap_jso(this));
+  String get port => _blink.BlinkLocation.instance.port_Getter_(this);
   
   @DomName('Location.port')
   @DocsEditable()
-  set port(String value) => _blink.BlinkLocation.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkLocation.instance.port_Setter_(this, value);
   
   @DomName('Location.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkLocation.instance.protocol_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkLocation.instance.protocol_Getter_(this);
   
   @DomName('Location.protocol')
   @DocsEditable()
-  set protocol(String value) => _blink.BlinkLocation.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkLocation.instance.protocol_Setter_(this, value);
   
   @DomName('Location.search')
   @DocsEditable()
-  String get search => _blink.BlinkLocation.instance.search_Getter_(unwrap_jso(this));
+  String get search => _blink.BlinkLocation.instance.search_Getter_(this);
   
   @DomName('Location.search')
   @DocsEditable()
-  set search(String value) => _blink.BlinkLocation.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkLocation.instance.search_Setter_(this, value);
   
   @DomName('Location.assign')
   @DocsEditable()
-  void assign([String url]) => _blink.BlinkLocation.instance.assign_Callback_1_(unwrap_jso(this), url);
+  void assign([String url]) => _blink.BlinkLocation.instance.assign_Callback_1_(this, url);
   
   @DomName('Location.reload')
   @DocsEditable()
-  void reload() => _blink.BlinkLocation.instance.reload_Callback_0_(unwrap_jso(this));
+  void reload() => _blink.BlinkLocation.instance.reload_Callback_0_(this);
   
   @DomName('Location.replace')
   @DocsEditable()
-  void replace(String url) => _blink.BlinkLocation.instance.replace_Callback_1_(unwrap_jso(this), url);
+  void replace(String url) => _blink.BlinkLocation.instance.replace_Callback_1_(this, url);
   
   @DomName('Location.toString')
   @DocsEditable()
-  String toString() => _blink.BlinkLocation.instance.toString_Callback_0_(unwrap_jso(this));
+  String toString() => _blink.BlinkLocation.instance.toString_Callback_0_(this);
   
 
 
@@ -25587,11 +23989,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MapElement internalCreateMapElement() {
-    return new MapElement._internalWrap();
-  }
-
-  external factory MapElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MapElement.internal_() : super.internal_();
@@ -25605,15 +24003,15 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  List<Node> get areas => wrap_jso(_blink.BlinkHTMLMapElement.instance.areas_Getter_(unwrap_jso(this)));
+  List<Node> get areas => (_blink.BlinkHTMLMapElement.instance.areas_Getter_(this));
   
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLMapElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLMapElement.instance.name_Getter_(this);
   
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLMapElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLMapElement.instance.name_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25634,16 +24032,12 @@
   @DomName('MediaController.MediaController')
   @DocsEditable()
   factory MediaController() {
-    return wrap_jso(_blink.BlinkMediaController.instance.constructorCallback_0_());
+    return _blink.BlinkMediaController.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaController internalCreateMediaController() {
-    return new MediaController._internalWrap();
-  }
-
-  external factory MediaController._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaController.internal_() : super.internal_();
@@ -25651,79 +24045,79 @@
 
   @DomName('MediaController.buffered')
   @DocsEditable()
-  TimeRanges get buffered => wrap_jso(_blink.BlinkMediaController.instance.buffered_Getter_(unwrap_jso(this)));
+  TimeRanges get buffered => _blink.BlinkMediaController.instance.buffered_Getter_(this);
   
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.BlinkMediaController.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkMediaController.instance.currentTime_Getter_(this);
   
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  set currentTime(num value) => _blink.BlinkMediaController.instance.currentTime_Setter_(unwrap_jso(this), value);
+  set currentTime(num value) => _blink.BlinkMediaController.instance.currentTime_Setter_(this, value);
   
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.BlinkMediaController.instance.defaultPlaybackRate_Getter_(unwrap_jso(this));
+  num get defaultPlaybackRate => _blink.BlinkMediaController.instance.defaultPlaybackRate_Getter_(this);
   
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  set defaultPlaybackRate(num value) => _blink.BlinkMediaController.instance.defaultPlaybackRate_Setter_(unwrap_jso(this), value);
+  set defaultPlaybackRate(num value) => _blink.BlinkMediaController.instance.defaultPlaybackRate_Setter_(this, value);
   
   @DomName('MediaController.duration')
   @DocsEditable()
-  num get duration => _blink.BlinkMediaController.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkMediaController.instance.duration_Getter_(this);
   
   @DomName('MediaController.muted')
   @DocsEditable()
-  bool get muted => _blink.BlinkMediaController.instance.muted_Getter_(unwrap_jso(this));
+  bool get muted => _blink.BlinkMediaController.instance.muted_Getter_(this);
   
   @DomName('MediaController.muted')
   @DocsEditable()
-  set muted(bool value) => _blink.BlinkMediaController.instance.muted_Setter_(unwrap_jso(this), value);
+  set muted(bool value) => _blink.BlinkMediaController.instance.muted_Setter_(this, value);
   
   @DomName('MediaController.paused')
   @DocsEditable()
-  bool get paused => _blink.BlinkMediaController.instance.paused_Getter_(unwrap_jso(this));
+  bool get paused => _blink.BlinkMediaController.instance.paused_Getter_(this);
   
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.BlinkMediaController.instance.playbackRate_Getter_(unwrap_jso(this));
+  num get playbackRate => _blink.BlinkMediaController.instance.playbackRate_Getter_(this);
   
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  set playbackRate(num value) => _blink.BlinkMediaController.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkMediaController.instance.playbackRate_Setter_(this, value);
   
   @DomName('MediaController.playbackState')
   @DocsEditable()
-  String get playbackState => _blink.BlinkMediaController.instance.playbackState_Getter_(unwrap_jso(this));
+  String get playbackState => _blink.BlinkMediaController.instance.playbackState_Getter_(this);
   
   @DomName('MediaController.played')
   @DocsEditable()
-  TimeRanges get played => wrap_jso(_blink.BlinkMediaController.instance.played_Getter_(unwrap_jso(this)));
+  TimeRanges get played => _blink.BlinkMediaController.instance.played_Getter_(this);
   
   @DomName('MediaController.seekable')
   @DocsEditable()
-  TimeRanges get seekable => wrap_jso(_blink.BlinkMediaController.instance.seekable_Getter_(unwrap_jso(this)));
+  TimeRanges get seekable => _blink.BlinkMediaController.instance.seekable_Getter_(this);
   
   @DomName('MediaController.volume')
   @DocsEditable()
-  num get volume => _blink.BlinkMediaController.instance.volume_Getter_(unwrap_jso(this));
+  num get volume => _blink.BlinkMediaController.instance.volume_Getter_(this);
   
   @DomName('MediaController.volume')
   @DocsEditable()
-  set volume(num value) => _blink.BlinkMediaController.instance.volume_Setter_(unwrap_jso(this), value);
+  set volume(num value) => _blink.BlinkMediaController.instance.volume_Setter_(this, value);
   
   @DomName('MediaController.pause')
   @DocsEditable()
-  void pause() => _blink.BlinkMediaController.instance.pause_Callback_0_(unwrap_jso(this));
+  void pause() => _blink.BlinkMediaController.instance.pause_Callback_0_(this);
   
   @DomName('MediaController.play')
   @DocsEditable()
-  void play() => _blink.BlinkMediaController.instance.play_Callback_0_(unwrap_jso(this));
+  void play() => _blink.BlinkMediaController.instance.play_Callback_0_(this);
   
   @DomName('MediaController.unpause')
   @DocsEditable()
-  void unpause() => _blink.BlinkMediaController.instance.unpause_Callback_0_(unwrap_jso(this));
+  void unpause() => _blink.BlinkMediaController.instance.unpause_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25740,40 +24134,32 @@
   // To suppress missing implicit constructor warnings.
   factory MediaDeviceInfo._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaDeviceInfo internalCreateMediaDeviceInfo() {
-    return new MediaDeviceInfo._internalWrap();
-  }
 
-  factory MediaDeviceInfo._internalWrap() {
-    return new MediaDeviceInfo.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaDeviceInfo.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaDeviceInfo.deviceId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get deviceId => _blink.BlinkMediaDeviceInfo.instance.deviceId_Getter_(unwrap_jso(this));
+  String get deviceId => _blink.BlinkMediaDeviceInfo.instance.deviceId_Getter_(this);
   
   @DomName('MediaDeviceInfo.groupId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get groupId => _blink.BlinkMediaDeviceInfo.instance.groupId_Getter_(unwrap_jso(this));
+  String get groupId => _blink.BlinkMediaDeviceInfo.instance.groupId_Getter_(this);
   
   @DomName('MediaDeviceInfo.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkMediaDeviceInfo.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkMediaDeviceInfo.instance.kind_Getter_(this);
   
   @DomName('MediaDeviceInfo.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkMediaDeviceInfo.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkMediaDeviceInfo.instance.label_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25790,30 +24176,22 @@
   // To suppress missing implicit constructor warnings.
   factory MediaDevices._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaDevices internalCreateMediaDevices() {
-    return new MediaDevices._internalWrap();
-  }
 
-  factory MediaDevices._internalWrap() {
-    return new MediaDevices.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaDevices.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaDevices.enumerateDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future enumerateDevices() => wrap_jso(_blink.BlinkMediaDevices.instance.enumerateDevices_Callback_0_(unwrap_jso(this)));
+  Future enumerateDevices() => convertNativePromiseToDartFuture(_blink.BlinkMediaDevices.instance.enumerateDevices_Callback_0_(this));
   
   @DomName('MediaDevices.getUserMedia')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getUserMedia(Map options) => wrap_jso(_blink.BlinkMediaDevices.instance.getUserMedia_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+  Future getUserMedia(Map options) => convertNativePromiseToDartFuture(_blink.BlinkMediaDevices.instance.getUserMedia_Callback_1_(this, convertDartToNative_Dictionary(options)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25888,11 +24266,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaElement internalCreateMediaElement() {
-    return new MediaElement._internalWrap();
-  }
-
-  external factory MediaElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaElement.internal_() : super.internal_();
@@ -25943,197 +24317,197 @@
   @DomName('HTMLMediaElement.audioTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrackList get audioTracks => wrap_jso(_blink.BlinkHTMLMediaElement.instance.audioTracks_Getter_(unwrap_jso(this)));
+  AudioTrackList get audioTracks => _blink.BlinkHTMLMediaElement.instance.audioTracks_Getter_(this);
   
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  bool get autoplay => _blink.BlinkHTMLMediaElement.instance.autoplay_Getter_(unwrap_jso(this));
+  bool get autoplay => _blink.BlinkHTMLMediaElement.instance.autoplay_Getter_(this);
   
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  set autoplay(bool value) => _blink.BlinkHTMLMediaElement.instance.autoplay_Setter_(unwrap_jso(this), value);
+  set autoplay(bool value) => _blink.BlinkHTMLMediaElement.instance.autoplay_Setter_(this, value);
   
   @DomName('HTMLMediaElement.buffered')
   @DocsEditable()
-  TimeRanges get buffered => wrap_jso(_blink.BlinkHTMLMediaElement.instance.buffered_Getter_(unwrap_jso(this)));
+  TimeRanges get buffered => _blink.BlinkHTMLMediaElement.instance.buffered_Getter_(this);
   
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  MediaController get controller => wrap_jso(_blink.BlinkHTMLMediaElement.instance.controller_Getter_(unwrap_jso(this)));
+  MediaController get controller => _blink.BlinkHTMLMediaElement.instance.controller_Getter_(this);
   
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  set controller(MediaController value) => _blink.BlinkHTMLMediaElement.instance.controller_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set controller(MediaController value) => _blink.BlinkHTMLMediaElement.instance.controller_Setter_(this, value);
   
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  bool get controls => _blink.BlinkHTMLMediaElement.instance.controls_Getter_(unwrap_jso(this));
+  bool get controls => _blink.BlinkHTMLMediaElement.instance.controls_Getter_(this);
   
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  set controls(bool value) => _blink.BlinkHTMLMediaElement.instance.controls_Setter_(unwrap_jso(this), value);
+  set controls(bool value) => _blink.BlinkHTMLMediaElement.instance.controls_Setter_(this, value);
   
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Getter_(unwrap_jso(this));
+  String get crossOrigin => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Getter_(this);
   
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Setter_(this, value);
   
   @DomName('HTMLMediaElement.currentSrc')
   @DocsEditable()
-  String get currentSrc => _blink.BlinkHTMLMediaElement.instance.currentSrc_Getter_(unwrap_jso(this));
+  String get currentSrc => _blink.BlinkHTMLMediaElement.instance.currentSrc_Getter_(this);
   
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.BlinkHTMLMediaElement.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkHTMLMediaElement.instance.currentTime_Getter_(this);
   
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  set currentTime(num value) => _blink.BlinkHTMLMediaElement.instance.currentTime_Setter_(unwrap_jso(this), value);
+  set currentTime(num value) => _blink.BlinkHTMLMediaElement.instance.currentTime_Setter_(this, value);
   
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  bool get defaultMuted => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Getter_(unwrap_jso(this));
+  bool get defaultMuted => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Getter_(this);
   
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Setter_(unwrap_jso(this), value);
+  set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Setter_(this, value);
   
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Getter_(unwrap_jso(this));
+  num get defaultPlaybackRate => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Getter_(this);
   
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Setter_(unwrap_jso(this), value);
+  set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Setter_(this, value);
   
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  num get duration => _blink.BlinkHTMLMediaElement.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkHTMLMediaElement.instance.duration_Getter_(this);
   
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
-  bool get ended => _blink.BlinkHTMLMediaElement.instance.ended_Getter_(unwrap_jso(this));
+  bool get ended => _blink.BlinkHTMLMediaElement.instance.ended_Getter_(this);
   
   @DomName('HTMLMediaElement.error')
   @DocsEditable()
-  MediaError get error => wrap_jso(_blink.BlinkHTMLMediaElement.instance.error_Getter_(unwrap_jso(this)));
+  MediaError get error => _blink.BlinkHTMLMediaElement.instance.error_Getter_(this);
   
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  bool get loop => _blink.BlinkHTMLMediaElement.instance.loop_Getter_(unwrap_jso(this));
+  bool get loop => _blink.BlinkHTMLMediaElement.instance.loop_Getter_(this);
   
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  set loop(bool value) => _blink.BlinkHTMLMediaElement.instance.loop_Setter_(unwrap_jso(this), value);
+  set loop(bool value) => _blink.BlinkHTMLMediaElement.instance.loop_Setter_(this, value);
   
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  String get mediaGroup => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Getter_(unwrap_jso(this));
+  String get mediaGroup => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Getter_(this);
   
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Setter_(unwrap_jso(this), value);
+  set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Setter_(this, value);
   
   @DomName('HTMLMediaElement.mediaKeys')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
   @Experimental()
-  MediaKeys get mediaKeys => wrap_jso(_blink.BlinkHTMLMediaElement.instance.mediaKeys_Getter_(unwrap_jso(this)));
+  MediaKeys get mediaKeys => _blink.BlinkHTMLMediaElement.instance.mediaKeys_Getter_(this);
   
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  bool get muted => _blink.BlinkHTMLMediaElement.instance.muted_Getter_(unwrap_jso(this));
+  bool get muted => _blink.BlinkHTMLMediaElement.instance.muted_Getter_(this);
   
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  set muted(bool value) => _blink.BlinkHTMLMediaElement.instance.muted_Setter_(unwrap_jso(this), value);
+  set muted(bool value) => _blink.BlinkHTMLMediaElement.instance.muted_Setter_(this, value);
   
   @DomName('HTMLMediaElement.networkState')
   @DocsEditable()
-  int get networkState => _blink.BlinkHTMLMediaElement.instance.networkState_Getter_(unwrap_jso(this));
+  int get networkState => _blink.BlinkHTMLMediaElement.instance.networkState_Getter_(this);
   
   @DomName('HTMLMediaElement.paused')
   @DocsEditable()
-  bool get paused => _blink.BlinkHTMLMediaElement.instance.paused_Getter_(unwrap_jso(this));
+  bool get paused => _blink.BlinkHTMLMediaElement.instance.paused_Getter_(this);
   
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.BlinkHTMLMediaElement.instance.playbackRate_Getter_(unwrap_jso(this));
+  num get playbackRate => _blink.BlinkHTMLMediaElement.instance.playbackRate_Getter_(this);
   
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  set playbackRate(num value) => _blink.BlinkHTMLMediaElement.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkHTMLMediaElement.instance.playbackRate_Setter_(this, value);
   
   @DomName('HTMLMediaElement.played')
   @DocsEditable()
-  TimeRanges get played => wrap_jso(_blink.BlinkHTMLMediaElement.instance.played_Getter_(unwrap_jso(this)));
+  TimeRanges get played => _blink.BlinkHTMLMediaElement.instance.played_Getter_(this);
   
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  String get preload => _blink.BlinkHTMLMediaElement.instance.preload_Getter_(unwrap_jso(this));
+  String get preload => _blink.BlinkHTMLMediaElement.instance.preload_Getter_(this);
   
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  set preload(String value) => _blink.BlinkHTMLMediaElement.instance.preload_Setter_(unwrap_jso(this), value);
+  set preload(String value) => _blink.BlinkHTMLMediaElement.instance.preload_Setter_(this, value);
   
   @DomName('HTMLMediaElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkHTMLMediaElement.instance.readyState_Getter_(unwrap_jso(this));
+  int get readyState => _blink.BlinkHTMLMediaElement.instance.readyState_Getter_(this);
   
   @DomName('HTMLMediaElement.seekable')
   @DocsEditable()
-  TimeRanges get seekable => wrap_jso(_blink.BlinkHTMLMediaElement.instance.seekable_Getter_(unwrap_jso(this)));
+  TimeRanges get seekable => _blink.BlinkHTMLMediaElement.instance.seekable_Getter_(this);
   
   @DomName('HTMLMediaElement.seeking')
   @DocsEditable()
-  bool get seeking => _blink.BlinkHTMLMediaElement.instance.seeking_Getter_(unwrap_jso(this));
+  bool get seeking => _blink.BlinkHTMLMediaElement.instance.seeking_Getter_(this);
   
   @DomName('HTMLMediaElement.session')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaSession get session => wrap_jso(_blink.BlinkHTMLMediaElement.instance.session_Getter_(unwrap_jso(this)));
+  MediaSession get session => _blink.BlinkHTMLMediaElement.instance.session_Getter_(this);
   
   @DomName('HTMLMediaElement.session')
   @DocsEditable()
   @Experimental() // untriaged
-  set session(MediaSession value) => _blink.BlinkHTMLMediaElement.instance.session_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set session(MediaSession value) => _blink.BlinkHTMLMediaElement.instance.session_Setter_(this, value);
   
   @DomName('HTMLMediaElement.sinkId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get sinkId => _blink.BlinkHTMLMediaElement.instance.sinkId_Getter_(unwrap_jso(this));
+  String get sinkId => _blink.BlinkHTMLMediaElement.instance.sinkId_Getter_(this);
   
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLMediaElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLMediaElement.instance.src_Getter_(this);
   
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLMediaElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLMediaElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
   @Experimental()
-  TextTrackList get textTracks => wrap_jso(_blink.BlinkHTMLMediaElement.instance.textTracks_Getter_(unwrap_jso(this)));
+  TextTrackList get textTracks => _blink.BlinkHTMLMediaElement.instance.textTracks_Getter_(this);
   
   @DomName('HTMLMediaElement.videoTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrackList get videoTracks => wrap_jso(_blink.BlinkHTMLMediaElement.instance.videoTracks_Getter_(unwrap_jso(this)));
+  VideoTrackList get videoTracks => _blink.BlinkHTMLMediaElement.instance.videoTracks_Getter_(this);
   
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  num get volume => _blink.BlinkHTMLMediaElement.instance.volume_Getter_(unwrap_jso(this));
+  num get volume => _blink.BlinkHTMLMediaElement.instance.volume_Getter_(this);
   
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  set volume(num value) => _blink.BlinkHTMLMediaElement.instance.volume_Setter_(unwrap_jso(this), value);
+  set volume(num value) => _blink.BlinkHTMLMediaElement.instance.volume_Setter_(this, value);
   
   @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   @DocsEditable()
@@ -26141,7 +24515,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get audioDecodedByteCount => _blink.BlinkHTMLMediaElement.instance.webkitAudioDecodedByteCount_Getter_(unwrap_jso(this));
+  int get audioDecodedByteCount => _blink.BlinkHTMLMediaElement.instance.webkitAudioDecodedByteCount_Getter_(this);
   
   @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
   @DocsEditable()
@@ -26149,59 +24523,59 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get videoDecodedByteCount => _blink.BlinkHTMLMediaElement.instance.webkitVideoDecodedByteCount_Getter_(unwrap_jso(this));
+  int get videoDecodedByteCount => _blink.BlinkHTMLMediaElement.instance.webkitVideoDecodedByteCount_Getter_(this);
   
   TextTrack addTextTrack(String kind, [String label, String language]) {
     if (language != null) {
-      return wrap_jso(_blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_3_(unwrap_jso(this), kind, label, language));
+      return _blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_3_(this, kind, label, language);
     }
     if (label != null) {
-      return wrap_jso(_blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_2_(unwrap_jso(this), kind, label));
+      return _blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_2_(this, kind, label);
     }
-    return wrap_jso(_blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_1_(unwrap_jso(this), kind));
+    return _blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_1_(this, kind);
   }
 
   String canPlayType(String type, [String keySystem]) {
     if ((type is String) && keySystem == null) {
-      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(unwrap_jso(this), type);
+      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(this, type);
     }
     if ((type is String || type == null) && keySystem == null) {
-      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(unwrap_jso(this), type);
+      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(this, type);
     }
     if ((keySystem is String || keySystem == null) && (type is String || type == null)) {
-      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_2_(unwrap_jso(this), type, keySystem);
+      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_2_(this, type, keySystem);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
-  void load() => _blink.BlinkHTMLMediaElement.instance.load_Callback_0_(unwrap_jso(this));
+  void load() => _blink.BlinkHTMLMediaElement.instance.load_Callback_0_(this);
   
   @DomName('HTMLMediaElement.pause')
   @DocsEditable()
-  void pause() => _blink.BlinkHTMLMediaElement.instance.pause_Callback_0_(unwrap_jso(this));
+  void pause() => _blink.BlinkHTMLMediaElement.instance.pause_Callback_0_(this);
   
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  void play() => _blink.BlinkHTMLMediaElement.instance.play_Callback_0_(unwrap_jso(this));
+  void play() => _blink.BlinkHTMLMediaElement.instance.play_Callback_0_(this);
   
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setMediaKeys(MediaKeys mediaKeys) => wrap_jso(_blink.BlinkHTMLMediaElement.instance.setMediaKeys_Callback_1_(unwrap_jso(this), unwrap_jso(mediaKeys)));
+  Future setMediaKeys(MediaKeys mediaKeys) => convertNativePromiseToDartFuture(_blink.BlinkHTMLMediaElement.instance.setMediaKeys_Callback_1_(this, mediaKeys));
   
   @DomName('HTMLMediaElement.setSinkId')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setSinkId(String sinkId) => wrap_jso(_blink.BlinkHTMLMediaElement.instance.setSinkId_Callback_1_(unwrap_jso(this), sinkId));
+  Future setSinkId(String sinkId) => convertNativePromiseToDartFuture(_blink.BlinkHTMLMediaElement.instance.setSinkId_Callback_1_(this, sinkId));
   
   void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
     if (initData != null) {
-      _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_4_(unwrap_jso(this), keySystem, unwrap_jso(key), unwrap_jso(initData), sessionId);
+      _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_4_(this, keySystem, key, initData, sessionId);
       return;
     }
-    _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_2_(unwrap_jso(this), keySystem, unwrap_jso(key));
+    _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_2_(this, keySystem, key);
     return;
   }
 
@@ -26211,14 +24585,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void cancelKeyRequest(String keySystem, String sessionId) => _blink.BlinkHTMLMediaElement.instance.webkitCancelKeyRequest_Callback_2_(unwrap_jso(this), keySystem, sessionId);
+  void cancelKeyRequest(String keySystem, String sessionId) => _blink.BlinkHTMLMediaElement.instance.webkitCancelKeyRequest_Callback_2_(this, keySystem, sessionId);
   
   void generateKeyRequest(String keySystem, [Uint8List initData]) {
     if (initData != null) {
-      _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_2_(unwrap_jso(this), keySystem, unwrap_jso(initData));
+      _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_2_(this, keySystem, initData);
       return;
     }
-    _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_1_(unwrap_jso(this), keySystem);
+    _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_1_(this, keySystem);
     return;
   }
 
@@ -26270,18 +24644,14 @@
   factory MediaEncryptedEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMediaEncryptedEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMediaEncryptedEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMediaEncryptedEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMediaEncryptedEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaEncryptedEvent internalCreateMediaEncryptedEvent() {
-    return new MediaEncryptedEvent._internalWrap();
-  }
-
-  external factory MediaEncryptedEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaEncryptedEvent.internal_() : super.internal_();
@@ -26290,12 +24660,12 @@
   @DomName('MediaEncryptedEvent.initData')
   @DocsEditable()
   @Experimental() // untriaged
-  ByteBuffer get initData => wrap_jso(_blink.BlinkMediaEncryptedEvent.instance.initData_Getter_(unwrap_jso(this)));
+  ByteBuffer get initData => _blink.BlinkMediaEncryptedEvent.instance.initData_Getter_(this);
   
   @DomName('MediaEncryptedEvent.initDataType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get initDataType => _blink.BlinkMediaEncryptedEvent.instance.initDataType_Getter_(unwrap_jso(this));
+  String get initDataType => _blink.BlinkMediaEncryptedEvent.instance.initDataType_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26312,21 +24682,13 @@
   // To suppress missing implicit constructor warnings.
   factory MediaError._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaError internalCreateMediaError() {
-    return new MediaError._internalWrap();
-  }
 
-  factory MediaError._internalWrap() {
-    return new MediaError.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaError.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaError.MEDIA_ERR_ABORTED')
   @DocsEditable()
   static const int MEDIA_ERR_ABORTED = 1;
@@ -26345,7 +24707,7 @@
 
   @DomName('MediaError.code')
   @DocsEditable()
-  int get code => _blink.BlinkMediaError.instance.code_Getter_(unwrap_jso(this));
+  int get code => _blink.BlinkMediaError.instance.code_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26363,21 +24725,13 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyError._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaKeyError internalCreateMediaKeyError() {
-    return new MediaKeyError._internalWrap();
-  }
 
-  factory MediaKeyError._internalWrap() {
-    return new MediaKeyError.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaKeyError.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaKeyError.MEDIA_KEYERR_CLIENT')
   @DocsEditable()
   static const int MEDIA_KEYERR_CLIENT = 2;
@@ -26404,12 +24758,12 @@
 
   @DomName('MediaKeyError.code')
   @DocsEditable()
-  int get code => _blink.BlinkMediaKeyError.instance.code_Getter_(unwrap_jso(this));
+  int get code => _blink.BlinkMediaKeyError.instance.code_Getter_(this);
   
   @DomName('MediaKeyError.systemCode')
   @DocsEditable()
   @Experimental() // non-standard
-  int get systemCode => _blink.BlinkMediaKeyError.instance.systemCode_Getter_(unwrap_jso(this));
+  int get systemCode => _blink.BlinkMediaKeyError.instance.systemCode_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26432,18 +24786,14 @@
   factory MediaKeyEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMediaKeyEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMediaKeyEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMediaKeyEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMediaKeyEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaKeyEvent internalCreateMediaKeyEvent() {
-    return new MediaKeyEvent._internalWrap();
-  }
-
-  external factory MediaKeyEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaKeyEvent.internal_() : super.internal_();
@@ -26451,31 +24801,31 @@
 
   @DomName('MediaKeyEvent.defaultURL')
   @DocsEditable()
-  String get defaultUrl => _blink.BlinkMediaKeyEvent.instance.defaultURL_Getter_(unwrap_jso(this));
+  String get defaultUrl => _blink.BlinkMediaKeyEvent.instance.defaultURL_Getter_(this);
   
   @DomName('MediaKeyEvent.errorCode')
   @DocsEditable()
-  MediaKeyError get errorCode => wrap_jso(_blink.BlinkMediaKeyEvent.instance.errorCode_Getter_(unwrap_jso(this)));
+  MediaKeyError get errorCode => _blink.BlinkMediaKeyEvent.instance.errorCode_Getter_(this);
   
   @DomName('MediaKeyEvent.initData')
   @DocsEditable()
-  Uint8List get initData => wrap_jso(_blink.BlinkMediaKeyEvent.instance.initData_Getter_(unwrap_jso(this)));
+  Uint8List get initData => _blink.BlinkMediaKeyEvent.instance.initData_Getter_(this);
   
   @DomName('MediaKeyEvent.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.BlinkMediaKeyEvent.instance.keySystem_Getter_(unwrap_jso(this));
+  String get keySystem => _blink.BlinkMediaKeyEvent.instance.keySystem_Getter_(this);
   
   @DomName('MediaKeyEvent.message')
   @DocsEditable()
-  Uint8List get message => wrap_jso(_blink.BlinkMediaKeyEvent.instance.message_Getter_(unwrap_jso(this)));
+  Uint8List get message => _blink.BlinkMediaKeyEvent.instance.message_Getter_(this);
   
   @DomName('MediaKeyEvent.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.BlinkMediaKeyEvent.instance.sessionId_Getter_(unwrap_jso(this));
+  String get sessionId => _blink.BlinkMediaKeyEvent.instance.sessionId_Getter_(this);
   
   @DomName('MediaKeyEvent.systemCode')
   @DocsEditable()
-  int get systemCode => _blink.BlinkMediaKeyEvent.instance.systemCode_Getter_(unwrap_jso(this));
+  int get systemCode => _blink.BlinkMediaKeyEvent.instance.systemCode_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26498,18 +24848,14 @@
   factory MediaKeyMessageEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMediaKeyMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMediaKeyMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMediaKeyMessageEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMediaKeyMessageEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaKeyMessageEvent internalCreateMediaKeyMessageEvent() {
-    return new MediaKeyMessageEvent._internalWrap();
-  }
-
-  external factory MediaKeyMessageEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaKeyMessageEvent.internal_() : super.internal_();
@@ -26517,12 +24863,12 @@
 
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
-  ByteBuffer get message => wrap_jso(_blink.BlinkMediaKeyMessageEvent.instance.message_Getter_(unwrap_jso(this)));
+  ByteBuffer get message => _blink.BlinkMediaKeyMessageEvent.instance.message_Getter_(this);
   
   @DomName('MediaKeyMessageEvent.messageType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get messageType => _blink.BlinkMediaKeyMessageEvent.instance.messageType_Getter_(unwrap_jso(this));
+  String get messageType => _blink.BlinkMediaKeyMessageEvent.instance.messageType_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26542,11 +24888,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaKeySession internalCreateMediaKeySession() {
-    return new MediaKeySession._internalWrap();
-  }
-
-  external factory MediaKeySession._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaKeySession.internal_() : super.internal_();
@@ -26555,44 +24897,44 @@
   @DomName('MediaKeySession.closed')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get closed => wrap_jso(_blink.BlinkMediaKeySession.instance.closed_Getter_(unwrap_jso(this)));
+  Future get closed => convertNativePromiseToDartFuture(_blink.BlinkMediaKeySession.instance.closed_Getter_(this));
   
   @DomName('MediaKeySession.expiration')
   @DocsEditable()
   @Experimental() // untriaged
-  num get expiration => _blink.BlinkMediaKeySession.instance.expiration_Getter_(unwrap_jso(this));
+  num get expiration => _blink.BlinkMediaKeySession.instance.expiration_Getter_(this);
   
   @DomName('MediaKeySession.keyStatuses')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaKeyStatusMap get keyStatuses => wrap_jso(_blink.BlinkMediaKeySession.instance.keyStatuses_Getter_(unwrap_jso(this)));
+  MediaKeyStatusMap get keyStatuses => _blink.BlinkMediaKeySession.instance.keyStatuses_Getter_(this);
   
   @DomName('MediaKeySession.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.BlinkMediaKeySession.instance.sessionId_Getter_(unwrap_jso(this));
+  String get sessionId => _blink.BlinkMediaKeySession.instance.sessionId_Getter_(this);
   
   @DomName('MediaKeySession.close')
   @DocsEditable()
-  Future close() => wrap_jso(_blink.BlinkMediaKeySession.instance.close_Callback_0_(unwrap_jso(this)));
+  Future close() => convertNativePromiseToDartFuture(_blink.BlinkMediaKeySession.instance.close_Callback_0_(this));
   
   @DomName('MediaKeySession.generateRequest')
   @DocsEditable()
   @Experimental() // untriaged
-  Future generateRequest(String initDataType, /*BufferSource*/ initData) => wrap_jso(_blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, initData));
+  Future generateRequest(String initDataType, /*BufferSource*/ initData) => convertNativePromiseToDartFuture(_blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(this, initDataType, initData));
   
   @DomName('MediaKeySession.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load(String sessionId) => wrap_jso(_blink.BlinkMediaKeySession.instance.load_Callback_1_(unwrap_jso(this), sessionId));
+  Future load(String sessionId) => convertNativePromiseToDartFuture(_blink.BlinkMediaKeySession.instance.load_Callback_1_(this, sessionId));
   
   @DomName('MediaKeySession.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  Future remove() => wrap_jso(_blink.BlinkMediaKeySession.instance.remove_Callback_0_(unwrap_jso(this)));
+  Future remove() => convertNativePromiseToDartFuture(_blink.BlinkMediaKeySession.instance.remove_Callback_0_(this));
   
   @DomName('MediaKeySession.update')
   @DocsEditable()
-  Future _update(/*BufferSource*/ response) => wrap_jso(_blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), response));
+  Future _update(/*BufferSource*/ response) => convertNativePromiseToDartFuture(_blink.BlinkMediaKeySession.instance.update_Callback_1_(this, response));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26609,25 +24951,17 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyStatusMap._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaKeyStatusMap internalCreateMediaKeyStatusMap() {
-    return new MediaKeyStatusMap._internalWrap();
-  }
 
-  factory MediaKeyStatusMap._internalWrap() {
-    return new MediaKeyStatusMap.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaKeyStatusMap.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaKeyStatusMap.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkMediaKeyStatusMap.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkMediaKeyStatusMap.instance.size_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26644,35 +24978,27 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeySystemAccess._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaKeySystemAccess internalCreateMediaKeySystemAccess() {
-    return new MediaKeySystemAccess._internalWrap();
-  }
 
-  factory MediaKeySystemAccess._internalWrap() {
-    return new MediaKeySystemAccess.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaKeySystemAccess.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaKeySystemAccess.keySystem')
   @DocsEditable()
   @Experimental() // untriaged
-  String get keySystem => _blink.BlinkMediaKeySystemAccess.instance.keySystem_Getter_(unwrap_jso(this));
+  String get keySystem => _blink.BlinkMediaKeySystemAccess.instance.keySystem_Getter_(this);
   
   @DomName('MediaKeySystemAccess.createMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future createMediaKeys() => wrap_jso(_blink.BlinkMediaKeySystemAccess.instance.createMediaKeys_Callback_0_(unwrap_jso(this)));
+  Future createMediaKeys() => convertNativePromiseToDartFuture(_blink.BlinkMediaKeySystemAccess.instance.createMediaKeys_Callback_0_(this));
   
   @DomName('MediaKeySystemAccess.getConfiguration')
   @DocsEditable()
   @Experimental() // untriaged
-   getConfiguration() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkMediaKeySystemAccess.instance.getConfiguration_Callback_0_(unwrap_jso(this))));
+   getConfiguration() => convertNativeDictionaryToDartDictionary((_blink.BlinkMediaKeySystemAccess.instance.getConfiguration_Callback_0_(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26690,32 +25016,24 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeys._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaKeys internalCreateMediaKeys() {
-    return new MediaKeys._internalWrap();
-  }
 
-  factory MediaKeys._internalWrap() {
-    return new MediaKeys.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaKeys.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   MediaKeySession _createSession([String sessionType]) {
     if (sessionType != null) {
-      return wrap_jso(_blink.BlinkMediaKeys.instance.createSession_Callback_1_(unwrap_jso(this), sessionType));
+      return _blink.BlinkMediaKeys.instance.createSession_Callback_1_(this, sessionType);
     }
-    return wrap_jso(_blink.BlinkMediaKeys.instance.createSession_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkMediaKeys.instance.createSession_Callback_0_(this);
   }
 
   @DomName('MediaKeys.setServerCertificate')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setServerCertificate(/*BufferSource*/ serverCertificate) => wrap_jso(_blink.BlinkMediaKeys.instance.setServerCertificate_Callback_1_(unwrap_jso(this), serverCertificate));
+  Future setServerCertificate(/*BufferSource*/ serverCertificate) => convertNativePromiseToDartFuture(_blink.BlinkMediaKeys.instance.setServerCertificate_Callback_1_(this, serverCertificate));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26732,44 +25050,36 @@
   // To suppress missing implicit constructor warnings.
   factory MediaList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MediaList internalCreateMediaList() {
-    return new MediaList._internalWrap();
-  }
 
-  factory MediaList._internalWrap() {
-    return new MediaList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaList.length')
   @DocsEditable()
-  int get length => _blink.BlinkMediaList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkMediaList.instance.length_Getter_(this);
   
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  String get mediaText => _blink.BlinkMediaList.instance.mediaText_Getter_(unwrap_jso(this));
+  String get mediaText => _blink.BlinkMediaList.instance.mediaText_Getter_(this);
   
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  set mediaText(String value) => _blink.BlinkMediaList.instance.mediaText_Setter_(unwrap_jso(this), value);
+  set mediaText(String value) => _blink.BlinkMediaList.instance.mediaText_Setter_(this, value);
   
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String medium) => _blink.BlinkMediaList.instance.appendMedium_Callback_1_(unwrap_jso(this), medium);
+  void appendMedium(String medium) => _blink.BlinkMediaList.instance.appendMedium_Callback_1_(this, medium);
   
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String medium) => _blink.BlinkMediaList.instance.deleteMedium_Callback_1_(unwrap_jso(this), medium);
+  void deleteMedium(String medium) => _blink.BlinkMediaList.instance.deleteMedium_Callback_1_(this, medium);
   
   @DomName('MediaList.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkMediaList.instance.item_Callback_1_(unwrap_jso(this), index);
+  String item(int index) => _blink.BlinkMediaList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26793,11 +25103,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaQueryList internalCreateMediaQueryList() {
-    return new MediaQueryList._internalWrap();
-  }
-
-  external factory MediaQueryList._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaQueryList.internal_() : super.internal_();
@@ -26805,19 +25111,19 @@
 
   @DomName('MediaQueryList.matches')
   @DocsEditable()
-  bool get matches => _blink.BlinkMediaQueryList.instance.matches_Getter_(unwrap_jso(this));
+  bool get matches => _blink.BlinkMediaQueryList.instance.matches_Getter_(this);
   
   @DomName('MediaQueryList.media')
   @DocsEditable()
-  String get media => _blink.BlinkMediaQueryList.instance.media_Getter_(unwrap_jso(this));
+  String get media => _blink.BlinkMediaQueryList.instance.media_Getter_(this);
   
   @DomName('MediaQueryList.addListener')
   @DocsEditable()
-  void addListener(EventListener listener) => _blink.BlinkMediaQueryList.instance.addListener_Callback_1_(unwrap_jso(this), unwrap_jso((event) => listener(wrap_jso(event))));
+  void addListener(EventListener listener) => _blink.BlinkMediaQueryList.instance.addListener_Callback_1_(this, listener);
   
   @DomName('MediaQueryList.removeListener')
   @DocsEditable()
-  void removeListener(EventListener listener) => _blink.BlinkMediaQueryList.instance.removeListener_Callback_1_(unwrap_jso(this), unwrap_jso(listener));
+  void removeListener(EventListener listener) => _blink.BlinkMediaQueryList.instance.removeListener_Callback_1_(this, listener);
   
   @DomName('MediaQueryList.onchange')
   @DocsEditable()
@@ -26844,18 +25150,14 @@
   factory MediaQueryListEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMediaQueryListEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMediaQueryListEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMediaQueryListEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMediaQueryListEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaQueryListEvent internalCreateMediaQueryListEvent() {
-    return new MediaQueryListEvent._internalWrap();
-  }
-
-  external factory MediaQueryListEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaQueryListEvent.internal_() : super.internal_();
@@ -26864,12 +25166,12 @@
   @DomName('MediaQueryListEvent.matches')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get matches => _blink.BlinkMediaQueryListEvent.instance.matches_Getter_(unwrap_jso(this));
+  bool get matches => _blink.BlinkMediaQueryListEvent.instance.matches_Getter_(this);
   
   @DomName('MediaQueryListEvent.media')
   @DocsEditable()
   @Experimental() // untriaged
-  String get media => _blink.BlinkMediaQueryListEvent.instance.media_Getter_(unwrap_jso(this));
+  String get media => _blink.BlinkMediaQueryListEvent.instance.media_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26889,33 +25191,25 @@
   @DomName('MediaSession.MediaSession')
   @DocsEditable()
   factory MediaSession() {
-    return wrap_jso(_blink.BlinkMediaSession.instance.constructorCallback_0_());
+    return _blink.BlinkMediaSession.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static MediaSession internalCreateMediaSession() {
-    return new MediaSession._internalWrap();
-  }
-
-  factory MediaSession._internalWrap() {
-    return new MediaSession.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaSession.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MediaSession.activate')
   @DocsEditable()
   @Experimental() // untriaged
-  void activate() => _blink.BlinkMediaSession.instance.activate_Callback_0_(unwrap_jso(this));
+  void activate() => _blink.BlinkMediaSession.instance.activate_Callback_0_(this);
   
   @DomName('MediaSession.deactivate')
   @DocsEditable()
   @Experimental() // untriaged
-  void deactivate() => _blink.BlinkMediaSession.instance.deactivate_Callback_0_(unwrap_jso(this));
+  void deactivate() => _blink.BlinkMediaSession.instance.deactivate_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26938,16 +25232,12 @@
   @DomName('MediaSource.MediaSource')
   @DocsEditable()
   factory MediaSource() {
-    return wrap_jso(_blink.BlinkMediaSource.instance.constructorCallback_0_());
+    return _blink.BlinkMediaSource.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaSource internalCreateMediaSource() {
-    return new MediaSource._internalWrap();
-  }
-
-  external factory MediaSource._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaSource.internal_() : super.internal_();
@@ -26958,34 +25248,34 @@
 
   @DomName('MediaSource.activeSourceBuffers')
   @DocsEditable()
-  SourceBufferList get activeSourceBuffers => wrap_jso(_blink.BlinkMediaSource.instance.activeSourceBuffers_Getter_(unwrap_jso(this)));
+  SourceBufferList get activeSourceBuffers => _blink.BlinkMediaSource.instance.activeSourceBuffers_Getter_(this);
   
   @DomName('MediaSource.duration')
   @DocsEditable()
-  num get duration => _blink.BlinkMediaSource.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkMediaSource.instance.duration_Getter_(this);
   
   @DomName('MediaSource.duration')
   @DocsEditable()
-  set duration(num value) => _blink.BlinkMediaSource.instance.duration_Setter_(unwrap_jso(this), value);
+  set duration(num value) => _blink.BlinkMediaSource.instance.duration_Setter_(this, value);
   
   @DomName('MediaSource.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkMediaSource.instance.readyState_Getter_(unwrap_jso(this));
+  String get readyState => _blink.BlinkMediaSource.instance.readyState_Getter_(this);
   
   @DomName('MediaSource.sourceBuffers')
   @DocsEditable()
-  SourceBufferList get sourceBuffers => wrap_jso(_blink.BlinkMediaSource.instance.sourceBuffers_Getter_(unwrap_jso(this)));
+  SourceBufferList get sourceBuffers => _blink.BlinkMediaSource.instance.sourceBuffers_Getter_(this);
   
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
-  SourceBuffer addSourceBuffer(String type) => wrap_jso(_blink.BlinkMediaSource.instance.addSourceBuffer_Callback_1_(unwrap_jso(this), type));
+  SourceBuffer addSourceBuffer(String type) => _blink.BlinkMediaSource.instance.addSourceBuffer_Callback_1_(this, type);
   
   void endOfStream([String error]) {
     if (error != null) {
-      _blink.BlinkMediaSource.instance.endOfStream_Callback_1_(unwrap_jso(this), error);
+      _blink.BlinkMediaSource.instance.endOfStream_Callback_1_(this, error);
       return;
     }
-    _blink.BlinkMediaSource.instance.endOfStream_Callback_0_(unwrap_jso(this));
+    _blink.BlinkMediaSource.instance.endOfStream_Callback_0_(this);
     return;
   }
 
@@ -26995,7 +25285,7 @@
   
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
-  void removeSourceBuffer(SourceBuffer buffer) => _blink.BlinkMediaSource.instance.removeSourceBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  void removeSourceBuffer(SourceBuffer buffer) => _blink.BlinkMediaSource.instance.removeSourceBuffer_Callback_1_(this, buffer);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27045,24 +25335,20 @@
   @DocsEditable()
   factory MediaStream([stream_OR_tracks]) {
     if (stream_OR_tracks == null) {
-      return wrap_jso(_blink.BlinkMediaStream.instance.constructorCallback_0_());
+      return _blink.BlinkMediaStream.instance.constructorCallback_0_();
     }
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
-      return wrap_jso(_blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks));
+      return _blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks);
     }
     if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
-      return wrap_jso(_blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks));
+      return _blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaStream internalCreateMediaStream() {
-    return new MediaStream._internalWrap();
-  }
-
-  external factory MediaStream._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaStream.internal_() : super.internal_();
@@ -27071,54 +25357,54 @@
   @DomName('MediaStream.active')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get active => _blink.BlinkMediaStream.instance.active_Getter_(unwrap_jso(this));
+  bool get active => _blink.BlinkMediaStream.instance.active_Getter_(this);
   
   @DomName('MediaStream.ended')
   @DocsEditable()
-  bool get ended => _blink.BlinkMediaStream.instance.ended_Getter_(unwrap_jso(this));
+  bool get ended => _blink.BlinkMediaStream.instance.ended_Getter_(this);
   
   @DomName('MediaStream.id')
   @DocsEditable()
-  String get id => _blink.BlinkMediaStream.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkMediaStream.instance.id_Getter_(this);
   
   @DomName('MediaStream.label')
   @DocsEditable()
   @Experimental() // non-standard
-  String get label => _blink.BlinkMediaStream.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkMediaStream.instance.label_Getter_(this);
   
   @DomName('MediaStream.addTrack')
   @DocsEditable()
-  void addTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.instance.addTrack_Callback_1_(unwrap_jso(this), unwrap_jso(track));
+  void addTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.instance.addTrack_Callback_1_(this, track);
   
   @DomName('MediaStream.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaStream clone() => wrap_jso(_blink.BlinkMediaStream.instance.clone_Callback_0_(unwrap_jso(this)));
+  MediaStream clone() => _blink.BlinkMediaStream.instance.clone_Callback_0_(this);
   
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getAudioTracks() => wrap_jso(_blink.BlinkMediaStream.instance.getAudioTracks_Callback_0_(unwrap_jso(this)));
+  List<MediaStreamTrack> getAudioTracks() => (_blink.BlinkMediaStream.instance.getAudioTracks_Callback_0_(this));
   
   @DomName('MediaStream.getTrackById')
   @DocsEditable()
-  MediaStreamTrack getTrackById(String trackId) => wrap_jso(_blink.BlinkMediaStream.instance.getTrackById_Callback_1_(unwrap_jso(this), trackId));
+  MediaStreamTrack getTrackById(String trackId) => _blink.BlinkMediaStream.instance.getTrackById_Callback_1_(this, trackId);
   
   @DomName('MediaStream.getTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  List<MediaStreamTrack> getTracks() => wrap_jso(_blink.BlinkMediaStream.instance.getTracks_Callback_0_(unwrap_jso(this)));
+  List<MediaStreamTrack> getTracks() => (_blink.BlinkMediaStream.instance.getTracks_Callback_0_(this));
   
   @DomName('MediaStream.getVideoTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getVideoTracks() => wrap_jso(_blink.BlinkMediaStream.instance.getVideoTracks_Callback_0_(unwrap_jso(this)));
+  List<MediaStreamTrack> getVideoTracks() => (_blink.BlinkMediaStream.instance.getVideoTracks_Callback_0_(this));
   
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
-  void removeTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.instance.removeTrack_Callback_1_(unwrap_jso(this), unwrap_jso(track));
+  void removeTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.instance.removeTrack_Callback_1_(this, track);
   
   @DomName('MediaStream.stop')
   @DocsEditable()
-  void stop() => _blink.BlinkMediaStream.instance.stop_Callback_0_(unwrap_jso(this));
+  void stop() => _blink.BlinkMediaStream.instance.stop_Callback_0_(this);
   
   /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
@@ -27166,18 +25452,14 @@
   factory MediaStreamEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMediaStreamEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMediaStreamEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMediaStreamEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMediaStreamEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MediaStreamEvent internalCreateMediaStreamEvent() {
-    return new MediaStreamEvent._internalWrap();
-  }
-
-  external factory MediaStreamEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaStreamEvent.internal_() : super.internal_();
@@ -27188,7 +25470,7 @@
 
   @DomName('MediaStreamEvent.stream')
   @DocsEditable()
-  MediaStream get stream => wrap_jso(_blink.BlinkMediaStreamEvent.instance.stream_Getter_(unwrap_jso(this)));
+  MediaStream get stream => _blink.BlinkMediaStreamEvent.instance.stream_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27239,11 +25521,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaStreamTrack internalCreateMediaStreamTrack() {
-    return new MediaStreamTrack._internalWrap();
-  }
-
-  external factory MediaStreamTrack._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaStreamTrack.internal_() : super.internal_();
@@ -27251,42 +25529,42 @@
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  bool get enabled => _blink.BlinkMediaStreamTrack.instance.enabled_Getter_(unwrap_jso(this));
+  bool get enabled => _blink.BlinkMediaStreamTrack.instance.enabled_Getter_(this);
   
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  set enabled(bool value) => _blink.BlinkMediaStreamTrack.instance.enabled_Setter_(unwrap_jso(this), value);
+  set enabled(bool value) => _blink.BlinkMediaStreamTrack.instance.enabled_Setter_(this, value);
   
   @DomName('MediaStreamTrack.id')
   @DocsEditable()
-  String get id => _blink.BlinkMediaStreamTrack.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkMediaStreamTrack.instance.id_Getter_(this);
   
   @DomName('MediaStreamTrack.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkMediaStreamTrack.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkMediaStreamTrack.instance.kind_Getter_(this);
   
   @DomName('MediaStreamTrack.label')
   @DocsEditable()
-  String get label => _blink.BlinkMediaStreamTrack.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkMediaStreamTrack.instance.label_Getter_(this);
   
   @DomName('MediaStreamTrack.muted')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get muted => _blink.BlinkMediaStreamTrack.instance.muted_Getter_(unwrap_jso(this));
+  bool get muted => _blink.BlinkMediaStreamTrack.instance.muted_Getter_(this);
   
   @DomName('MediaStreamTrack.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkMediaStreamTrack.instance.readyState_Getter_(unwrap_jso(this));
+  String get readyState => _blink.BlinkMediaStreamTrack.instance.readyState_Getter_(this);
   
   @DomName('MediaStreamTrack.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaStreamTrack clone() => wrap_jso(_blink.BlinkMediaStreamTrack.instance.clone_Callback_0_(unwrap_jso(this)));
+  MediaStreamTrack clone() => _blink.BlinkMediaStreamTrack.instance.clone_Callback_0_(this);
   
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.instance.getSources_Callback_1_(unwrap_jso((sources) => callback(sources)));
+  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.instance.getSources_Callback_1_(callback);
   
   static Future<List<SourceInfo>> getSources() {
     var completer = new Completer<List<SourceInfo>>();
@@ -27298,7 +25576,7 @@
   @DomName('MediaStreamTrack.stop')
   @DocsEditable()
   @Experimental() // untriaged
-  void stop() => _blink.BlinkMediaStreamTrack.instance.stop_Callback_0_(unwrap_jso(this));
+  void stop() => _blink.BlinkMediaStreamTrack.instance.stop_Callback_0_(this);
   
   /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
@@ -27334,11 +25612,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaStreamTrackEvent internalCreateMediaStreamTrackEvent() {
-    return new MediaStreamTrackEvent._internalWrap();
-  }
-
-  external factory MediaStreamTrackEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaStreamTrackEvent.internal_() : super.internal_();
@@ -27349,7 +25623,7 @@
 
   @DomName('MediaStreamTrackEvent.track')
   @DocsEditable()
-  MediaStreamTrack get track => wrap_jso(_blink.BlinkMediaStreamTrackEvent.instance.track_Getter_(unwrap_jso(this)));
+  MediaStreamTrack get track => _blink.BlinkMediaStreamTrackEvent.instance.track_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27376,32 +25650,24 @@
   // To suppress missing implicit constructor warnings.
   factory MemoryInfo._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MemoryInfo internalCreateMemoryInfo() {
-    return new MemoryInfo._internalWrap();
-  }
 
-  factory MemoryInfo._internalWrap() {
-    return new MemoryInfo.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MemoryInfo.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MemoryInfo.jsHeapSizeLimit')
   @DocsEditable()
-  int get jsHeapSizeLimit => _blink.BlinkMemoryInfo.instance.jsHeapSizeLimit_Getter_(unwrap_jso(this));
+  int get jsHeapSizeLimit => _blink.BlinkMemoryInfo.instance.jsHeapSizeLimit_Getter_(this);
   
   @DomName('MemoryInfo.totalJSHeapSize')
   @DocsEditable()
-  int get totalJSHeapSize => _blink.BlinkMemoryInfo.instance.totalJSHeapSize_Getter_(unwrap_jso(this));
+  int get totalJSHeapSize => _blink.BlinkMemoryInfo.instance.totalJSHeapSize_Getter_(this);
   
   @DomName('MemoryInfo.usedJSHeapSize')
   @DocsEditable()
-  int get usedJSHeapSize => _blink.BlinkMemoryInfo.instance.usedJSHeapSize_Getter_(unwrap_jso(this));
+  int get usedJSHeapSize => _blink.BlinkMemoryInfo.instance.usedJSHeapSize_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27433,11 +25699,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MenuElement internalCreateMenuElement() {
-    return new MenuElement._internalWrap();
-  }
-
-  external factory MenuElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MenuElement.internal_() : super.internal_();
@@ -27452,22 +25714,22 @@
   @DomName('HTMLMenuElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkHTMLMenuElement.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkHTMLMenuElement.instance.label_Getter_(this);
   
   @DomName('HTMLMenuElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  set label(String value) => _blink.BlinkHTMLMenuElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLMenuElement.instance.label_Setter_(this, value);
   
   @DomName('HTMLMenuElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkHTMLMenuElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLMenuElement.instance.type_Getter_(this);
   
   @DomName('HTMLMenuElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  set type(String value) => _blink.BlinkHTMLMenuElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLMenuElement.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27486,11 +25748,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MenuItemElement internalCreateMenuItemElement() {
-    return new MenuItemElement._internalWrap();
-  }
-
-  external factory MenuItemElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MenuItemElement.internal_() : super.internal_();
@@ -27505,72 +25763,72 @@
   @DomName('HTMLMenuItemElement.checked')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get checked => _blink.BlinkHTMLMenuItemElement.instance.checked_Getter_(unwrap_jso(this));
+  bool get checked => _blink.BlinkHTMLMenuItemElement.instance.checked_Getter_(this);
   
   @DomName('HTMLMenuItemElement.checked')
   @DocsEditable()
   @Experimental() // untriaged
-  set checked(bool value) => _blink.BlinkHTMLMenuItemElement.instance.checked_Setter_(unwrap_jso(this), value);
+  set checked(bool value) => _blink.BlinkHTMLMenuItemElement.instance.checked_Setter_(this, value);
   
   @DomName('HTMLMenuItemElement.default')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get defaultValue => _blink.BlinkHTMLMenuItemElement.instance.default_Getter_(unwrap_jso(this));
+  bool get defaultValue => _blink.BlinkHTMLMenuItemElement.instance.default_Getter_(this);
   
   @DomName('HTMLMenuItemElement.default')
   @DocsEditable()
   @Experimental() // untriaged
-  set defaultValue(bool value) => _blink.BlinkHTMLMenuItemElement.instance.default_Setter_(unwrap_jso(this), value);
+  set defaultValue(bool value) => _blink.BlinkHTMLMenuItemElement.instance.default_Setter_(this, value);
   
   @DomName('HTMLMenuItemElement.disabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get disabled => _blink.BlinkHTMLMenuItemElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLMenuItemElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLMenuItemElement.disabled')
   @DocsEditable()
   @Experimental() // untriaged
-  set disabled(bool value) => _blink.BlinkHTMLMenuItemElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLMenuItemElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLMenuItemElement.icon')
   @DocsEditable()
   @Experimental() // untriaged
-  String get icon => _blink.BlinkHTMLMenuItemElement.instance.icon_Getter_(unwrap_jso(this));
+  String get icon => _blink.BlinkHTMLMenuItemElement.instance.icon_Getter_(this);
   
   @DomName('HTMLMenuItemElement.icon')
   @DocsEditable()
   @Experimental() // untriaged
-  set icon(String value) => _blink.BlinkHTMLMenuItemElement.instance.icon_Setter_(unwrap_jso(this), value);
+  set icon(String value) => _blink.BlinkHTMLMenuItemElement.instance.icon_Setter_(this, value);
   
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkHTMLMenuItemElement.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkHTMLMenuItemElement.instance.label_Getter_(this);
   
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  set label(String value) => _blink.BlinkHTMLMenuItemElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLMenuItemElement.instance.label_Setter_(this, value);
   
   @DomName('HTMLMenuItemElement.radiogroup')
   @DocsEditable()
   @Experimental() // untriaged
-  String get radiogroup => _blink.BlinkHTMLMenuItemElement.instance.radiogroup_Getter_(unwrap_jso(this));
+  String get radiogroup => _blink.BlinkHTMLMenuItemElement.instance.radiogroup_Getter_(this);
   
   @DomName('HTMLMenuItemElement.radiogroup')
   @DocsEditable()
   @Experimental() // untriaged
-  set radiogroup(String value) => _blink.BlinkHTMLMenuItemElement.instance.radiogroup_Setter_(unwrap_jso(this), value);
+  set radiogroup(String value) => _blink.BlinkHTMLMenuItemElement.instance.radiogroup_Setter_(this, value);
   
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkHTMLMenuItemElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLMenuItemElement.instance.type_Getter_(this);
   
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  set type(String value) => _blink.BlinkHTMLMenuItemElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLMenuItemElement.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27587,28 +25845,20 @@
   // To suppress missing implicit constructor warnings.
   factory MessageChannel._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MessageChannel internalCreateMessageChannel() {
-    return new MessageChannel._internalWrap();
-  }
 
-  factory MessageChannel._internalWrap() {
-    return new MessageChannel.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MessageChannel.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MessageChannel.port1')
   @DocsEditable()
-  MessagePort get port1 => wrap_jso(_blink.BlinkMessageChannel.instance.port1_Getter_(unwrap_jso(this)));
+  MessagePort get port1 => _blink.BlinkMessageChannel.instance.port1_Getter_(this);
   
   @DomName('MessageChannel.port2')
   @DocsEditable()
-  MessagePort get port2 => wrap_jso(_blink.BlinkMessageChannel.instance.port2_Getter_(unwrap_jso(this)));
+  MessagePort get port2 => _blink.BlinkMessageChannel.instance.port2_Getter_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27639,7 +25889,7 @@
   @DomName('MessageEvent.data')
   @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(
-      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+      _blink.BlinkMessageEvent.instance.data_Getter_(this));
 
 
 
@@ -27648,18 +25898,14 @@
   factory MessageEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMessageEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMessageEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MessageEvent internalCreateMessageEvent() {
-    return new MessageEvent._internalWrap();
-  }
-
-  external factory MessageEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MessageEvent.internal_() : super.internal_();
@@ -27668,19 +25914,19 @@
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
   @Unstable()
-  String get lastEventId => _blink.BlinkMessageEvent.instance.lastEventId_Getter_(unwrap_jso(this));
+  String get lastEventId => _blink.BlinkMessageEvent.instance.lastEventId_Getter_(this);
   
   @DomName('MessageEvent.origin')
   @DocsEditable()
-  String get origin => _blink.BlinkMessageEvent.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkMessageEvent.instance.origin_Getter_(this);
   
   @DomName('MessageEvent.source')
   @DocsEditable()
-  EventTarget get source => wrap_jso(_blink.BlinkMessageEvent.instance.source_Getter_(unwrap_jso(this)));
+  EventTarget get source => _blink.BlinkMessageEvent.instance.source_Getter_(this);
   
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> portsArg) => _blink.BlinkMessageEvent.instance.initMessageEvent_Callback_8_(unwrap_jso(this), typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, unwrap_jso(sourceArg), unwrap_jso(portsArg));
+  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> portsArg) => _blink.BlinkMessageEvent.instance.initMessageEvent_Callback_8_(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, portsArg);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27709,11 +25955,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MessagePort internalCreateMessagePort() {
-    return new MessagePort._internalWrap();
-  }
-
-  external factory MessagePort._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MessagePort.internal_() : super.internal_();
@@ -27721,20 +25963,20 @@
 
   @DomName('MessagePort.close')
   @DocsEditable()
-  void close() => _blink.BlinkMessagePort.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkMessagePort.instance.close_Callback_0_(this);
   
   void postMessage(Object message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkMessagePort.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkMessagePort.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkMessagePort.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkMessagePort.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
   @DomName('MessagePort.start')
   @DocsEditable()
-  void start() => _blink.BlinkMessagePort.instance.start_Callback_0_(unwrap_jso(this));
+  void start() => _blink.BlinkMessagePort.instance.start_Callback_0_(this);
   
   /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
@@ -27761,11 +26003,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MetaElement internalCreateMetaElement() {
-    return new MetaElement._internalWrap();
-  }
-
-  external factory MetaElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MetaElement.internal_() : super.internal_();
@@ -27779,27 +26017,27 @@
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  String get content => _blink.BlinkHTMLMetaElement.instance.content_Getter_(unwrap_jso(this));
+  String get content => _blink.BlinkHTMLMetaElement.instance.content_Getter_(this);
   
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  set content(String value) => _blink.BlinkHTMLMetaElement.instance.content_Setter_(unwrap_jso(this), value);
+  set content(String value) => _blink.BlinkHTMLMetaElement.instance.content_Setter_(this, value);
   
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  String get httpEquiv => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Getter_(unwrap_jso(this));
+  String get httpEquiv => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Getter_(this);
   
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Setter_(unwrap_jso(this), value);
+  set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Setter_(this, value);
   
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLMetaElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLMetaElement.instance.name_Getter_(this);
   
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLMetaElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLMetaElement.instance.name_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27817,28 +26055,20 @@
   // To suppress missing implicit constructor warnings.
   factory Metadata._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Metadata internalCreateMetadata() {
-    return new Metadata._internalWrap();
-  }
 
-  factory Metadata._internalWrap() {
-    return new Metadata.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Metadata.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Metadata.modificationTime')
   @DocsEditable()
-  DateTime get modificationTime => _blink.BlinkMetadata.instance.modificationTime_Getter_(unwrap_jso(this));
+  DateTime get modificationTime => _blink.BlinkMetadata.instance.modificationTime_Getter_(this);
   
   @DomName('Metadata.size')
   @DocsEditable()
-  int get size => _blink.BlinkMetadata.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkMetadata.instance.size_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27875,11 +26105,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MeterElement internalCreateMeterElement() {
-    return new MeterElement._internalWrap();
-  }
-
-  external factory MeterElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MeterElement.internal_() : super.internal_();
@@ -27896,56 +26122,56 @@
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  num get high => _blink.BlinkHTMLMeterElement.instance.high_Getter_(unwrap_jso(this));
+  num get high => _blink.BlinkHTMLMeterElement.instance.high_Getter_(this);
   
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  set high(num value) => _blink.BlinkHTMLMeterElement.instance.high_Setter_(unwrap_jso(this), value);
+  set high(num value) => _blink.BlinkHTMLMeterElement.instance.high_Setter_(this, value);
   
   @DomName('HTMLMeterElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLMeterElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLMeterElement.instance.labels_Getter_(this));
   
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  num get low => _blink.BlinkHTMLMeterElement.instance.low_Getter_(unwrap_jso(this));
+  num get low => _blink.BlinkHTMLMeterElement.instance.low_Getter_(this);
   
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  set low(num value) => _blink.BlinkHTMLMeterElement.instance.low_Setter_(unwrap_jso(this), value);
+  set low(num value) => _blink.BlinkHTMLMeterElement.instance.low_Setter_(this, value);
   
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  num get max => _blink.BlinkHTMLMeterElement.instance.max_Getter_(unwrap_jso(this));
+  num get max => _blink.BlinkHTMLMeterElement.instance.max_Getter_(this);
   
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  set max(num value) => _blink.BlinkHTMLMeterElement.instance.max_Setter_(unwrap_jso(this), value);
+  set max(num value) => _blink.BlinkHTMLMeterElement.instance.max_Setter_(this, value);
   
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  num get min => _blink.BlinkHTMLMeterElement.instance.min_Getter_(unwrap_jso(this));
+  num get min => _blink.BlinkHTMLMeterElement.instance.min_Getter_(this);
   
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  set min(num value) => _blink.BlinkHTMLMeterElement.instance.min_Setter_(unwrap_jso(this), value);
+  set min(num value) => _blink.BlinkHTMLMeterElement.instance.min_Setter_(this, value);
   
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  num get optimum => _blink.BlinkHTMLMeterElement.instance.optimum_Getter_(unwrap_jso(this));
+  num get optimum => _blink.BlinkHTMLMeterElement.instance.optimum_Getter_(this);
   
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  set optimum(num value) => _blink.BlinkHTMLMeterElement.instance.optimum_Setter_(unwrap_jso(this), value);
+  set optimum(num value) => _blink.BlinkHTMLMeterElement.instance.optimum_Setter_(this, value);
   
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  num get value => _blink.BlinkHTMLMeterElement.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkHTMLMeterElement.instance.value_Getter_(this);
   
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  set value(num value) => _blink.BlinkHTMLMeterElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkHTMLMeterElement.instance.value_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27965,11 +26191,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MidiAccess internalCreateMidiAccess() {
-    return new MidiAccess._internalWrap();
-  }
-
-  external factory MidiAccess._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiAccess.internal_() : super.internal_();
@@ -27977,16 +26199,16 @@
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
-  MidiInputMap get inputs => wrap_jso(_blink.BlinkMIDIAccess.instance.inputs_Getter_(unwrap_jso(this)));
+  MidiInputMap get inputs => _blink.BlinkMIDIAccess.instance.inputs_Getter_(this);
   
   @DomName('MIDIAccess.outputs')
   @DocsEditable()
-  MidiOutputMap get outputs => wrap_jso(_blink.BlinkMIDIAccess.instance.outputs_Getter_(unwrap_jso(this)));
+  MidiOutputMap get outputs => _blink.BlinkMIDIAccess.instance.outputs_Getter_(this);
   
   @DomName('MIDIAccess.sysexEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get sysexEnabled => _blink.BlinkMIDIAccess.instance.sysexEnabled_Getter_(unwrap_jso(this));
+  bool get sysexEnabled => _blink.BlinkMIDIAccess.instance.sysexEnabled_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28009,18 +26231,14 @@
   factory MidiConnectionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMIDIConnectionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMIDIConnectionEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMIDIConnectionEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMIDIConnectionEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MidiConnectionEvent internalCreateMidiConnectionEvent() {
-    return new MidiConnectionEvent._internalWrap();
-  }
-
-  external factory MidiConnectionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiConnectionEvent.internal_() : super.internal_();
@@ -28028,7 +26246,7 @@
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
-  MidiPort get port => wrap_jso(_blink.BlinkMIDIConnectionEvent.instance.port_Getter_(unwrap_jso(this)));
+  MidiPort get port => _blink.BlinkMIDIConnectionEvent.instance.port_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28058,11 +26276,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MidiInput internalCreateMidiInput() {
-    return new MidiInput._internalWrap();
-  }
-
-  external factory MidiInput._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiInput.internal_() : super.internal_();
@@ -28088,25 +26302,17 @@
   // To suppress missing implicit constructor warnings.
   factory MidiInputMap._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MidiInputMap internalCreateMidiInputMap() {
-    return new MidiInputMap._internalWrap();
-  }
 
-  factory MidiInputMap._internalWrap() {
-    return new MidiInputMap.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiInputMap.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MIDIInputMap.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkMIDIInputMap.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkMIDIInputMap.instance.size_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28129,18 +26335,14 @@
   factory MidiMessageEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMIDIMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMIDIMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMIDIMessageEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMIDIMessageEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MidiMessageEvent internalCreateMidiMessageEvent() {
-    return new MidiMessageEvent._internalWrap();
-  }
-
-  external factory MidiMessageEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiMessageEvent.internal_() : super.internal_();
@@ -28148,11 +26350,11 @@
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
-  Uint8List get data => wrap_jso(_blink.BlinkMIDIMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+  Uint8List get data => _blink.BlinkMIDIMessageEvent.instance.data_Getter_(this);
   
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  num get receivedTime => _blink.BlinkMIDIMessageEvent.instance.receivedTime_Getter_(unwrap_jso(this));
+  num get receivedTime => _blink.BlinkMIDIMessageEvent.instance.receivedTime_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28172,11 +26374,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MidiOutput internalCreateMidiOutput() {
-    return new MidiOutput._internalWrap();
-  }
-
-  external factory MidiOutput._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiOutput.internal_() : super.internal_();
@@ -28184,10 +26382,10 @@
 
   void send(Uint8List data, [num timestamp]) {
     if (timestamp != null) {
-      _blink.BlinkMIDIOutput.instance.send_Callback_2_(unwrap_jso(this), unwrap_jso(data), timestamp);
+      _blink.BlinkMIDIOutput.instance.send_Callback_2_(this, data, timestamp);
       return;
     }
-    _blink.BlinkMIDIOutput.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+    _blink.BlinkMIDIOutput.instance.send_Callback_1_(this, data);
     return;
   }
 
@@ -28206,25 +26404,17 @@
   // To suppress missing implicit constructor warnings.
   factory MidiOutputMap._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MidiOutputMap internalCreateMidiOutputMap() {
-    return new MidiOutputMap._internalWrap();
-  }
 
-  factory MidiOutputMap._internalWrap() {
-    return new MidiOutputMap.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiOutputMap.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MIDIOutputMap.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkMIDIOutputMap.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkMIDIOutputMap.instance.size_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28244,11 +26434,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MidiPort internalCreateMidiPort() {
-    return new MidiPort._internalWrap();
-  }
-
-  external factory MidiPort._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MidiPort.internal_() : super.internal_();
@@ -28257,42 +26443,42 @@
   @DomName('MIDIPort.connection')
   @DocsEditable()
   @Experimental() // untriaged
-  String get connection => _blink.BlinkMIDIPort.instance.connection_Getter_(unwrap_jso(this));
+  String get connection => _blink.BlinkMIDIPort.instance.connection_Getter_(this);
   
   @DomName('MIDIPort.id')
   @DocsEditable()
-  String get id => _blink.BlinkMIDIPort.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkMIDIPort.instance.id_Getter_(this);
   
   @DomName('MIDIPort.manufacturer')
   @DocsEditable()
-  String get manufacturer => _blink.BlinkMIDIPort.instance.manufacturer_Getter_(unwrap_jso(this));
+  String get manufacturer => _blink.BlinkMIDIPort.instance.manufacturer_Getter_(this);
   
   @DomName('MIDIPort.name')
   @DocsEditable()
-  String get name => _blink.BlinkMIDIPort.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkMIDIPort.instance.name_Getter_(this);
   
   @DomName('MIDIPort.state')
   @DocsEditable()
   @Experimental() // untriaged
-  String get state => _blink.BlinkMIDIPort.instance.state_Getter_(unwrap_jso(this));
+  String get state => _blink.BlinkMIDIPort.instance.state_Getter_(this);
   
   @DomName('MIDIPort.type')
   @DocsEditable()
-  String get type => _blink.BlinkMIDIPort.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkMIDIPort.instance.type_Getter_(this);
   
   @DomName('MIDIPort.version')
   @DocsEditable()
-  String get version => _blink.BlinkMIDIPort.instance.version_Getter_(unwrap_jso(this));
+  String get version => _blink.BlinkMIDIPort.instance.version_Getter_(this);
   
   @DomName('MIDIPort.close')
   @DocsEditable()
   @Experimental() // untriaged
-  Future close() => wrap_jso(_blink.BlinkMIDIPort.instance.close_Callback_0_(unwrap_jso(this)));
+  Future close() => convertNativePromiseToDartFuture(_blink.BlinkMIDIPort.instance.close_Callback_0_(this));
   
   @DomName('MIDIPort.open')
   @DocsEditable()
   @Experimental() // untriaged
-  Future open() => wrap_jso(_blink.BlinkMIDIPort.instance.open_Callback_0_(unwrap_jso(this)));
+  Future open() => convertNativePromiseToDartFuture(_blink.BlinkMIDIPort.instance.open_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28309,36 +26495,28 @@
   // To suppress missing implicit constructor warnings.
   factory MimeType._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MimeType internalCreateMimeType() {
-    return new MimeType._internalWrap();
-  }
 
-  factory MimeType._internalWrap() {
-    return new MimeType.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MimeType.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MimeType.description')
   @DocsEditable()
-  String get description => _blink.BlinkMimeType.instance.description_Getter_(unwrap_jso(this));
+  String get description => _blink.BlinkMimeType.instance.description_Getter_(this);
   
   @DomName('MimeType.enabledPlugin')
   @DocsEditable()
-  Plugin get enabledPlugin => wrap_jso(_blink.BlinkMimeType.instance.enabledPlugin_Getter_(unwrap_jso(this)));
+  Plugin get enabledPlugin => _blink.BlinkMimeType.instance.enabledPlugin_Getter_(this);
   
   @DomName('MimeType.suffixes')
   @DocsEditable()
-  String get suffixes => _blink.BlinkMimeType.instance.suffixes_Getter_(unwrap_jso(this));
+  String get suffixes => _blink.BlinkMimeType.instance.suffixes_Getter_(this);
   
   @DomName('MimeType.type')
   @DocsEditable()
-  String get type => _blink.BlinkMimeType.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkMimeType.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28355,32 +26533,24 @@
   // To suppress missing implicit constructor warnings.
   factory MimeTypeArray._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MimeTypeArray internalCreateMimeTypeArray() {
-    return new MimeTypeArray._internalWrap();
-  }
 
-  factory MimeTypeArray._internalWrap() {
-    return new MimeTypeArray.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MimeTypeArray.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MimeTypeArray.length')
   @DocsEditable()
-  int get length => _blink.BlinkMimeTypeArray.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkMimeTypeArray.instance.length_Getter_(this);
   
   MimeType operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkMimeTypeArray.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  MimeType _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkMimeTypeArray.instance.item_Callback_1_(unwrap_jso(this), index));
+  MimeType _nativeIndexedGetter(int index) => (_blink.BlinkMimeTypeArray.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -28422,14 +26592,14 @@
 
   @DomName('MimeTypeArray.item')
   @DocsEditable()
-  MimeType item(int index) => wrap_jso(_blink.BlinkMimeTypeArray.instance.item_Callback_1_(unwrap_jso(this), index));
+  MimeType item(int index) => _blink.BlinkMimeTypeArray.instance.item_Callback_1_(this, index);
   
   MimeType namedItem(String name) {
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(this, name);
     }
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(this, name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -28451,11 +26621,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ModElement internalCreateModElement() {
-    return new ModElement._internalWrap();
-  }
-
-  external factory ModElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ModElement.internal_() : super.internal_();
@@ -28469,19 +26635,19 @@
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  String get cite => _blink.BlinkHTMLModElement.instance.cite_Getter_(unwrap_jso(this));
+  String get cite => _blink.BlinkHTMLModElement.instance.cite_Getter_(this);
   
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  set cite(String value) => _blink.BlinkHTMLModElement.instance.cite_Setter_(unwrap_jso(this), value);
+  set cite(String value) => _blink.BlinkHTMLModElement.instance.cite_Setter_(this, value);
   
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  String get dateTime => _blink.BlinkHTMLModElement.instance.dateTime_Getter_(unwrap_jso(this));
+  String get dateTime => _blink.BlinkHTMLModElement.instance.dateTime_Getter_(this);
   
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  set dateTime(String value) => _blink.BlinkHTMLModElement.instance.dateTime_Setter_(unwrap_jso(this), value);
+  set dateTime(String value) => _blink.BlinkHTMLModElement.instance.dateTime_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28514,18 +26680,14 @@
   factory MouseEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkMouseEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkMouseEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkMouseEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkMouseEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static MouseEvent internalCreateMouseEvent() {
-    return new MouseEvent._internalWrap();
-  }
-
-  external factory MouseEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MouseEvent.internal_() : super.internal_();
@@ -28533,33 +26695,33 @@
 
   @DomName('MouseEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.BlinkMouseEvent.instance.altKey_Getter_(unwrap_jso(this));
+  bool get altKey => _blink.BlinkMouseEvent.instance.altKey_Getter_(this);
   
   @DomName('MouseEvent.button')
   @DocsEditable()
-  int get button => _blink.BlinkMouseEvent.instance.button_Getter_(unwrap_jso(this));
+  int get button => _blink.BlinkMouseEvent.instance.button_Getter_(this);
   
   @DomName('MouseEvent.buttons')
   @DocsEditable()
   @Experimental() // untriaged
-  int get buttons => _blink.BlinkMouseEvent.instance.buttons_Getter_(unwrap_jso(this));
+  int get buttons => _blink.BlinkMouseEvent.instance.buttons_Getter_(this);
   
   @DomName('MouseEvent.clientX')
   @DocsEditable()
-  int get _clientX => _blink.BlinkMouseEvent.instance.clientX_Getter_(unwrap_jso(this));
+  int get _clientX => _blink.BlinkMouseEvent.instance.clientX_Getter_(this);
   
   @DomName('MouseEvent.clientY')
   @DocsEditable()
-  int get _clientY => _blink.BlinkMouseEvent.instance.clientY_Getter_(unwrap_jso(this));
+  int get _clientY => _blink.BlinkMouseEvent.instance.clientY_Getter_(this);
   
   @DomName('MouseEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.BlinkMouseEvent.instance.ctrlKey_Getter_(unwrap_jso(this));
+  bool get ctrlKey => _blink.BlinkMouseEvent.instance.ctrlKey_Getter_(this);
   
   @DomName('MouseEvent.dataTransfer')
   @DocsEditable()
   @Unstable()
-  DataTransfer get dataTransfer => wrap_jso(_blink.BlinkMouseEvent.instance.dataTransfer_Getter_(unwrap_jso(this)));
+  DataTransfer get dataTransfer => _blink.BlinkMouseEvent.instance.dataTransfer_Getter_(this);
   
   /**
    * The nonstandard way to access the element that the mouse comes
@@ -28571,72 +26733,72 @@
   @DomName('MouseEvent.fromElement')
   @DocsEditable()
   @deprecated
-  Node get fromElement => wrap_jso(_blink.BlinkMouseEvent.instance.fromElement_Getter_(unwrap_jso(this)));
+  Node get fromElement => _blink.BlinkMouseEvent.instance.fromElement_Getter_(this);
   
   @DomName('MouseEvent.layerX')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _layerX => _blink.BlinkMouseEvent.instance.layerX_Getter_(unwrap_jso(this));
+  int get _layerX => _blink.BlinkMouseEvent.instance.layerX_Getter_(this);
   
   @DomName('MouseEvent.layerY')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _layerY => _blink.BlinkMouseEvent.instance.layerY_Getter_(unwrap_jso(this));
+  int get _layerY => _blink.BlinkMouseEvent.instance.layerY_Getter_(this);
   
   @DomName('MouseEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.BlinkMouseEvent.instance.metaKey_Getter_(unwrap_jso(this));
+  bool get metaKey => _blink.BlinkMouseEvent.instance.metaKey_Getter_(this);
   
   @DomName('MouseEvent.movementX')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _movementX => _blink.BlinkMouseEvent.instance.movementX_Getter_(unwrap_jso(this));
+  int get _movementX => _blink.BlinkMouseEvent.instance.movementX_Getter_(this);
   
   @DomName('MouseEvent.movementY')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _movementY => _blink.BlinkMouseEvent.instance.movementY_Getter_(unwrap_jso(this));
+  int get _movementY => _blink.BlinkMouseEvent.instance.movementY_Getter_(this);
   
   @DomName('MouseEvent.offsetX')
   @DocsEditable()
   @Unstable()
-  int get _offsetX => _blink.BlinkMouseEvent.instance.offsetX_Getter_(unwrap_jso(this));
+  int get _offsetX => _blink.BlinkMouseEvent.instance.offsetX_Getter_(this);
   
   @DomName('MouseEvent.offsetY')
   @DocsEditable()
   @Unstable()
-  int get _offsetY => _blink.BlinkMouseEvent.instance.offsetY_Getter_(unwrap_jso(this));
+  int get _offsetY => _blink.BlinkMouseEvent.instance.offsetY_Getter_(this);
   
   @DomName('MouseEvent.pageX')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _pageX => _blink.BlinkMouseEvent.instance.pageX_Getter_(unwrap_jso(this));
+  int get _pageX => _blink.BlinkMouseEvent.instance.pageX_Getter_(this);
   
   @DomName('MouseEvent.pageY')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _pageY => _blink.BlinkMouseEvent.instance.pageY_Getter_(unwrap_jso(this));
+  int get _pageY => _blink.BlinkMouseEvent.instance.pageY_Getter_(this);
   
   @DomName('MouseEvent.region')
   @DocsEditable()
   @Experimental() // untriaged
-  String get region => _blink.BlinkMouseEvent.instance.region_Getter_(unwrap_jso(this));
+  String get region => _blink.BlinkMouseEvent.instance.region_Getter_(this);
   
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => wrap_jso(_blink.BlinkMouseEvent.instance.relatedTarget_Getter_(unwrap_jso(this)));
+  EventTarget get relatedTarget => _blink.BlinkMouseEvent.instance.relatedTarget_Getter_(this);
   
   @DomName('MouseEvent.screenX')
   @DocsEditable()
-  int get _screenX => _blink.BlinkMouseEvent.instance.screenX_Getter_(unwrap_jso(this));
+  int get _screenX => _blink.BlinkMouseEvent.instance.screenX_Getter_(this);
   
   @DomName('MouseEvent.screenY')
   @DocsEditable()
-  int get _screenY => _blink.BlinkMouseEvent.instance.screenY_Getter_(unwrap_jso(this));
+  int get _screenY => _blink.BlinkMouseEvent.instance.screenY_Getter_(this);
   
   @DomName('MouseEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.BlinkMouseEvent.instance.shiftKey_Getter_(unwrap_jso(this));
+  bool get shiftKey => _blink.BlinkMouseEvent.instance.shiftKey_Getter_(this);
   
   /**
    * The nonstandard way to access the element that the mouse goes
@@ -28648,30 +26810,30 @@
   @DomName('MouseEvent.toElement')
   @DocsEditable()
   @deprecated
-  Node get toElement => wrap_jso(_blink.BlinkMouseEvent.instance.toElement_Getter_(unwrap_jso(this)));
+  Node get toElement => _blink.BlinkMouseEvent.instance.toElement_Getter_(this);
   
   @DomName('MouseEvent.webkitMovementX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementX => _blink.BlinkMouseEvent.instance.webkitMovementX_Getter_(unwrap_jso(this));
+  int get _webkitMovementX => _blink.BlinkMouseEvent.instance.webkitMovementX_Getter_(this);
   
   @DomName('MouseEvent.webkitMovementY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementY => _blink.BlinkMouseEvent.instance.webkitMovementY_Getter_(unwrap_jso(this));
+  int get _webkitMovementY => _blink.BlinkMouseEvent.instance.webkitMovementY_Getter_(this);
   
   @DomName('MouseEvent.which')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _which => _blink.BlinkMouseEvent.instance.which_Getter_(unwrap_jso(this));
+  int get _which => _blink.BlinkMouseEvent.instance.which_Getter_(this);
   
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool bubbles, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.BlinkMouseEvent.instance.initMouseEvent_Callback_15_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, unwrap_jso(relatedTarget));
+  void _initMouseEvent(String type, bool bubbles, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.BlinkMouseEvent.instance.initMouseEvent_Callback_15_(this, type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, _convertDartToNative_EventTarget(relatedTarget));
   
 
   @deprecated
@@ -28746,34 +26908,26 @@
 
   @DomName('MutationObserver.MutationObserver')
   @DocsEditable()
-  factory MutationObserver._(MutationCallback callback) => wrap_jso(_create(callback));
+  factory MutationObserver._(MutationCallback callback) => _create(callback);
+
 
   @Deprecated("Internal Use Only")
-  static MutationObserver internalCreateMutationObserver() {
-    return new MutationObserver._internalWrap();
-  }
-
-  factory MutationObserver._internalWrap() {
-    return new MutationObserver.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MutationObserver.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MutationObserver.disconnect')
   @DocsEditable()
-  void disconnect() => _blink.BlinkMutationObserver.instance.disconnect_Callback_0_(unwrap_jso(this));
+  void disconnect() => _blink.BlinkMutationObserver.instance.disconnect_Callback_0_(this);
   
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.instance.observe_Callback_2_(unwrap_jso(this), unwrap_jso(target), convertDartToNative_Dictionary(options));
+  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.instance.observe_Callback_2_(this, target, convertDartToNative_Dictionary(options));
   
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
-  List<MutationRecord> takeRecords() => wrap_jso(_blink.BlinkMutationObserver.instance.takeRecords_Callback_0_(unwrap_jso(this)));
+  List<MutationRecord> takeRecords() => (_blink.BlinkMutationObserver.instance.takeRecords_Callback_0_(this));
   
   /**
    * Checks to see if the mutation observer API is supported on the current
@@ -28783,9 +26937,7 @@
     return true;
   }
   @DocsEditable()
-  static MutationObserver _create(callback) => wrap_jso(_blink.BlinkMutationObserver.instance.constructorCallback_1_((mutations, observer) {
-    callback(wrap_jso(mutations), wrap_jso(observer));
-  }));
+  static MutationObserver _create(callback) => _blink.BlinkMutationObserver.instance.constructorCallback_1_(callback);
 
   /**
    * Observes the target for the specified changes.
@@ -28860,56 +27012,48 @@
   // To suppress missing implicit constructor warnings.
   factory MutationRecord._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static MutationRecord internalCreateMutationRecord() {
-    return new MutationRecord._internalWrap();
-  }
 
-  factory MutationRecord._internalWrap() {
-    return new MutationRecord.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MutationRecord.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('MutationRecord.addedNodes')
   @DocsEditable()
-  List<Node> get addedNodes => wrap_jso(_blink.BlinkMutationRecord.instance.addedNodes_Getter_(unwrap_jso(this)));
+  List<Node> get addedNodes => (_blink.BlinkMutationRecord.instance.addedNodes_Getter_(this));
   
   @DomName('MutationRecord.attributeName')
   @DocsEditable()
-  String get attributeName => _blink.BlinkMutationRecord.instance.attributeName_Getter_(unwrap_jso(this));
+  String get attributeName => _blink.BlinkMutationRecord.instance.attributeName_Getter_(this);
   
   @DomName('MutationRecord.attributeNamespace')
   @DocsEditable()
-  String get attributeNamespace => _blink.BlinkMutationRecord.instance.attributeNamespace_Getter_(unwrap_jso(this));
+  String get attributeNamespace => _blink.BlinkMutationRecord.instance.attributeNamespace_Getter_(this);
   
   @DomName('MutationRecord.nextSibling')
   @DocsEditable()
-  Node get nextSibling => wrap_jso(_blink.BlinkMutationRecord.instance.nextSibling_Getter_(unwrap_jso(this)));
+  Node get nextSibling => _blink.BlinkMutationRecord.instance.nextSibling_Getter_(this);
   
   @DomName('MutationRecord.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.BlinkMutationRecord.instance.oldValue_Getter_(unwrap_jso(this));
+  String get oldValue => _blink.BlinkMutationRecord.instance.oldValue_Getter_(this);
   
   @DomName('MutationRecord.previousSibling')
   @DocsEditable()
-  Node get previousSibling => wrap_jso(_blink.BlinkMutationRecord.instance.previousSibling_Getter_(unwrap_jso(this)));
+  Node get previousSibling => _blink.BlinkMutationRecord.instance.previousSibling_Getter_(this);
   
   @DomName('MutationRecord.removedNodes')
   @DocsEditable()
-  List<Node> get removedNodes => wrap_jso(_blink.BlinkMutationRecord.instance.removedNodes_Getter_(unwrap_jso(this)));
+  List<Node> get removedNodes => (_blink.BlinkMutationRecord.instance.removedNodes_Getter_(this));
   
   @DomName('MutationRecord.target')
   @DocsEditable()
-  Node get target => wrap_jso(_blink.BlinkMutationRecord.instance.target_Getter_(unwrap_jso(this)));
+  Node get target => _blink.BlinkMutationRecord.instance.target_Getter_(this);
   
   @DomName('MutationRecord.type')
   @DocsEditable()
-  String get type => _blink.BlinkMutationRecord.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkMutationRecord.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28979,101 +27123,93 @@
   // To suppress missing implicit constructor warnings.
   factory Navigator._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Navigator internalCreateNavigator() {
-    return new Navigator._internalWrap();
-  }
 
-  factory Navigator._internalWrap() {
-    return new Navigator.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Navigator.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Navigator.bluetooth')
   @DocsEditable()
   @Experimental() // untriaged
-  Bluetooth get bluetooth => wrap_jso(_blink.BlinkNavigator.instance.bluetooth_Getter_(unwrap_jso(this)));
+  Bluetooth get bluetooth => _blink.BlinkNavigator.instance.bluetooth_Getter_(this);
   
   @DomName('Navigator.connection')
   @DocsEditable()
   @Experimental() // untriaged
-  NetworkInformation get connection => wrap_jso(_blink.BlinkNavigator.instance.connection_Getter_(unwrap_jso(this)));
+  NetworkInformation get connection => _blink.BlinkNavigator.instance.connection_Getter_(this);
   
   @DomName('Navigator.credentials')
   @DocsEditable()
   @Experimental() // untriaged
-  CredentialsContainer get credentials => wrap_jso(_blink.BlinkNavigator.instance.credentials_Getter_(unwrap_jso(this)));
+  CredentialsContainer get credentials => _blink.BlinkNavigator.instance.credentials_Getter_(this);
   
   @DomName('Navigator.doNotTrack')
   @DocsEditable()
   // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
   @Experimental() // experimental
-  String get doNotTrack => _blink.BlinkNavigator.instance.doNotTrack_Getter_(unwrap_jso(this));
+  String get doNotTrack => _blink.BlinkNavigator.instance.doNotTrack_Getter_(this);
   
   @DomName('Navigator.geolocation')
   @DocsEditable()
   @Unstable()
-  Geolocation get geolocation => wrap_jso(_blink.BlinkNavigator.instance.geolocation_Getter_(unwrap_jso(this)));
+  Geolocation get geolocation => _blink.BlinkNavigator.instance.geolocation_Getter_(this);
   
   @DomName('Navigator.maxTouchPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxTouchPoints => _blink.BlinkNavigator.instance.maxTouchPoints_Getter_(unwrap_jso(this));
+  int get maxTouchPoints => _blink.BlinkNavigator.instance.maxTouchPoints_Getter_(this);
   
   @DomName('Navigator.mediaDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaDevices get mediaDevices => wrap_jso(_blink.BlinkNavigator.instance.mediaDevices_Getter_(unwrap_jso(this)));
+  MediaDevices get mediaDevices => _blink.BlinkNavigator.instance.mediaDevices_Getter_(this);
   
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
-  MimeTypeArray get mimeTypes => wrap_jso(_blink.BlinkNavigator.instance.mimeTypes_Getter_(unwrap_jso(this)));
+  MimeTypeArray get mimeTypes => _blink.BlinkNavigator.instance.mimeTypes_Getter_(this);
   
   @DomName('Navigator.permissions')
   @DocsEditable()
   @Experimental() // untriaged
-  Permissions get permissions => wrap_jso(_blink.BlinkNavigator.instance.permissions_Getter_(unwrap_jso(this)));
+  Permissions get permissions => _blink.BlinkNavigator.instance.permissions_Getter_(this);
   
   @DomName('Navigator.presentation')
   @DocsEditable()
   @Experimental() // untriaged
-  Presentation get presentation => wrap_jso(_blink.BlinkNavigator.instance.presentation_Getter_(unwrap_jso(this)));
+  Presentation get presentation => _blink.BlinkNavigator.instance.presentation_Getter_(this);
   
   @DomName('Navigator.productSub')
   @DocsEditable()
   @Unstable()
-  String get productSub => _blink.BlinkNavigator.instance.productSub_Getter_(unwrap_jso(this));
+  String get productSub => _blink.BlinkNavigator.instance.productSub_Getter_(this);
   
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerContainer get serviceWorker => wrap_jso(_blink.BlinkNavigator.instance.serviceWorker_Getter_(unwrap_jso(this)));
+  ServiceWorkerContainer get serviceWorker => _blink.BlinkNavigator.instance.serviceWorker_Getter_(this);
   
   @DomName('Navigator.services')
   @DocsEditable()
   @Experimental() // untriaged
-  ServicePortCollection get services => wrap_jso(_blink.BlinkNavigator.instance.services_Getter_(unwrap_jso(this)));
+  ServicePortCollection get services => _blink.BlinkNavigator.instance.services_Getter_(this);
   
   @DomName('Navigator.storageQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  StorageQuota get storageQuota => wrap_jso(_blink.BlinkNavigator.instance.storageQuota_Getter_(unwrap_jso(this)));
+  StorageQuota get storageQuota => _blink.BlinkNavigator.instance.storageQuota_Getter_(this);
   
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
-  String get vendor => _blink.BlinkNavigator.instance.vendor_Getter_(unwrap_jso(this));
+  String get vendor => _blink.BlinkNavigator.instance.vendor_Getter_(this);
   
   @DomName('Navigator.vendorSub')
   @DocsEditable()
   @Unstable()
-  String get vendorSub => _blink.BlinkNavigator.instance.vendorSub_Getter_(unwrap_jso(this));
+  String get vendorSub => _blink.BlinkNavigator.instance.vendorSub_Getter_(this);
   
   @DomName('Navigator.webkitPersistentStorage')
   @DocsEditable()
@@ -29081,7 +27217,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get persistentStorage => wrap_jso(_blink.BlinkNavigator.instance.webkitPersistentStorage_Getter_(unwrap_jso(this)));
+  DeprecatedStorageQuota get persistentStorage => _blink.BlinkNavigator.instance.webkitPersistentStorage_Getter_(this);
   
   @DomName('Navigator.webkitTemporaryStorage')
   @DocsEditable()
@@ -29089,111 +27225,111 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get temporaryStorage => wrap_jso(_blink.BlinkNavigator.instance.webkitTemporaryStorage_Getter_(unwrap_jso(this)));
+  DeprecatedStorageQuota get temporaryStorage => _blink.BlinkNavigator.instance.webkitTemporaryStorage_Getter_(this);
   
   @DomName('Navigator.getBattery')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBattery() => wrap_jso(_blink.BlinkNavigator.instance.getBattery_Callback_0_(unwrap_jso(this)));
+  Future getBattery() => convertNativePromiseToDartFuture(_blink.BlinkNavigator.instance.getBattery_Callback_0_(this));
   
   @DomName('Navigator.getGamepads')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Gamepad> getGamepads() => wrap_jso(_blink.BlinkNavigator.instance.getGamepads_Callback_0_(unwrap_jso(this)));
+  List<Gamepad> getGamepads() => (_blink.BlinkNavigator.instance.getGamepads_Callback_0_(this));
   
   @DomName('Navigator.getVRDevices')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getVRDevices() => wrap_jso(_blink.BlinkNavigator.instance.getVRDevices_Callback_0_(unwrap_jso(this)));
+  Future getVRDevices() => convertNativePromiseToDartFuture(_blink.BlinkNavigator.instance.getVRDevices_Callback_0_(this));
   
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
-  void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.instance.registerProtocolHandler_Callback_3_(unwrap_jso(this), scheme, url, title);
+  void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.instance.registerProtocolHandler_Callback_3_(this, scheme, url, title);
   
   Future requestMidiAccess([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkNavigator.instance.requestMIDIAccess_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkNavigator.instance.requestMIDIAccess_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkNavigator.instance.requestMIDIAccess_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkNavigator.instance.requestMIDIAccess_Callback_0_(this);
   }
 
   @DomName('Navigator.requestMediaKeySystemAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestMediaKeySystemAccess(String keySystem, List<Map> supportedConfigurations) => wrap_jso(_blink.BlinkNavigator.instance.requestMediaKeySystemAccess_Callback_2_(unwrap_jso(this), keySystem, supportedConfigurations));
+  Future requestMediaKeySystemAccess(String keySystem, List<Map> supportedConfigurations) => convertNativePromiseToDartFuture(_blink.BlinkNavigator.instance.requestMediaKeySystemAccess_Callback_2_(this, keySystem, supportedConfigurations));
   
   @DomName('Navigator.sendBeacon')
   @DocsEditable()
   @Experimental() // untriaged
-  bool sendBeacon(String url, Object data) => _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(unwrap_jso(this), url, data);
+  bool sendBeacon(String url, Object data) => _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(this, url, data);
   
   @DomName('Navigator.webkitGetUserMedia')
   @DocsEditable()
   // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia
   @Experimental()
-  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, _NavigatorUserMediaErrorCallback errorCallback) => _blink.BlinkNavigator.instance.webkitGetUserMedia_Callback_3_(unwrap_jso(this), convertDartToNative_Dictionary(options), unwrap_jso((stream) => successCallback(wrap_jso(stream))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, _NavigatorUserMediaErrorCallback errorCallback) => _blink.BlinkNavigator.instance.webkitGetUserMedia_Callback_3_(this, convertDartToNative_Dictionary(options), successCallback, errorCallback);
   
   @DomName('Navigator.hardwareConcurrency')
   @DocsEditable()
   @Experimental() // untriaged
-  int get hardwareConcurrency => _blink.BlinkNavigator.instance.hardwareConcurrency_Getter_(unwrap_jso(this));
+  int get hardwareConcurrency => _blink.BlinkNavigator.instance.hardwareConcurrency_Getter_(this);
   
   @DomName('Navigator.appCodeName')
   @DocsEditable()
   @Experimental() // non-standard
-  String get appCodeName => _blink.BlinkNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
+  String get appCodeName => _blink.BlinkNavigator.instance.appCodeName_Getter_(this);
   
   @DomName('Navigator.appName')
   @DocsEditable()
-  String get appName => _blink.BlinkNavigator.instance.appName_Getter_(unwrap_jso(this));
+  String get appName => _blink.BlinkNavigator.instance.appName_Getter_(this);
   
   @DomName('Navigator.appVersion')
   @DocsEditable()
-  String get appVersion => _blink.BlinkNavigator.instance.appVersion_Getter_(unwrap_jso(this));
+  String get appVersion => _blink.BlinkNavigator.instance.appVersion_Getter_(this);
   
   @DomName('Navigator.dartEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get dartEnabled => _blink.BlinkNavigator.instance.dartEnabled_Getter_(unwrap_jso(this));
+  bool get dartEnabled => _blink.BlinkNavigator.instance.dartEnabled_Getter_(this);
   
   @DomName('Navigator.platform')
   @DocsEditable()
-  String get platform => _blink.BlinkNavigator.instance.platform_Getter_(unwrap_jso(this));
+  String get platform => _blink.BlinkNavigator.instance.platform_Getter_(this);
   
   @DomName('Navigator.product')
   @DocsEditable()
   @Unstable()
-  String get product => _blink.BlinkNavigator.instance.product_Getter_(unwrap_jso(this));
+  String get product => _blink.BlinkNavigator.instance.product_Getter_(this);
   
   @DomName('Navigator.userAgent')
   @DocsEditable()
-  String get userAgent => _blink.BlinkNavigator.instance.userAgent_Getter_(unwrap_jso(this));
+  String get userAgent => _blink.BlinkNavigator.instance.userAgent_Getter_(this);
   
   @DomName('Navigator.language')
   @DocsEditable()
-  String get language => _blink.BlinkNavigator.instance.language_Getter_(unwrap_jso(this));
+  String get language => _blink.BlinkNavigator.instance.language_Getter_(this);
   
   @DomName('Navigator.languages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get languages => _blink.BlinkNavigator.instance.languages_Getter_(unwrap_jso(this));
+  List<String> get languages => _blink.BlinkNavigator.instance.languages_Getter_(this);
   
   @DomName('Navigator.onLine')
   @DocsEditable()
   @Unstable()
-  bool get onLine => _blink.BlinkNavigator.instance.onLine_Getter_(unwrap_jso(this));
+  bool get onLine => _blink.BlinkNavigator.instance.onLine_Getter_(this);
   
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
-  bool get cookieEnabled => _blink.BlinkNavigator.instance.cookieEnabled_Getter_(unwrap_jso(this));
+  bool get cookieEnabled => _blink.BlinkNavigator.instance.cookieEnabled_Getter_(this);
   
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
   @Experimental()
-  void getStorageUpdates() => _blink.BlinkNavigator.instance.getStorageUpdates_Callback_0_(unwrap_jso(this));
+  void getStorageUpdates() => _blink.BlinkNavigator.instance.getStorageUpdates_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29325,30 +27461,22 @@
   // To suppress missing implicit constructor warnings.
   factory NavigatorStorageUtils._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NavigatorStorageUtils internalCreateNavigatorStorageUtils() {
-    return new NavigatorStorageUtils._internalWrap();
-  }
 
-  factory NavigatorStorageUtils._internalWrap() {
-    return new NavigatorStorageUtils.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NavigatorStorageUtils.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NavigatorStorageUtils.cookieEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get cookieEnabled => _blink.BlinkNavigatorStorageUtils.instance.cookieEnabled_Getter_(unwrap_jso(this));
+  bool get cookieEnabled => _blink.BlinkNavigatorStorageUtils.instance.cookieEnabled_Getter_(this);
   
   @DomName('NavigatorStorageUtils.getStorageUpdates')
   @DocsEditable()
   @Experimental() // untriaged
-  void getStorageUpdates() => _blink.BlinkNavigatorStorageUtils.instance.getStorageUpdates_Callback_0_(unwrap_jso(this));
+  void getStorageUpdates() => _blink.BlinkNavigatorStorageUtils.instance.getStorageUpdates_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29366,32 +27494,24 @@
   // To suppress missing implicit constructor warnings.
   factory NavigatorUserMediaError._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NavigatorUserMediaError internalCreateNavigatorUserMediaError() {
-    return new NavigatorUserMediaError._internalWrap();
-  }
 
-  factory NavigatorUserMediaError._internalWrap() {
-    return new NavigatorUserMediaError.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NavigatorUserMediaError.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable()
-  String get constraintName => _blink.BlinkNavigatorUserMediaError.instance.constraintName_Getter_(unwrap_jso(this));
+  String get constraintName => _blink.BlinkNavigatorUserMediaError.instance.constraintName_Getter_(this);
   
   @DomName('NavigatorUserMediaError.message')
   @DocsEditable()
-  String get message => _blink.BlinkNavigatorUserMediaError.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkNavigatorUserMediaError.instance.message_Getter_(this);
   
   @DomName('NavigatorUserMediaError.name')
   @DocsEditable()
-  String get name => _blink.BlinkNavigatorUserMediaError.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkNavigatorUserMediaError.instance.name_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29432,11 +27552,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static NetworkInformation internalCreateNetworkInformation() {
-    return new NetworkInformation._internalWrap();
-  }
-
-  external factory NetworkInformation._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NetworkInformation.internal_() : super.internal_();
@@ -29445,7 +27561,7 @@
   @DomName('NetworkInformation.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkNetworkInformation.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkNetworkInformation.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29624,14 +27740,7 @@
 class Node extends EventTarget {
 
   // Custom element created callback.
-  Node._created() : super._created() {
-    // By this point blink_jsObject should be setup if it's not then we weren't
-    // called by the registerElement createdCallback - probably created() was
-    // called directly which is verboten.
-    if (this.blink_jsObject == null) {
-      throw new DomException.jsInterop("the created constructor cannot be called directly");
-    }
-  }
+  Node._created() : super._created();
 
   /**
    * A modifiable list of this node's children.
@@ -29726,17 +27835,13 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes => wrap_jso(_blink.BlinkNode.instance.childNodes_Getter_(unwrap_jso(this)));
+  List<Node> get childNodes => _blink.BlinkNode.instance.childNodes_Getter_(this);
   // To suppress missing implicit constructor warnings.
   factory Node._() { throw new UnsupportedError("Not supported"); }
 
 
   @Deprecated("Internal Use Only")
-  static Node internalCreateNode() {
-    return new Node._internalWrap();
-  }
-
-  external factory Node._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Node.internal_() : super.internal_();
@@ -29792,7 +27897,7 @@
 
   @DomName('Node.baseURI')
   @DocsEditable()
-  String get baseUri => _blink.BlinkNode.instance.baseURI_Getter_(unwrap_jso(this));
+  String get baseUri => _blink.BlinkNode.instance.baseURI_Getter_(this);
   
   /**
    * The first child of this node.
@@ -29804,7 +27909,7 @@
    */
   @DomName('Node.firstChild')
   @DocsEditable()
-  Node get firstChild => wrap_jso(_blink.BlinkNode.instance.firstChild_Getter_(unwrap_jso(this)));
+  Node get firstChild => _blink.BlinkNode.instance.firstChild_Getter_(this);
   
   /**
    * The last child of this node.
@@ -29816,15 +27921,15 @@
    */
   @DomName('Node.lastChild')
   @DocsEditable()
-  Node get lastChild => wrap_jso(_blink.BlinkNode.instance.lastChild_Getter_(unwrap_jso(this)));
+  Node get lastChild => _blink.BlinkNode.instance.lastChild_Getter_(this);
   
   @DomName('Node.localName')
   @DocsEditable()
-  String get _localName => _blink.BlinkNode.instance.localName_Getter_(unwrap_jso(this));
+  String get _localName => _blink.BlinkNode.instance.localName_Getter_(this);
   
   @DomName('Node.namespaceURI')
   @DocsEditable()
-  String get _namespaceUri => _blink.BlinkNode.instance.namespaceURI_Getter_(unwrap_jso(this));
+  String get _namespaceUri => _blink.BlinkNode.instance.namespaceURI_Getter_(this);
   
   /**
    * The next sibling node.
@@ -29836,7 +27941,7 @@
    */
   @DomName('Node.nextSibling')
   @DocsEditable()
-  Node get nextNode => wrap_jso(_blink.BlinkNode.instance.nextSibling_Getter_(unwrap_jso(this)));
+  Node get nextNode => _blink.BlinkNode.instance.nextSibling_Getter_(this);
   
   /**
    * The name of this node.
@@ -29851,7 +27956,7 @@
    */
   @DomName('Node.nodeName')
   @DocsEditable()
-  String get nodeName => _blink.BlinkNode.instance.nodeName_Getter_(unwrap_jso(this));
+  String get nodeName => _blink.BlinkNode.instance.nodeName_Getter_(this);
   
   /**
    * The type of node.
@@ -29878,7 +27983,7 @@
    */
   @DomName('Node.nodeType')
   @DocsEditable()
-  int get nodeType => _blink.BlinkNode.instance.nodeType_Getter_(unwrap_jso(this));
+  int get nodeType => _blink.BlinkNode.instance.nodeType_Getter_(this);
   
   /**
    * The value of this node.
@@ -29893,7 +27998,7 @@
    */
   @DomName('Node.nodeValue')
   @DocsEditable()
-  String get nodeValue => _blink.BlinkNode.instance.nodeValue_Getter_(unwrap_jso(this));
+  String get nodeValue => _blink.BlinkNode.instance.nodeValue_Getter_(this);
   
   /**
    * The document this node belongs to.
@@ -29907,7 +28012,7 @@
    */
   @DomName('Node.ownerDocument')
   @DocsEditable()
-  Document get ownerDocument => wrap_jso(_blink.BlinkNode.instance.ownerDocument_Getter_(unwrap_jso(this)));
+  Document get ownerDocument => _blink.BlinkNode.instance.ownerDocument_Getter_(this);
   
   /**
    * The parent element of this node.
@@ -29922,7 +28027,7 @@
    */
   @DomName('Node.parentElement')
   @DocsEditable()
-  Element get parent => wrap_jso(_blink.BlinkNode.instance.parentElement_Getter_(unwrap_jso(this)));
+  Element get parent => _blink.BlinkNode.instance.parentElement_Getter_(this);
   
   /**
    * The parent node of this node.
@@ -29934,7 +28039,7 @@
    */
   @DomName('Node.parentNode')
   @DocsEditable()
-  Node get parentNode => wrap_jso(_blink.BlinkNode.instance.parentNode_Getter_(unwrap_jso(this)));
+  Node get parentNode => _blink.BlinkNode.instance.parentNode_Getter_(this);
   
   /**
    * The previous sibling node.
@@ -29946,7 +28051,7 @@
    */
   @DomName('Node.previousSibling')
   @DocsEditable()
-  Node get previousNode => wrap_jso(_blink.BlinkNode.instance.previousSibling_Getter_(unwrap_jso(this)));
+  Node get previousNode => _blink.BlinkNode.instance.previousSibling_Getter_(this);
   
   /**
    * All text within this node and its decendents.
@@ -29958,7 +28063,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  String get text => _blink.BlinkNode.instance.textContent_Getter_(unwrap_jso(this));
+  String get text => _blink.BlinkNode.instance.textContent_Getter_(this);
   
   /**
    * All text within this node and its decendents.
@@ -29970,7 +28075,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  set text(String value) => _blink.BlinkNode.instance.textContent_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkNode.instance.textContent_Setter_(this, value);
   
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -29983,7 +28088,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node node) => wrap_jso(_blink.BlinkNode.instance.appendChild_Callback_1_(unwrap_jso(this), unwrap_jso(node)));
+  Node append(Node node) => _blink.BlinkNode.instance.appendChild_Callback_1_(this, node);
   
   /**
    * Returns a copy of this node.
@@ -29998,7 +28103,7 @@
    */
   @DomName('Node.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => wrap_jso(_blink.BlinkNode.instance.cloneNode_Callback_1_(unwrap_jso(this), deep));
+  Node clone(bool deep) => _blink.BlinkNode.instance.cloneNode_Callback_1_(this, deep);
   
   /**
    * Returns true if this node contains the specified node.
@@ -30010,7 +28115,7 @@
    */
   @DomName('Node.contains')
   @DocsEditable()
-  bool contains(Node other) => _blink.BlinkNode.instance.contains_Callback_1_(unwrap_jso(this), unwrap_jso(other));
+  bool contains(Node other) => _blink.BlinkNode.instance.contains_Callback_1_(this, other);
   
   /**
    * Returns true if this node has any children.
@@ -30022,7 +28127,7 @@
    */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
-  bool hasChildNodes() => _blink.BlinkNode.instance.hasChildNodes_Callback_0_(unwrap_jso(this));
+  bool hasChildNodes() => _blink.BlinkNode.instance.hasChildNodes_Callback_0_(this);
   
   /**
    * Inserts all of the nodes into this node directly before refChild.
@@ -30034,15 +28139,15 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node node, Node child) => wrap_jso(_blink.BlinkNode.instance.insertBefore_Callback_2_(unwrap_jso(this), unwrap_jso(node), unwrap_jso(child)));
+  Node insertBefore(Node node, Node child) => _blink.BlinkNode.instance.insertBefore_Callback_2_(this, node, child);
   
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node child) => wrap_jso(_blink.BlinkNode.instance.removeChild_Callback_1_(unwrap_jso(this), unwrap_jso(child)));
+  Node _removeChild(Node child) => _blink.BlinkNode.instance.removeChild_Callback_1_(this, child);
   
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node node, Node child) => wrap_jso(_blink.BlinkNode.instance.replaceChild_Callback_2_(unwrap_jso(this), unwrap_jso(node), unwrap_jso(child)));
+  Node _replaceChild(Node node, Node child) => _blink.BlinkNode.instance.replaceChild_Callback_2_(this, node, child);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30059,21 +28164,13 @@
   // To suppress missing implicit constructor warnings.
   factory NodeFilter._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NodeFilter internalCreateNodeFilter() {
-    return new NodeFilter._internalWrap();
-  }
 
-  factory NodeFilter._internalWrap() {
-    return new NodeFilter.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NodeFilter.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NodeFilter.FILTER_ACCEPT')
   @DocsEditable()
   static const int FILTER_ACCEPT = 1;
@@ -30133,48 +28230,40 @@
   // To suppress missing implicit constructor warnings.
   factory NodeIterator._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NodeIterator internalCreateNodeIterator() {
-    return new NodeIterator._internalWrap();
-  }
 
-  factory NodeIterator._internalWrap() {
-    return new NodeIterator.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NodeIterator.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NodeIterator.pointerBeforeReferenceNode')
   @DocsEditable()
-  bool get pointerBeforeReferenceNode => _blink.BlinkNodeIterator.instance.pointerBeforeReferenceNode_Getter_(unwrap_jso(this));
+  bool get pointerBeforeReferenceNode => _blink.BlinkNodeIterator.instance.pointerBeforeReferenceNode_Getter_(this);
   
   @DomName('NodeIterator.referenceNode')
   @DocsEditable()
-  Node get referenceNode => wrap_jso(_blink.BlinkNodeIterator.instance.referenceNode_Getter_(unwrap_jso(this)));
+  Node get referenceNode => _blink.BlinkNodeIterator.instance.referenceNode_Getter_(this);
   
   @DomName('NodeIterator.root')
   @DocsEditable()
-  Node get root => wrap_jso(_blink.BlinkNodeIterator.instance.root_Getter_(unwrap_jso(this)));
+  Node get root => _blink.BlinkNodeIterator.instance.root_Getter_(this);
   
   @DomName('NodeIterator.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.BlinkNodeIterator.instance.whatToShow_Getter_(unwrap_jso(this));
+  int get whatToShow => _blink.BlinkNodeIterator.instance.whatToShow_Getter_(this);
   
   @DomName('NodeIterator.detach')
   @DocsEditable()
-  void detach() => _blink.BlinkNodeIterator.instance.detach_Callback_0_(unwrap_jso(this));
+  void detach() => _blink.BlinkNodeIterator.instance.detach_Callback_0_(this);
   
   @DomName('NodeIterator.nextNode')
   @DocsEditable()
-  Node nextNode() => wrap_jso(_blink.BlinkNodeIterator.instance.nextNode_Callback_0_(unwrap_jso(this)));
+  Node nextNode() => _blink.BlinkNodeIterator.instance.nextNode_Callback_0_(this);
   
   @DomName('NodeIterator.previousNode')
   @DocsEditable()
-  Node previousNode() => wrap_jso(_blink.BlinkNodeIterator.instance.previousNode_Callback_0_(unwrap_jso(this)));
+  Node previousNode() => _blink.BlinkNodeIterator.instance.previousNode_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30190,32 +28279,24 @@
   // To suppress missing implicit constructor warnings.
   factory NodeList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NodeList internalCreateNodeList() {
-    return new NodeList._internalWrap();
-  }
 
-  factory NodeList._internalWrap() {
-    return new NodeList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NodeList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NodeList.length')
   @DocsEditable()
-  int get length => _blink.BlinkNodeList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkNodeList.instance.length_Getter_(this);
   
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkNodeList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Node _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkNodeList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Node _nativeIndexedGetter(int index) => (_blink.BlinkNodeList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -30257,7 +28338,7 @@
 
   @DomName('NodeList.item')
   @DocsEditable()
-  Node _item(int index) => wrap_jso(_blink.BlinkNodeList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Node _item(int index) => _blink.BlinkNodeList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30274,30 +28355,22 @@
   // To suppress missing implicit constructor warnings.
   factory NonDocumentTypeChildNode._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NonDocumentTypeChildNode internalCreateNonDocumentTypeChildNode() {
-    return new NonDocumentTypeChildNode._internalWrap();
-  }
 
-  factory NonDocumentTypeChildNode._internalWrap() {
-    return new NonDocumentTypeChildNode.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NonDocumentTypeChildNode.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NonDocumentTypeChildNode.nextElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get nextElementSibling => wrap_jso(_blink.BlinkNonDocumentTypeChildNode.instance.nextElementSibling_Getter_(unwrap_jso(this)));
+  Element get nextElementSibling => _blink.BlinkNonDocumentTypeChildNode.instance.nextElementSibling_Getter_(this);
   
   @DomName('NonDocumentTypeChildNode.previousElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get previousElementSibling => wrap_jso(_blink.BlinkNonDocumentTypeChildNode.instance.previousElementSibling_Getter_(unwrap_jso(this)));
+  Element get previousElementSibling => _blink.BlinkNonDocumentTypeChildNode.instance.previousElementSibling_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30314,25 +28387,17 @@
   // To suppress missing implicit constructor warnings.
   factory NonElementParentNode._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NonElementParentNode internalCreateNonElementParentNode() {
-    return new NonElementParentNode._internalWrap();
-  }
 
-  factory NonElementParentNode._internalWrap() {
-    return new NonElementParentNode.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NonElementParentNode.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NonElementParentNode.getElementById')
   @DocsEditable()
   @Experimental() // untriaged
-  Element getElementById(String elementId) => wrap_jso(_blink.BlinkNonElementParentNode.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
+  Element getElementById(String elementId) => _blink.BlinkNonElementParentNode.instance.getElementById_Callback_1_(this, elementId);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -30404,18 +28469,14 @@
   static Notification _factoryNotification(String title, [Map options]) {
     if (options != null) {
       var options_1 = convertDartToNative_Dictionary(options);
-      return wrap_jso(_blink.BlinkNotification.instance.constructorCallback_2_(title, options_1));
+      return _blink.BlinkNotification.instance.constructorCallback_2_(title, options_1);
     }
-    return wrap_jso(_blink.BlinkNotification.instance.constructorCallback_1_(title));
+    return _blink.BlinkNotification.instance.constructorCallback_1_(title);
   }
 
 
   @Deprecated("Internal Use Only")
-  static Notification internalCreateNotification() {
-    return new Notification._internalWrap();
-  }
-
-  external factory Notification._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Notification.internal_() : super.internal_();
@@ -30427,27 +28488,27 @@
   @DomName('Notification.body')
   @DocsEditable()
   @Experimental() // untriaged
-  String get body => _blink.BlinkNotification.instance.body_Getter_(unwrap_jso(this));
+  String get body => _blink.BlinkNotification.instance.body_Getter_(this);
   
   @DomName('Notification.data')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get data => wrap_jso(_blink.BlinkNotification.instance.data_Getter_(unwrap_jso(this)));
+  Object get data => (_blink.BlinkNotification.instance.data_Getter_(this));
   
   @DomName('Notification.dir')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get dir => _blink.BlinkNotification.instance.dir_Getter_(unwrap_jso(this));
+  String get dir => _blink.BlinkNotification.instance.dir_Getter_(this);
   
   @DomName('Notification.icon')
   @DocsEditable()
   @Experimental() // untriaged
-  String get icon => _blink.BlinkNotification.instance.icon_Getter_(unwrap_jso(this));
+  String get icon => _blink.BlinkNotification.instance.icon_Getter_(this);
   
   @DomName('Notification.lang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get lang => _blink.BlinkNotification.instance.lang_Getter_(unwrap_jso(this));
+  String get lang => _blink.BlinkNotification.instance.lang_Getter_(this);
   
   @DomName('Notification.permission')
   @DocsEditable()
@@ -30456,30 +28517,30 @@
   @DomName('Notification.silent')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get silent => _blink.BlinkNotification.instance.silent_Getter_(unwrap_jso(this));
+  bool get silent => _blink.BlinkNotification.instance.silent_Getter_(this);
   
   @DomName('Notification.tag')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get tag => _blink.BlinkNotification.instance.tag_Getter_(unwrap_jso(this));
+  String get tag => _blink.BlinkNotification.instance.tag_Getter_(this);
   
   @DomName('Notification.title')
   @DocsEditable()
   @Experimental() // untriaged
-  String get title => _blink.BlinkNotification.instance.title_Getter_(unwrap_jso(this));
+  String get title => _blink.BlinkNotification.instance.title_Getter_(this);
   
   @DomName('Notification.vibrate')
   @DocsEditable()
   @Experimental() // untriaged
-  List<int> get vibrate => _blink.BlinkNotification.instance.vibrate_Getter_(unwrap_jso(this));
+  List<int> get vibrate => _blink.BlinkNotification.instance.vibrate_Getter_(this);
   
   @DomName('Notification.close')
   @DocsEditable()
-  void close() => _blink.BlinkNotification.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkNotification.instance.close_Callback_0_(this);
   
   static void _requestPermission([_NotificationPermissionCallback callback]) {
     if (callback != null) {
-      _blink.BlinkNotification.instance.requestPermission_Callback_1_(unwrap_jso((permission) => callback(permission)));
+      _blink.BlinkNotification.instance.requestPermission_Callback_1_(callback);
       return;
     }
     _blink.BlinkNotification.instance.requestPermission_Callback_0_();
@@ -30533,18 +28594,14 @@
   factory NotificationEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkNotificationEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkNotificationEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkNotificationEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkNotificationEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static NotificationEvent internalCreateNotificationEvent() {
-    return new NotificationEvent._internalWrap();
-  }
-
-  external factory NotificationEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NotificationEvent.internal_() : super.internal_();
@@ -30553,7 +28610,7 @@
   @DomName('NotificationEvent.notification')
   @DocsEditable()
   @Experimental() // untriaged
-  Notification get notification => wrap_jso(_blink.BlinkNotificationEvent.instance.notification_Getter_(unwrap_jso(this)));
+  Notification get notification => _blink.BlinkNotificationEvent.instance.notification_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30586,11 +28643,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static OListElement internalCreateOListElement() {
-    return new OListElement._internalWrap();
-  }
-
-  external factory OListElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OListElement.internal_() : super.internal_();
@@ -30604,27 +28657,27 @@
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  bool get reversed => _blink.BlinkHTMLOListElement.instance.reversed_Getter_(unwrap_jso(this));
+  bool get reversed => _blink.BlinkHTMLOListElement.instance.reversed_Getter_(this);
   
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  set reversed(bool value) => _blink.BlinkHTMLOListElement.instance.reversed_Setter_(unwrap_jso(this), value);
+  set reversed(bool value) => _blink.BlinkHTMLOListElement.instance.reversed_Setter_(this, value);
   
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  int get start => _blink.BlinkHTMLOListElement.instance.start_Getter_(unwrap_jso(this));
+  int get start => _blink.BlinkHTMLOListElement.instance.start_Getter_(this);
   
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  set start(int value) => _blink.BlinkHTMLOListElement.instance.start_Setter_(unwrap_jso(this), value);
+  set start(int value) => _blink.BlinkHTMLOListElement.instance.start_Setter_(this, value);
   
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLOListElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLOListElement.instance.type_Getter_(this);
   
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLOListElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLOListElement.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30650,11 +28703,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ObjectElement internalCreateObjectElement() {
-    return new ObjectElement._internalWrap();
-  }
-
-  external factory ObjectElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ObjectElement.internal_() : super.internal_();
@@ -30671,88 +28720,88 @@
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  String get data => _blink.BlinkHTMLObjectElement.instance.data_Getter_(unwrap_jso(this));
+  String get data => _blink.BlinkHTMLObjectElement.instance.data_Getter_(this);
   
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  set data(String value) => _blink.BlinkHTMLObjectElement.instance.data_Setter_(unwrap_jso(this), value);
+  set data(String value) => _blink.BlinkHTMLObjectElement.instance.data_Setter_(this, value);
   
   @DomName('HTMLObjectElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLObjectElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLObjectElement.instance.form_Getter_(this);
   
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  String get height => _blink.BlinkHTMLObjectElement.instance.height_Getter_(unwrap_jso(this));
+  String get height => _blink.BlinkHTMLObjectElement.instance.height_Getter_(this);
   
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  set height(String value) => _blink.BlinkHTMLObjectElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(String value) => _blink.BlinkHTMLObjectElement.instance.height_Setter_(this, value);
   
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLObjectElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLObjectElement.instance.name_Getter_(this);
   
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLObjectElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLObjectElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLObjectElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLObjectElement.instance.type_Getter_(this);
   
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLObjectElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLObjectElement.instance.type_Setter_(this, value);
   
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.BlinkHTMLObjectElement.instance.useMap_Getter_(unwrap_jso(this));
+  String get useMap => _blink.BlinkHTMLObjectElement.instance.useMap_Getter_(this);
   
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  set useMap(String value) => _blink.BlinkHTMLObjectElement.instance.useMap_Setter_(unwrap_jso(this), value);
+  set useMap(String value) => _blink.BlinkHTMLObjectElement.instance.useMap_Setter_(this, value);
   
   @DomName('HTMLObjectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLObjectElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLObjectElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLObjectElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLObjectElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLObjectElement.instance.validity_Getter_(this);
   
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  String get width => _blink.BlinkHTMLObjectElement.instance.width_Getter_(unwrap_jso(this));
+  String get width => _blink.BlinkHTMLObjectElement.instance.width_Getter_(this);
   
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  set width(String value) => _blink.BlinkHTMLObjectElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(String value) => _blink.BlinkHTMLObjectElement.instance.width_Setter_(this, value);
   
   @DomName('HTMLObjectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLObjectElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLObjectElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.BlinkHTMLObjectElement.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLObjectElement.instance.$__getter___Callback_1_(this, index_OR_name);
   
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLObjectElement.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), unwrap_jso(value));
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLObjectElement.instance.$__setter___Callback_2_(this, index_OR_name, value);
   
   @DomName('HTMLObjectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLObjectElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLObjectElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLObjectElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLObjectElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLObjectElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLObjectElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLObjectElement.instance.setCustomValidity_Callback_1_(this, error);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30774,11 +28823,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static OptGroupElement internalCreateOptGroupElement() {
-    return new OptGroupElement._internalWrap();
-  }
-
-  external factory OptGroupElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OptGroupElement.internal_() : super.internal_();
@@ -30792,19 +28837,19 @@
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLOptGroupElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLOptGroupElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  String get label => _blink.BlinkHTMLOptGroupElement.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkHTMLOptGroupElement.instance.label_Getter_(this);
   
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  set label(String value) => _blink.BlinkHTMLOptGroupElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLOptGroupElement.instance.label_Setter_(this, value);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -30822,21 +28867,17 @@
   @DocsEditable()
   factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) {
     if (selected != null) {
-      return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_4_(data, value, defaultSelected, selected));
+      return _blink.BlinkHTMLOptionElement.instance.constructorCallback_4_(data, value, defaultSelected, selected);
     }
     if (defaultSelected != null) {
-      return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_3_(data, value, defaultSelected));
+      return _blink.BlinkHTMLOptionElement.instance.constructorCallback_3_(data, value, defaultSelected);
     }
-    return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_2_(data, value));
+    return _blink.BlinkHTMLOptionElement.instance.constructorCallback_2_(data, value);
   }
 
 
   @Deprecated("Internal Use Only")
-  static OptionElement internalCreateOptionElement() {
-    return new OptionElement._internalWrap();
-  }
-
-  external factory OptionElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OptionElement.internal_() : super.internal_();
@@ -30850,51 +28891,51 @@
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  bool get defaultSelected => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Getter_(unwrap_jso(this));
+  bool get defaultSelected => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Getter_(this);
   
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Setter_(unwrap_jso(this), value);
+  set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Setter_(this, value);
   
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLOptionElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLOptionElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLOptionElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLOptionElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLOptionElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLOptionElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLOptionElement.instance.form_Getter_(this);
   
   @DomName('HTMLOptionElement.index')
   @DocsEditable()
-  int get index => _blink.BlinkHTMLOptionElement.instance.index_Getter_(unwrap_jso(this));
+  int get index => _blink.BlinkHTMLOptionElement.instance.index_Getter_(this);
   
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  String get label => _blink.BlinkHTMLOptionElement.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkHTMLOptionElement.instance.label_Getter_(this);
   
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  set label(String value) => _blink.BlinkHTMLOptionElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLOptionElement.instance.label_Setter_(this, value);
   
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  bool get selected => _blink.BlinkHTMLOptionElement.instance.selected_Getter_(unwrap_jso(this));
+  bool get selected => _blink.BlinkHTMLOptionElement.instance.selected_Getter_(this);
   
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  set selected(bool value) => _blink.BlinkHTMLOptionElement.instance.selected_Setter_(unwrap_jso(this), value);
+  set selected(bool value) => _blink.BlinkHTMLOptionElement.instance.selected_Setter_(this, value);
   
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLOptionElement.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkHTMLOptionElement.instance.value_Getter_(this);
   
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkHTMLOptionElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLOptionElement.instance.value_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30919,11 +28960,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static OutputElement internalCreateOutputElement() {
-    return new OutputElement._internalWrap();
-  }
-
-  external factory OutputElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OutputElement.internal_() : super.internal_();
@@ -30940,69 +28977,69 @@
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.BlinkHTMLOutputElement.instance.defaultValue_Getter_(unwrap_jso(this));
+  String get defaultValue => _blink.BlinkHTMLOutputElement.instance.defaultValue_Getter_(this);
   
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  set defaultValue(String value) => _blink.BlinkHTMLOutputElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
+  set defaultValue(String value) => _blink.BlinkHTMLOutputElement.instance.defaultValue_Setter_(this, value);
   
   @DomName('HTMLOutputElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLOutputElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLOutputElement.instance.form_Getter_(this);
   
   @DomName('HTMLOutputElement.htmlFor')
   @DocsEditable()
-  DomSettableTokenList get htmlFor => wrap_jso(_blink.BlinkHTMLOutputElement.instance.htmlFor_Getter_(unwrap_jso(this)));
+  DomSettableTokenList get htmlFor => _blink.BlinkHTMLOutputElement.instance.htmlFor_Getter_(this);
   
   @DomName('HTMLOutputElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLOutputElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLOutputElement.instance.labels_Getter_(this));
   
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLOutputElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLOutputElement.instance.name_Getter_(this);
   
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLOutputElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLOutputElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLOutputElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLOutputElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLOutputElement.instance.type_Getter_(this);
   
   @DomName('HTMLOutputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLOutputElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLOutputElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLOutputElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLOutputElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLOutputElement.instance.validity_Getter_(this);
   
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLOutputElement.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkHTMLOutputElement.instance.value_Getter_(this);
   
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkHTMLOutputElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLOutputElement.instance.value_Setter_(this, value);
   
   @DomName('HTMLOutputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLOutputElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLOutputElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLOutputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLOutputElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLOutputElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLOutputElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLOutputElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLOutputElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLOutputElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLOutputElement.instance.setCustomValidity_Callback_1_(this, error);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31025,18 +29062,14 @@
   factory PageTransitionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkPageTransitionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkPageTransitionEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkPageTransitionEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkPageTransitionEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static PageTransitionEvent internalCreatePageTransitionEvent() {
-    return new PageTransitionEvent._internalWrap();
-  }
-
-  external factory PageTransitionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PageTransitionEvent.internal_() : super.internal_();
@@ -31044,7 +29077,7 @@
 
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
-  bool get persisted => _blink.BlinkPageTransitionEvent.instance.persisted_Getter_(unwrap_jso(this));
+  bool get persisted => _blink.BlinkPageTransitionEvent.instance.persisted_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31066,11 +29099,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ParagraphElement internalCreateParagraphElement() {
-    return new ParagraphElement._internalWrap();
-  }
-
-  external factory ParagraphElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ParagraphElement.internal_() : super.internal_();
@@ -31103,11 +29132,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ParamElement internalCreateParamElement() {
-    return new ParamElement._internalWrap();
-  }
-
-  external factory ParamElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ParamElement.internal_() : super.internal_();
@@ -31121,19 +29146,19 @@
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLParamElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLParamElement.instance.name_Getter_(this);
   
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLParamElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLParamElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLParamElement.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkHTMLParamElement.instance.value_Getter_(this);
   
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkHTMLParamElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLParamElement.instance.value_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31199,21 +29224,17 @@
   @DocsEditable()
   factory PasswordCredential(String id, String password, [String name, String iconURL]) {
     if (iconURL != null) {
-      return wrap_jso(_blink.BlinkPasswordCredential.instance.constructorCallback_4_(id, password, name, iconURL));
+      return _blink.BlinkPasswordCredential.instance.constructorCallback_4_(id, password, name, iconURL);
     }
     if (name != null) {
-      return wrap_jso(_blink.BlinkPasswordCredential.instance.constructorCallback_3_(id, password, name));
+      return _blink.BlinkPasswordCredential.instance.constructorCallback_3_(id, password, name);
     }
-    return wrap_jso(_blink.BlinkPasswordCredential.instance.constructorCallback_2_(id, password));
+    return _blink.BlinkPasswordCredential.instance.constructorCallback_2_(id, password);
   }
 
 
   @Deprecated("Internal Use Only")
-  static PasswordCredential internalCreatePasswordCredential() {
-    return new PasswordCredential._internalWrap();
-  }
-
-  external factory PasswordCredential._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PasswordCredential.internal_() : super.internal_();
@@ -31222,12 +29243,12 @@
   @DomName('PasswordCredential.formData')
   @DocsEditable()
   @Experimental() // untriaged
-  FormData get formData => wrap_jso(_blink.BlinkPasswordCredential.instance.formData_Getter_(unwrap_jso(this)));
+  FormData get formData => _blink.BlinkPasswordCredential.instance.formData_Getter_(this);
   
   @DomName('PasswordCredential.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkPasswordCredential.instance.password_Getter_(unwrap_jso(this));
+  String get password => _blink.BlinkPasswordCredential.instance.password_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31248,85 +29269,77 @@
   @DocsEditable()
   factory Path2D([path_OR_text]) {
     if (path_OR_text == null) {
-      return wrap_jso(_blink.BlinkPath2D.instance.constructorCallback_0_());
+      return _blink.BlinkPath2D.instance.constructorCallback_0_();
     }
     if ((path_OR_text is Path2D || path_OR_text == null)) {
-      return wrap_jso(_blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text));
+      return _blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text);
     }
     if ((path_OR_text is String || path_OR_text == null)) {
-      return wrap_jso(_blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text));
+      return _blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @Deprecated("Internal Use Only")
-  static Path2D internalCreatePath2D() {
-    return new Path2D._internalWrap();
-  }
 
-  factory Path2D._internalWrap() {
-    return new Path2D.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Path2D.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   void addPath(Path2D path, [Matrix transform]) {
     if (transform != null) {
-      _blink.BlinkPath2D.instance.addPath_Callback_2_(unwrap_jso(this), unwrap_jso(path), unwrap_jso(transform));
+      _blink.BlinkPath2D.instance.addPath_Callback_2_(this, path, transform);
       return;
     }
-    _blink.BlinkPath2D.instance.addPath_Callback_1_(unwrap_jso(this), unwrap_jso(path));
+    _blink.BlinkPath2D.instance.addPath_Callback_1_(this, path);
     return;
   }
 
   @DomName('Path2D.arc')
   @DocsEditable()
   @Experimental() // untriaged
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.instance.arc_Callback_6_(unwrap_jso(this), x, y, radius, startAngle, endAngle, anticlockwise);
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.instance.arc_Callback_6_(this, x, y, radius, startAngle, endAngle, anticlockwise);
   
   @DomName('Path2D.arcTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath2D.instance.arcTo_Callback_5_(unwrap_jso(this), x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath2D.instance.arcTo_Callback_5_(this, x1, y1, x2, y2, radius);
   
   @DomName('Path2D.bezierCurveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath2D.instance.bezierCurveTo_Callback_6_(unwrap_jso(this), cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath2D.instance.bezierCurveTo_Callback_6_(this, cp1x, cp1y, cp2x, cp2y, x, y);
   
   @DomName('Path2D.closePath')
   @DocsEditable()
   @Experimental() // untriaged
-  void closePath() => _blink.BlinkPath2D.instance.closePath_Callback_0_(unwrap_jso(this));
+  void closePath() => _blink.BlinkPath2D.instance.closePath_Callback_0_(this);
   
   @DomName('Path2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.instance.ellipse_Callback_8_(unwrap_jso(this), x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.instance.ellipse_Callback_8_(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
   
   @DomName('Path2D.lineTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void lineTo(num x, num y) => _blink.BlinkPath2D.instance.lineTo_Callback_2_(unwrap_jso(this), x, y);
+  void lineTo(num x, num y) => _blink.BlinkPath2D.instance.lineTo_Callback_2_(this, x, y);
   
   @DomName('Path2D.moveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void moveTo(num x, num y) => _blink.BlinkPath2D.instance.moveTo_Callback_2_(unwrap_jso(this), x, y);
+  void moveTo(num x, num y) => _blink.BlinkPath2D.instance.moveTo_Callback_2_(this, x, y);
   
   @DomName('Path2D.quadraticCurveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath2D.instance.quadraticCurveTo_Callback_4_(unwrap_jso(this), cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath2D.instance.quadraticCurveTo_Callback_4_(this, cpx, cpy, x, y);
   
   @DomName('Path2D.rect')
   @DocsEditable()
   @Experimental() // untriaged
-  void rect(num x, num y, num width, num height) => _blink.BlinkPath2D.instance.rect_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkPath2D.instance.rect_Callback_4_(this, x, y, width, height);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31361,11 +29374,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Performance internalCreatePerformance() {
-    return new Performance._internalWrap();
-  }
-
-  external factory Performance._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Performance.internal_() : super.internal_();
@@ -31377,71 +29386,71 @@
   @DomName('Performance.memory')
   @DocsEditable()
   @Experimental() // nonstandard
-  MemoryInfo get memory => wrap_jso(_blink.BlinkPerformance.instance.memory_Getter_(unwrap_jso(this)));
+  MemoryInfo get memory => _blink.BlinkPerformance.instance.memory_Getter_(this);
   
   @DomName('Performance.navigation')
   @DocsEditable()
-  PerformanceNavigation get navigation => wrap_jso(_blink.BlinkPerformance.instance.navigation_Getter_(unwrap_jso(this)));
+  PerformanceNavigation get navigation => _blink.BlinkPerformance.instance.navigation_Getter_(this);
   
   @DomName('Performance.timing')
   @DocsEditable()
-  PerformanceTiming get timing => wrap_jso(_blink.BlinkPerformance.instance.timing_Getter_(unwrap_jso(this)));
+  PerformanceTiming get timing => _blink.BlinkPerformance.instance.timing_Getter_(this);
   
   @DomName('Performance.clearFrameTimings')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearFrameTimings() => _blink.BlinkPerformance.instance.clearFrameTimings_Callback_0_(unwrap_jso(this));
+  void clearFrameTimings() => _blink.BlinkPerformance.instance.clearFrameTimings_Callback_0_(this);
   
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMarks(String markName) => _blink.BlinkPerformance.instance.clearMarks_Callback_1_(unwrap_jso(this), markName);
+  void clearMarks(String markName) => _blink.BlinkPerformance.instance.clearMarks_Callback_1_(this, markName);
   
   @DomName('Performance.clearMeasures')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMeasures(String measureName) => _blink.BlinkPerformance.instance.clearMeasures_Callback_1_(unwrap_jso(this), measureName);
+  void clearMeasures(String measureName) => _blink.BlinkPerformance.instance.clearMeasures_Callback_1_(this, measureName);
   
   @DomName('Performance.getEntries')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntries() => wrap_jso(_blink.BlinkPerformance.instance.getEntries_Callback_0_(unwrap_jso(this)));
+  List<PerformanceEntry> getEntries() => (_blink.BlinkPerformance.instance.getEntries_Callback_0_(this));
   
   @DomName('Performance.getEntriesByName')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) => wrap_jso(_blink.BlinkPerformance.instance.getEntriesByName_Callback_2_(unwrap_jso(this), name, entryType));
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => (_blink.BlinkPerformance.instance.getEntriesByName_Callback_2_(this, name, entryType));
   
   @DomName('Performance.getEntriesByType')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByType(String entryType) => wrap_jso(_blink.BlinkPerformance.instance.getEntriesByType_Callback_1_(unwrap_jso(this), entryType));
+  List<PerformanceEntry> getEntriesByType(String entryType) => (_blink.BlinkPerformance.instance.getEntriesByType_Callback_1_(this, entryType));
   
   @DomName('Performance.mark')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void mark(String markName) => _blink.BlinkPerformance.instance.mark_Callback_1_(unwrap_jso(this), markName);
+  void mark(String markName) => _blink.BlinkPerformance.instance.mark_Callback_1_(this, markName);
   
   @DomName('Performance.measure')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void measure(String measureName, String startMark, String endMark) => _blink.BlinkPerformance.instance.measure_Callback_3_(unwrap_jso(this), measureName, startMark, endMark);
+  void measure(String measureName, String startMark, String endMark) => _blink.BlinkPerformance.instance.measure_Callback_3_(this, measureName, startMark, endMark);
   
   @DomName('Performance.now')
   @DocsEditable()
-  num now() => _blink.BlinkPerformance.instance.now_Callback_0_(unwrap_jso(this));
+  num now() => _blink.BlinkPerformance.instance.now_Callback_0_(this);
   
   @DomName('Performance.setFrameTimingBufferSize')
   @DocsEditable()
   @Experimental() // untriaged
-  void setFrameTimingBufferSize(int maxSize) => _blink.BlinkPerformance.instance.setFrameTimingBufferSize_Callback_1_(unwrap_jso(this), maxSize);
+  void setFrameTimingBufferSize(int maxSize) => _blink.BlinkPerformance.instance.setFrameTimingBufferSize_Callback_1_(this, maxSize);
   
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -31449,7 +29458,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
-  void clearResourceTimings() => _blink.BlinkPerformance.instance.webkitClearResourceTimings_Callback_0_(unwrap_jso(this));
+  void clearResourceTimings() => _blink.BlinkPerformance.instance.webkitClearResourceTimings_Callback_0_(this);
   
   @DomName('Performance.webkitSetResourceTimingBufferSize')
   @DocsEditable()
@@ -31457,7 +29466,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkPerformance.instance.webkitSetResourceTimingBufferSize_Callback_1_(unwrap_jso(this), maxSize);
+  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkPerformance.instance.webkitSetResourceTimingBufferSize_Callback_1_(this, maxSize);
   
   /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
@@ -31483,11 +29492,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PerformanceCompositeTiming internalCreatePerformanceCompositeTiming() {
-    return new PerformanceCompositeTiming._internalWrap();
-  }
-
-  external factory PerformanceCompositeTiming._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceCompositeTiming.internal_() : super.internal_();
@@ -31496,7 +29501,7 @@
   @DomName('PerformanceCompositeTiming.sourceFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  int get sourceFrame => _blink.BlinkPerformanceCompositeTiming.instance.sourceFrame_Getter_(unwrap_jso(this));
+  int get sourceFrame => _blink.BlinkPerformanceCompositeTiming.instance.sourceFrame_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31514,36 +29519,28 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceEntry._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PerformanceEntry internalCreatePerformanceEntry() {
-    return new PerformanceEntry._internalWrap();
-  }
 
-  factory PerformanceEntry._internalWrap() {
-    return new PerformanceEntry.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceEntry.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  num get duration => _blink.BlinkPerformanceEntry.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkPerformanceEntry.instance.duration_Getter_(this);
   
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
-  String get entryType => _blink.BlinkPerformanceEntry.instance.entryType_Getter_(unwrap_jso(this));
+  String get entryType => _blink.BlinkPerformanceEntry.instance.entryType_Getter_(this);
   
   @DomName('PerformanceEntry.name')
   @DocsEditable()
-  String get name => _blink.BlinkPerformanceEntry.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkPerformanceEntry.instance.name_Getter_(this);
   
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  num get startTime => _blink.BlinkPerformanceEntry.instance.startTime_Getter_(unwrap_jso(this));
+  num get startTime => _blink.BlinkPerformanceEntry.instance.startTime_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31563,11 +29560,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PerformanceMark internalCreatePerformanceMark() {
-    return new PerformanceMark._internalWrap();
-  }
-
-  external factory PerformanceMark._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceMark.internal_() : super.internal_();
@@ -31591,11 +29584,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PerformanceMeasure internalCreatePerformanceMeasure() {
-    return new PerformanceMeasure._internalWrap();
-  }
-
-  external factory PerformanceMeasure._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceMeasure.internal_() : super.internal_();
@@ -31616,21 +29605,13 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceNavigation._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PerformanceNavigation internalCreatePerformanceNavigation() {
-    return new PerformanceNavigation._internalWrap();
-  }
 
-  factory PerformanceNavigation._internalWrap() {
-    return new PerformanceNavigation.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceNavigation.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PerformanceNavigation.TYPE_BACK_FORWARD')
   @DocsEditable()
   static const int TYPE_BACK_FORWARD = 2;
@@ -31649,11 +29630,11 @@
 
   @DomName('PerformanceNavigation.redirectCount')
   @DocsEditable()
-  int get redirectCount => _blink.BlinkPerformanceNavigation.instance.redirectCount_Getter_(unwrap_jso(this));
+  int get redirectCount => _blink.BlinkPerformanceNavigation.instance.redirectCount_Getter_(this);
   
   @DomName('PerformanceNavigation.type')
   @DocsEditable()
-  int get type => _blink.BlinkPerformanceNavigation.instance.type_Getter_(unwrap_jso(this));
+  int get type => _blink.BlinkPerformanceNavigation.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31672,11 +29653,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PerformanceRenderTiming internalCreatePerformanceRenderTiming() {
-    return new PerformanceRenderTiming._internalWrap();
-  }
-
-  external factory PerformanceRenderTiming._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceRenderTiming.internal_() : super.internal_();
@@ -31685,7 +29662,7 @@
   @DomName('PerformanceRenderTiming.sourceFrame')
   @DocsEditable()
   @Experimental() // untriaged
-  int get sourceFrame => _blink.BlinkPerformanceRenderTiming.instance.sourceFrame_Getter_(unwrap_jso(this));
+  int get sourceFrame => _blink.BlinkPerformanceRenderTiming.instance.sourceFrame_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31705,11 +29682,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PerformanceResourceTiming internalCreatePerformanceResourceTiming() {
-    return new PerformanceResourceTiming._internalWrap();
-  }
-
-  external factory PerformanceResourceTiming._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceResourceTiming.internal_() : super.internal_();
@@ -31717,59 +29690,59 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  num get connectEnd => _blink.BlinkPerformanceResourceTiming.instance.connectEnd_Getter_(unwrap_jso(this));
+  num get connectEnd => _blink.BlinkPerformanceResourceTiming.instance.connectEnd_Getter_(this);
   
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  num get connectStart => _blink.BlinkPerformanceResourceTiming.instance.connectStart_Getter_(unwrap_jso(this));
+  num get connectStart => _blink.BlinkPerformanceResourceTiming.instance.connectStart_Getter_(this);
   
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  num get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.instance.domainLookupEnd_Getter_(unwrap_jso(this));
+  num get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.instance.domainLookupEnd_Getter_(this);
   
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  num get domainLookupStart => _blink.BlinkPerformanceResourceTiming.instance.domainLookupStart_Getter_(unwrap_jso(this));
+  num get domainLookupStart => _blink.BlinkPerformanceResourceTiming.instance.domainLookupStart_Getter_(this);
   
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  num get fetchStart => _blink.BlinkPerformanceResourceTiming.instance.fetchStart_Getter_(unwrap_jso(this));
+  num get fetchStart => _blink.BlinkPerformanceResourceTiming.instance.fetchStart_Getter_(this);
   
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
-  String get initiatorType => _blink.BlinkPerformanceResourceTiming.instance.initiatorType_Getter_(unwrap_jso(this));
+  String get initiatorType => _blink.BlinkPerformanceResourceTiming.instance.initiatorType_Getter_(this);
   
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  num get redirectEnd => _blink.BlinkPerformanceResourceTiming.instance.redirectEnd_Getter_(unwrap_jso(this));
+  num get redirectEnd => _blink.BlinkPerformanceResourceTiming.instance.redirectEnd_Getter_(this);
   
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  num get redirectStart => _blink.BlinkPerformanceResourceTiming.instance.redirectStart_Getter_(unwrap_jso(this));
+  num get redirectStart => _blink.BlinkPerformanceResourceTiming.instance.redirectStart_Getter_(this);
   
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  num get requestStart => _blink.BlinkPerformanceResourceTiming.instance.requestStart_Getter_(unwrap_jso(this));
+  num get requestStart => _blink.BlinkPerformanceResourceTiming.instance.requestStart_Getter_(this);
   
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  num get responseEnd => _blink.BlinkPerformanceResourceTiming.instance.responseEnd_Getter_(unwrap_jso(this));
+  num get responseEnd => _blink.BlinkPerformanceResourceTiming.instance.responseEnd_Getter_(this);
   
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  num get responseStart => _blink.BlinkPerformanceResourceTiming.instance.responseStart_Getter_(unwrap_jso(this));
+  num get responseStart => _blink.BlinkPerformanceResourceTiming.instance.responseStart_Getter_(this);
   
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  num get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.instance.secureConnectionStart_Getter_(unwrap_jso(this));
+  num get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.instance.secureConnectionStart_Getter_(this);
   
   @DomName('PerformanceResourceTiming.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get workerStart => _blink.BlinkPerformanceResourceTiming.instance.workerStart_Getter_(unwrap_jso(this));
+  num get workerStart => _blink.BlinkPerformanceResourceTiming.instance.workerStart_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31786,104 +29759,96 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceTiming._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PerformanceTiming internalCreatePerformanceTiming() {
-    return new PerformanceTiming._internalWrap();
-  }
 
-  factory PerformanceTiming._internalWrap() {
-    return new PerformanceTiming.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PerformanceTiming.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PerformanceTiming.connectEnd')
   @DocsEditable()
-  int get connectEnd => _blink.BlinkPerformanceTiming.instance.connectEnd_Getter_(unwrap_jso(this));
+  int get connectEnd => _blink.BlinkPerformanceTiming.instance.connectEnd_Getter_(this);
   
   @DomName('PerformanceTiming.connectStart')
   @DocsEditable()
-  int get connectStart => _blink.BlinkPerformanceTiming.instance.connectStart_Getter_(unwrap_jso(this));
+  int get connectStart => _blink.BlinkPerformanceTiming.instance.connectStart_Getter_(this);
   
   @DomName('PerformanceTiming.domComplete')
   @DocsEditable()
-  int get domComplete => _blink.BlinkPerformanceTiming.instance.domComplete_Getter_(unwrap_jso(this));
+  int get domComplete => _blink.BlinkPerformanceTiming.instance.domComplete_Getter_(this);
   
   @DomName('PerformanceTiming.domContentLoadedEventEnd')
   @DocsEditable()
-  int get domContentLoadedEventEnd => _blink.BlinkPerformanceTiming.instance.domContentLoadedEventEnd_Getter_(unwrap_jso(this));
+  int get domContentLoadedEventEnd => _blink.BlinkPerformanceTiming.instance.domContentLoadedEventEnd_Getter_(this);
   
   @DomName('PerformanceTiming.domContentLoadedEventStart')
   @DocsEditable()
-  int get domContentLoadedEventStart => _blink.BlinkPerformanceTiming.instance.domContentLoadedEventStart_Getter_(unwrap_jso(this));
+  int get domContentLoadedEventStart => _blink.BlinkPerformanceTiming.instance.domContentLoadedEventStart_Getter_(this);
   
   @DomName('PerformanceTiming.domInteractive')
   @DocsEditable()
-  int get domInteractive => _blink.BlinkPerformanceTiming.instance.domInteractive_Getter_(unwrap_jso(this));
+  int get domInteractive => _blink.BlinkPerformanceTiming.instance.domInteractive_Getter_(this);
   
   @DomName('PerformanceTiming.domLoading')
   @DocsEditable()
-  int get domLoading => _blink.BlinkPerformanceTiming.instance.domLoading_Getter_(unwrap_jso(this));
+  int get domLoading => _blink.BlinkPerformanceTiming.instance.domLoading_Getter_(this);
   
   @DomName('PerformanceTiming.domainLookupEnd')
   @DocsEditable()
-  int get domainLookupEnd => _blink.BlinkPerformanceTiming.instance.domainLookupEnd_Getter_(unwrap_jso(this));
+  int get domainLookupEnd => _blink.BlinkPerformanceTiming.instance.domainLookupEnd_Getter_(this);
   
   @DomName('PerformanceTiming.domainLookupStart')
   @DocsEditable()
-  int get domainLookupStart => _blink.BlinkPerformanceTiming.instance.domainLookupStart_Getter_(unwrap_jso(this));
+  int get domainLookupStart => _blink.BlinkPerformanceTiming.instance.domainLookupStart_Getter_(this);
   
   @DomName('PerformanceTiming.fetchStart')
   @DocsEditable()
-  int get fetchStart => _blink.BlinkPerformanceTiming.instance.fetchStart_Getter_(unwrap_jso(this));
+  int get fetchStart => _blink.BlinkPerformanceTiming.instance.fetchStart_Getter_(this);
   
   @DomName('PerformanceTiming.loadEventEnd')
   @DocsEditable()
-  int get loadEventEnd => _blink.BlinkPerformanceTiming.instance.loadEventEnd_Getter_(unwrap_jso(this));
+  int get loadEventEnd => _blink.BlinkPerformanceTiming.instance.loadEventEnd_Getter_(this);
   
   @DomName('PerformanceTiming.loadEventStart')
   @DocsEditable()
-  int get loadEventStart => _blink.BlinkPerformanceTiming.instance.loadEventStart_Getter_(unwrap_jso(this));
+  int get loadEventStart => _blink.BlinkPerformanceTiming.instance.loadEventStart_Getter_(this);
   
   @DomName('PerformanceTiming.navigationStart')
   @DocsEditable()
-  int get navigationStart => _blink.BlinkPerformanceTiming.instance.navigationStart_Getter_(unwrap_jso(this));
+  int get navigationStart => _blink.BlinkPerformanceTiming.instance.navigationStart_Getter_(this);
   
   @DomName('PerformanceTiming.redirectEnd')
   @DocsEditable()
-  int get redirectEnd => _blink.BlinkPerformanceTiming.instance.redirectEnd_Getter_(unwrap_jso(this));
+  int get redirectEnd => _blink.BlinkPerformanceTiming.instance.redirectEnd_Getter_(this);
   
   @DomName('PerformanceTiming.redirectStart')
   @DocsEditable()
-  int get redirectStart => _blink.BlinkPerformanceTiming.instance.redirectStart_Getter_(unwrap_jso(this));
+  int get redirectStart => _blink.BlinkPerformanceTiming.instance.redirectStart_Getter_(this);
   
   @DomName('PerformanceTiming.requestStart')
   @DocsEditable()
-  int get requestStart => _blink.BlinkPerformanceTiming.instance.requestStart_Getter_(unwrap_jso(this));
+  int get requestStart => _blink.BlinkPerformanceTiming.instance.requestStart_Getter_(this);
   
   @DomName('PerformanceTiming.responseEnd')
   @DocsEditable()
-  int get responseEnd => _blink.BlinkPerformanceTiming.instance.responseEnd_Getter_(unwrap_jso(this));
+  int get responseEnd => _blink.BlinkPerformanceTiming.instance.responseEnd_Getter_(this);
   
   @DomName('PerformanceTiming.responseStart')
   @DocsEditable()
-  int get responseStart => _blink.BlinkPerformanceTiming.instance.responseStart_Getter_(unwrap_jso(this));
+  int get responseStart => _blink.BlinkPerformanceTiming.instance.responseStart_Getter_(this);
   
   @DomName('PerformanceTiming.secureConnectionStart')
   @DocsEditable()
-  int get secureConnectionStart => _blink.BlinkPerformanceTiming.instance.secureConnectionStart_Getter_(unwrap_jso(this));
+  int get secureConnectionStart => _blink.BlinkPerformanceTiming.instance.secureConnectionStart_Getter_(this);
   
   @DomName('PerformanceTiming.unloadEventEnd')
   @DocsEditable()
-  int get unloadEventEnd => _blink.BlinkPerformanceTiming.instance.unloadEventEnd_Getter_(unwrap_jso(this));
+  int get unloadEventEnd => _blink.BlinkPerformanceTiming.instance.unloadEventEnd_Getter_(this);
   
   @DomName('PerformanceTiming.unloadEventStart')
   @DocsEditable()
-  int get unloadEventStart => _blink.BlinkPerformanceTiming.instance.unloadEventStart_Getter_(unwrap_jso(this));
+  int get unloadEventStart => _blink.BlinkPerformanceTiming.instance.unloadEventStart_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31904,16 +29869,12 @@
   @DocsEditable()
   factory PeriodicSyncEvent(String type, Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
-    return wrap_jso(_blink.BlinkPeriodicSyncEvent.instance.constructorCallback_2_(type, init_1));
+    return _blink.BlinkPeriodicSyncEvent.instance.constructorCallback_2_(type, init_1);
   }
 
 
   @Deprecated("Internal Use Only")
-  static PeriodicSyncEvent internalCreatePeriodicSyncEvent() {
-    return new PeriodicSyncEvent._internalWrap();
-  }
-
-  external factory PeriodicSyncEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PeriodicSyncEvent.internal_() : super.internal_();
@@ -31922,7 +29883,7 @@
   @DomName('PeriodicSyncEvent.registration')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicSyncRegistration get registration => wrap_jso(_blink.BlinkPeriodicSyncEvent.instance.registration_Getter_(unwrap_jso(this)));
+  PeriodicSyncRegistration get registration => _blink.BlinkPeriodicSyncEvent.instance.registration_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31939,46 +29900,38 @@
   // To suppress missing implicit constructor warnings.
   factory PeriodicSyncManager._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PeriodicSyncManager internalCreatePeriodicSyncManager() {
-    return new PeriodicSyncManager._internalWrap();
-  }
 
-  factory PeriodicSyncManager._internalWrap() {
-    return new PeriodicSyncManager.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PeriodicSyncManager.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PeriodicSyncManager.minPossiblePeriod')
   @DocsEditable()
   @Experimental() // untriaged
-  int get minPossiblePeriod => _blink.BlinkPeriodicSyncManager.instance.minPossiblePeriod_Getter_(unwrap_jso(this));
+  int get minPossiblePeriod => _blink.BlinkPeriodicSyncManager.instance.minPossiblePeriod_Getter_(this);
   
   @DomName('PeriodicSyncManager.getRegistration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistration(String tag) => wrap_jso(_blink.BlinkPeriodicSyncManager.instance.getRegistration_Callback_1_(unwrap_jso(this), tag));
+  Future getRegistration(String tag) => convertNativePromiseToDartFuture(_blink.BlinkPeriodicSyncManager.instance.getRegistration_Callback_1_(this, tag));
   
   @DomName('PeriodicSyncManager.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() => wrap_jso(_blink.BlinkPeriodicSyncManager.instance.getRegistrations_Callback_0_(unwrap_jso(this)));
+  Future getRegistrations() => convertNativePromiseToDartFuture(_blink.BlinkPeriodicSyncManager.instance.getRegistrations_Callback_0_(this));
   
   @DomName('PeriodicSyncManager.permissionState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future permissionState() => wrap_jso(_blink.BlinkPeriodicSyncManager.instance.permissionState_Callback_0_(unwrap_jso(this)));
+  Future permissionState() => convertNativePromiseToDartFuture(_blink.BlinkPeriodicSyncManager.instance.permissionState_Callback_0_(this));
   
   Future register([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkPeriodicSyncManager.instance.register_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkPeriodicSyncManager.instance.register_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkPeriodicSyncManager.instance.register_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkPeriodicSyncManager.instance.register_Callback_0_(this);
   }
 
 }
@@ -31996,45 +29949,37 @@
   // To suppress missing implicit constructor warnings.
   factory PeriodicSyncRegistration._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PeriodicSyncRegistration internalCreatePeriodicSyncRegistration() {
-    return new PeriodicSyncRegistration._internalWrap();
-  }
 
-  factory PeriodicSyncRegistration._internalWrap() {
-    return new PeriodicSyncRegistration.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PeriodicSyncRegistration.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PeriodicSyncRegistration.minPeriod')
   @DocsEditable()
   @Experimental() // untriaged
-  int get minPeriod => _blink.BlinkPeriodicSyncRegistration.instance.minPeriod_Getter_(unwrap_jso(this));
+  int get minPeriod => _blink.BlinkPeriodicSyncRegistration.instance.minPeriod_Getter_(this);
   
   @DomName('PeriodicSyncRegistration.networkState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get networkState => _blink.BlinkPeriodicSyncRegistration.instance.networkState_Getter_(unwrap_jso(this));
+  String get networkState => _blink.BlinkPeriodicSyncRegistration.instance.networkState_Getter_(this);
   
   @DomName('PeriodicSyncRegistration.powerState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get powerState => _blink.BlinkPeriodicSyncRegistration.instance.powerState_Getter_(unwrap_jso(this));
+  String get powerState => _blink.BlinkPeriodicSyncRegistration.instance.powerState_Getter_(this);
   
   @DomName('PeriodicSyncRegistration.tag')
   @DocsEditable()
   @Experimental() // untriaged
-  String get tag => _blink.BlinkPeriodicSyncRegistration.instance.tag_Getter_(unwrap_jso(this));
+  String get tag => _blink.BlinkPeriodicSyncRegistration.instance.tag_Getter_(this);
   
   @DomName('PeriodicSyncRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() => wrap_jso(_blink.BlinkPeriodicSyncRegistration.instance.unregister_Callback_0_(unwrap_jso(this)));
+  Future unregister() => convertNativePromiseToDartFuture(_blink.BlinkPeriodicSyncRegistration.instance.unregister_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32058,11 +30003,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PermissionStatus internalCreatePermissionStatus() {
-    return new PermissionStatus._internalWrap();
-  }
-
-  external factory PermissionStatus._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PermissionStatus.internal_() : super.internal_();
@@ -32071,12 +30012,12 @@
   @DomName('PermissionStatus.state')
   @DocsEditable()
   @Experimental() // untriaged
-  String get state => _blink.BlinkPermissionStatus.instance.state_Getter_(unwrap_jso(this));
+  String get state => _blink.BlinkPermissionStatus.instance.state_Getter_(this);
   
   @DomName('PermissionStatus.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.BlinkPermissionStatus.instance.status_Getter_(unwrap_jso(this));
+  String get status => _blink.BlinkPermissionStatus.instance.status_Getter_(this);
   
   @DomName('PermissionStatus.onchange')
   @DocsEditable()
@@ -32098,25 +30039,17 @@
   // To suppress missing implicit constructor warnings.
   factory Permissions._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Permissions internalCreatePermissions() {
-    return new Permissions._internalWrap();
-  }
 
-  factory Permissions._internalWrap() {
-    return new Permissions.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Permissions.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Permissions.query')
   @DocsEditable()
   @Experimental() // untriaged
-  Future query(Object permission) => wrap_jso(_blink.BlinkPermissions.instance.query_Callback_1_(unwrap_jso(this), permission));
+  Future query(Object permission) => convertNativePromiseToDartFuture(_blink.BlinkPermissions.instance.query_Callback_1_(this, permission));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32135,11 +30068,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PictureElement internalCreatePictureElement() {
-    return new PictureElement._internalWrap();
-  }
-
-  external factory PictureElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PictureElement.internal_() : super.internal_();
@@ -32166,47 +30095,39 @@
   // To suppress missing implicit constructor warnings.
   factory Plugin._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Plugin internalCreatePlugin() {
-    return new Plugin._internalWrap();
-  }
 
-  factory Plugin._internalWrap() {
-    return new Plugin.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Plugin.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Plugin.description')
   @DocsEditable()
-  String get description => _blink.BlinkPlugin.instance.description_Getter_(unwrap_jso(this));
+  String get description => _blink.BlinkPlugin.instance.description_Getter_(this);
   
   @DomName('Plugin.filename')
   @DocsEditable()
-  String get filename => _blink.BlinkPlugin.instance.filename_Getter_(unwrap_jso(this));
+  String get filename => _blink.BlinkPlugin.instance.filename_Getter_(this);
   
   @DomName('Plugin.length')
   @DocsEditable()
-  int get length => _blink.BlinkPlugin.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkPlugin.instance.length_Getter_(this);
   
   @DomName('Plugin.name')
   @DocsEditable()
-  String get name => _blink.BlinkPlugin.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkPlugin.instance.name_Getter_(this);
   
   @DomName('Plugin.item')
   @DocsEditable()
-  MimeType item(int index) => wrap_jso(_blink.BlinkPlugin.instance.item_Callback_1_(unwrap_jso(this), index));
+  MimeType item(int index) => _blink.BlinkPlugin.instance.item_Callback_1_(this, index);
   
   MimeType namedItem(String name) {
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkPlugin.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkPlugin.instance.namedItem_Callback_1_(this, name);
     }
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkPlugin.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkPlugin.instance.namedItem_Callback_1_(this, name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -32226,32 +30147,24 @@
   // To suppress missing implicit constructor warnings.
   factory PluginArray._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PluginArray internalCreatePluginArray() {
-    return new PluginArray._internalWrap();
-  }
 
-  factory PluginArray._internalWrap() {
-    return new PluginArray.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PluginArray.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PluginArray.length')
   @DocsEditable()
-  int get length => _blink.BlinkPluginArray.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkPluginArray.instance.length_Getter_(this);
   
   Plugin operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkPluginArray.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Plugin _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkPluginArray.instance.item_Callback_1_(unwrap_jso(this), index));
+  Plugin _nativeIndexedGetter(int index) => (_blink.BlinkPluginArray.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32293,21 +30206,21 @@
 
   @DomName('PluginArray.item')
   @DocsEditable()
-  Plugin item(int index) => wrap_jso(_blink.BlinkPluginArray.instance.item_Callback_1_(unwrap_jso(this), index));
+  Plugin item(int index) => _blink.BlinkPluginArray.instance.item_Callback_1_(this, index);
   
   Plugin namedItem(String name) {
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkPluginArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkPluginArray.instance.namedItem_Callback_1_(this, name);
     }
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkPluginArray.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkPluginArray.instance.namedItem_Callback_1_(this, name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('PluginArray.refresh')
   @DocsEditable()
-  void refresh(bool reload) => _blink.BlinkPluginArray.instance.refresh_Callback_1_(unwrap_jso(this), reload);
+  void refresh(bool reload) => _blink.BlinkPluginArray.instance.refresh_Callback_1_(this, reload);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32326,11 +30239,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PluginPlaceholderElement internalCreatePluginPlaceholderElement() {
-    return new PluginPlaceholderElement._internalWrap();
-  }
-
-  external factory PluginPlaceholderElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PluginPlaceholderElement.internal_() : super.internal_();
@@ -32345,27 +30254,27 @@
   @DomName('PluginPlaceholderElement.closeable')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get closeable => _blink.BlinkPluginPlaceholderElement.instance.closeable_Getter_(unwrap_jso(this));
+  bool get closeable => _blink.BlinkPluginPlaceholderElement.instance.closeable_Getter_(this);
   
   @DomName('PluginPlaceholderElement.closeable')
   @DocsEditable()
   @Experimental() // untriaged
-  set closeable(bool value) => _blink.BlinkPluginPlaceholderElement.instance.closeable_Setter_(unwrap_jso(this), value);
+  set closeable(bool value) => _blink.BlinkPluginPlaceholderElement.instance.closeable_Setter_(this, value);
   
   @DomName('PluginPlaceholderElement.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message => _blink.BlinkPluginPlaceholderElement.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkPluginPlaceholderElement.instance.message_Getter_(this);
   
   @DomName('PluginPlaceholderElement.message')
   @DocsEditable()
   @Experimental() // untriaged
-  set message(String value) => _blink.BlinkPluginPlaceholderElement.instance.message_Setter_(unwrap_jso(this), value);
+  set message(String value) => _blink.BlinkPluginPlaceholderElement.instance.message_Setter_(this, value);
   
   @DomName('PluginPlaceholderElement.createdCallback')
   @DocsEditable()
   @Experimental() // untriaged
-  void createdCallback() => _blink.BlinkPluginPlaceholderElement.instance.createdCallback_Callback_0_(unwrap_jso(this));
+  void createdCallback() => _blink.BlinkPluginPlaceholderElement.instance.createdCallback_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32387,18 +30296,14 @@
   factory PointerEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkPointerEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkPointerEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkPointerEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkPointerEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static PointerEvent internalCreatePointerEvent() {
-    return new PointerEvent._internalWrap();
-  }
-
-  external factory PointerEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PointerEvent.internal_() : super.internal_();
@@ -32407,42 +30312,42 @@
   @DomName('PointerEvent.height')
   @DocsEditable()
   @Experimental() // untriaged
-  num get height => _blink.BlinkPointerEvent.instance.height_Getter_(unwrap_jso(this));
+  num get height => _blink.BlinkPointerEvent.instance.height_Getter_(this);
   
   @DomName('PointerEvent.isPrimary')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isPrimary => _blink.BlinkPointerEvent.instance.isPrimary_Getter_(unwrap_jso(this));
+  bool get isPrimary => _blink.BlinkPointerEvent.instance.isPrimary_Getter_(this);
   
   @DomName('PointerEvent.pointerId')
   @DocsEditable()
   @Experimental() // untriaged
-  int get pointerId => _blink.BlinkPointerEvent.instance.pointerId_Getter_(unwrap_jso(this));
+  int get pointerId => _blink.BlinkPointerEvent.instance.pointerId_Getter_(this);
   
   @DomName('PointerEvent.pointerType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pointerType => _blink.BlinkPointerEvent.instance.pointerType_Getter_(unwrap_jso(this));
+  String get pointerType => _blink.BlinkPointerEvent.instance.pointerType_Getter_(this);
   
   @DomName('PointerEvent.pressure')
   @DocsEditable()
   @Experimental() // untriaged
-  num get pressure => _blink.BlinkPointerEvent.instance.pressure_Getter_(unwrap_jso(this));
+  num get pressure => _blink.BlinkPointerEvent.instance.pressure_Getter_(this);
   
   @DomName('PointerEvent.tiltX')
   @DocsEditable()
   @Experimental() // untriaged
-  int get tiltX => _blink.BlinkPointerEvent.instance.tiltX_Getter_(unwrap_jso(this));
+  int get tiltX => _blink.BlinkPointerEvent.instance.tiltX_Getter_(this);
   
   @DomName('PointerEvent.tiltY')
   @DocsEditable()
   @Experimental() // untriaged
-  int get tiltY => _blink.BlinkPointerEvent.instance.tiltY_Getter_(unwrap_jso(this));
+  int get tiltY => _blink.BlinkPointerEvent.instance.tiltY_Getter_(this);
   
   @DomName('PointerEvent.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.BlinkPointerEvent.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkPointerEvent.instance.width_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32467,18 +30372,14 @@
   factory PopStateEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkPopStateEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkPopStateEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkPopStateEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkPopStateEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static PopStateEvent internalCreatePopStateEvent() {
-    return new PopStateEvent._internalWrap();
-  }
-
-  external factory PopStateEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PopStateEvent.internal_() : super.internal_();
@@ -32486,7 +30387,7 @@
 
   @DomName('PopStateEvent.state')
   @DocsEditable()
-  Object get state => wrap_jso(_blink.BlinkPopStateEvent.instance.state_Getter_(unwrap_jso(this)));
+  Object get state => convertNativeToDart_SerializedScriptValue(_blink.BlinkPopStateEvent.instance.state_Getter_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32513,21 +30414,13 @@
   // To suppress missing implicit constructor warnings.
   factory PositionError._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PositionError internalCreatePositionError() {
-    return new PositionError._internalWrap();
-  }
 
-  factory PositionError._internalWrap() {
-    return new PositionError.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PositionError.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PositionError.PERMISSION_DENIED')
   @DocsEditable()
   static const int PERMISSION_DENIED = 1;
@@ -32542,11 +30435,11 @@
 
   @DomName('PositionError.code')
   @DocsEditable()
-  int get code => _blink.BlinkPositionError.instance.code_Getter_(unwrap_jso(this));
+  int get code => _blink.BlinkPositionError.instance.code_Getter_(this);
   
   @DomName('PositionError.message')
   @DocsEditable()
-  String get message => _blink.BlinkPositionError.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkPositionError.instance.message_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32575,11 +30468,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PositionSensorVRDevice internalCreatePositionSensorVRDevice() {
-    return new PositionSensorVRDevice._internalWrap();
-  }
-
-  external factory PositionSensorVRDevice._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PositionSensorVRDevice.internal_() : super.internal_();
@@ -32588,17 +30477,17 @@
   @DomName('PositionSensorVRDevice.getImmediateState')
   @DocsEditable()
   @Experimental() // untriaged
-  VRPositionState getImmediateState() => wrap_jso(_blink.BlinkPositionSensorVRDevice.instance.getImmediateState_Callback_0_(unwrap_jso(this)));
+  VRPositionState getImmediateState() => _blink.BlinkPositionSensorVRDevice.instance.getImmediateState_Callback_0_(this);
   
   @DomName('PositionSensorVRDevice.getState')
   @DocsEditable()
   @Experimental() // untriaged
-  VRPositionState getState() => wrap_jso(_blink.BlinkPositionSensorVRDevice.instance.getState_Callback_0_(unwrap_jso(this)));
+  VRPositionState getState() => _blink.BlinkPositionSensorVRDevice.instance.getState_Callback_0_(this);
   
   @DomName('PositionSensorVRDevice.resetSensor')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetSensor() => _blink.BlinkPositionSensorVRDevice.instance.resetSensor_Callback_0_(unwrap_jso(this));
+  void resetSensor() => _blink.BlinkPositionSensorVRDevice.instance.resetSensor_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32620,11 +30509,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PreElement internalCreatePreElement() {
-    return new PreElement._internalWrap();
-  }
-
-  external factory PreElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PreElement.internal_() : super.internal_();
@@ -32653,11 +30538,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Presentation internalCreatePresentation() {
-    return new Presentation._internalWrap();
-  }
-
-  external factory Presentation._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Presentation.internal_() : super.internal_();
@@ -32666,22 +30547,22 @@
   @DomName('Presentation.session')
   @DocsEditable()
   @Experimental() // untriaged
-  PresentationSession get session => wrap_jso(_blink.BlinkPresentation.instance.session_Getter_(unwrap_jso(this)));
+  PresentationSession get session => _blink.BlinkPresentation.instance.session_Getter_(this);
   
   @DomName('Presentation.getAvailability')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getAvailability(String url) => wrap_jso(_blink.BlinkPresentation.instance.getAvailability_Callback_1_(unwrap_jso(this), url));
+  Future getAvailability(String url) => convertNativePromiseToDartFuture(_blink.BlinkPresentation.instance.getAvailability_Callback_1_(this, url));
   
   @DomName('Presentation.joinSession')
   @DocsEditable()
   @Experimental() // untriaged
-  Future joinSession(String url, String presentationId) => wrap_jso(_blink.BlinkPresentation.instance.joinSession_Callback_2_(unwrap_jso(this), url, presentationId));
+  Future joinSession(String url, String presentationId) => convertNativePromiseToDartFuture(_blink.BlinkPresentation.instance.joinSession_Callback_2_(this, url, presentationId));
   
   @DomName('Presentation.startSession')
   @DocsEditable()
   @Experimental() // untriaged
-  Future startSession(String url) => wrap_jso(_blink.BlinkPresentation.instance.startSession_Callback_1_(unwrap_jso(this), url));
+  Future startSession(String url) => convertNativePromiseToDartFuture(_blink.BlinkPresentation.instance.startSession_Callback_1_(this, url));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32705,11 +30586,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PresentationAvailability internalCreatePresentationAvailability() {
-    return new PresentationAvailability._internalWrap();
-  }
-
-  external factory PresentationAvailability._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PresentationAvailability.internal_() : super.internal_();
@@ -32718,7 +30595,7 @@
   @DomName('PresentationAvailability.value')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get value => _blink.BlinkPresentationAvailability.instance.value_Getter_(unwrap_jso(this));
+  bool get value => _blink.BlinkPresentationAvailability.instance.value_Getter_(this);
   
   @DomName('PresentationAvailability.onchange')
   @DocsEditable()
@@ -32747,11 +30624,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PresentationSession internalCreatePresentationSession() {
-    return new PresentationSession._internalWrap();
-  }
-
-  external factory PresentationSession._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PresentationSession.internal_() : super.internal_();
@@ -32760,43 +30633,43 @@
   @DomName('PresentationSession.binaryType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get binaryType => _blink.BlinkPresentationSession.instance.binaryType_Getter_(unwrap_jso(this));
+  String get binaryType => _blink.BlinkPresentationSession.instance.binaryType_Getter_(this);
   
   @DomName('PresentationSession.binaryType')
   @DocsEditable()
   @Experimental() // untriaged
-  set binaryType(String value) => _blink.BlinkPresentationSession.instance.binaryType_Setter_(unwrap_jso(this), value);
+  set binaryType(String value) => _blink.BlinkPresentationSession.instance.binaryType_Setter_(this, value);
   
   @DomName('PresentationSession.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkPresentationSession.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkPresentationSession.instance.id_Getter_(this);
   
   @DomName('PresentationSession.state')
   @DocsEditable()
   @Experimental() // untriaged
-  String get state => _blink.BlinkPresentationSession.instance.state_Getter_(unwrap_jso(this));
+  String get state => _blink.BlinkPresentationSession.instance.state_Getter_(this);
   
   @DomName('PresentationSession.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.BlinkPresentationSession.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkPresentationSession.instance.close_Callback_0_(this);
   
   void send(data_OR_message) {
     if ((data_OR_message is String || data_OR_message == null)) {
-      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(this, data_OR_message);
       return;
     }
     if ((data_OR_message is Blob || data_OR_message == null)) {
-      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(this, data_OR_message);
       return;
     }
     if ((data_OR_message is TypedData || data_OR_message == null)) {
-      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(this, data_OR_message);
       return;
     }
     if ((data_OR_message is ByteBuffer || data_OR_message == null)) {
-      _blink.BlinkPresentationSession.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data_OR_message));
+      _blink.BlinkPresentationSession.instance.send_Callback_1_(this, data_OR_message);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -32824,11 +30697,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ProcessingInstruction internalCreateProcessingInstruction() {
-    return new ProcessingInstruction._internalWrap();
-  }
-
-  external factory ProcessingInstruction._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ProcessingInstruction.internal_() : super.internal_();
@@ -32837,11 +30706,11 @@
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
-  StyleSheet get sheet => wrap_jso(_blink.BlinkProcessingInstruction.instance.sheet_Getter_(unwrap_jso(this)));
+  StyleSheet get sheet => _blink.BlinkProcessingInstruction.instance.sheet_Getter_(this);
   
   @DomName('ProcessingInstruction.target')
   @DocsEditable()
-  String get target => _blink.BlinkProcessingInstruction.instance.target_Getter_(unwrap_jso(this));
+  String get target => _blink.BlinkProcessingInstruction.instance.target_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32867,11 +30736,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ProgressElement internalCreateProgressElement() {
-    return new ProgressElement._internalWrap();
-  }
-
-  external factory ProgressElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ProgressElement.internal_() : super.internal_();
@@ -32889,27 +30754,27 @@
   @DomName('HTMLProgressElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLProgressElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLProgressElement.instance.labels_Getter_(this));
   
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  num get max => _blink.BlinkHTMLProgressElement.instance.max_Getter_(unwrap_jso(this));
+  num get max => _blink.BlinkHTMLProgressElement.instance.max_Getter_(this);
   
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  set max(num value) => _blink.BlinkHTMLProgressElement.instance.max_Setter_(unwrap_jso(this), value);
+  set max(num value) => _blink.BlinkHTMLProgressElement.instance.max_Setter_(this, value);
   
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  num get position => _blink.BlinkHTMLProgressElement.instance.position_Getter_(unwrap_jso(this));
+  num get position => _blink.BlinkHTMLProgressElement.instance.position_Getter_(this);
   
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  num get value => _blink.BlinkHTMLProgressElement.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkHTMLProgressElement.instance.value_Getter_(this);
   
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  set value(num value) => _blink.BlinkHTMLProgressElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkHTMLProgressElement.instance.value_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32930,18 +30795,14 @@
   factory ProgressEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkProgressEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkProgressEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkProgressEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkProgressEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static ProgressEvent internalCreateProgressEvent() {
-    return new ProgressEvent._internalWrap();
-  }
-
-  external factory ProgressEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ProgressEvent.internal_() : super.internal_();
@@ -32949,15 +30810,15 @@
 
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
-  bool get lengthComputable => _blink.BlinkProgressEvent.instance.lengthComputable_Getter_(unwrap_jso(this));
+  bool get lengthComputable => _blink.BlinkProgressEvent.instance.lengthComputable_Getter_(this);
   
   @DomName('ProgressEvent.loaded')
   @DocsEditable()
-  int get loaded => _blink.BlinkProgressEvent.instance.loaded_Getter_(unwrap_jso(this));
+  int get loaded => _blink.BlinkProgressEvent.instance.loaded_Getter_(this);
   
   @DomName('ProgressEvent.total')
   @DocsEditable()
-  int get total => _blink.BlinkProgressEvent.instance.total_Getter_(unwrap_jso(this));
+  int get total => _blink.BlinkProgressEvent.instance.total_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32979,18 +30840,14 @@
   factory PromiseRejectionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkPromiseRejectionEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkPromiseRejectionEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static PromiseRejectionEvent internalCreatePromiseRejectionEvent() {
-    return new PromiseRejectionEvent._internalWrap();
-  }
-
-  external factory PromiseRejectionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PromiseRejectionEvent.internal_() : super.internal_();
@@ -32999,12 +30856,12 @@
   @DomName('PromiseRejectionEvent.promise')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get promise => wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.promise_Getter_(unwrap_jso(this)));
+  Future get promise => convertNativePromiseToDartFuture(_blink.BlinkPromiseRejectionEvent.instance.promise_Getter_(this));
   
   @DomName('PromiseRejectionEvent.reason')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get reason => wrap_jso(_blink.BlinkPromiseRejectionEvent.instance.reason_Getter_(unwrap_jso(this)));
+  Object get reason => (_blink.BlinkPromiseRejectionEvent.instance.reason_Getter_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33026,18 +30883,14 @@
   factory PushEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkPushEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkPushEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkPushEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkPushEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static PushEvent internalCreatePushEvent() {
-    return new PushEvent._internalWrap();
-  }
-
-  external factory PushEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PushEvent.internal_() : super.internal_();
@@ -33046,7 +30899,7 @@
   @DomName('PushEvent.data')
   @DocsEditable()
   @Experimental() // untriaged
-  PushMessageData get data => wrap_jso(_blink.BlinkPushEvent.instance.data_Getter_(unwrap_jso(this)));
+  PushMessageData get data => _blink.BlinkPushEvent.instance.data_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33063,38 +30916,30 @@
   // To suppress missing implicit constructor warnings.
   factory PushManager._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PushManager internalCreatePushManager() {
-    return new PushManager._internalWrap();
-  }
 
-  factory PushManager._internalWrap() {
-    return new PushManager.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PushManager.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PushManager.getSubscription')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getSubscription() => wrap_jso(_blink.BlinkPushManager.instance.getSubscription_Callback_0_(unwrap_jso(this)));
+  Future getSubscription() => convertNativePromiseToDartFuture(_blink.BlinkPushManager.instance.getSubscription_Callback_0_(this));
   
   Future permissionState([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkPushManager.instance.permissionState_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkPushManager.instance.permissionState_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkPushManager.instance.permissionState_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkPushManager.instance.permissionState_Callback_0_(this);
   }
 
   Future subscribe([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkPushManager.instance.subscribe_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkPushManager.instance.subscribe_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkPushManager.instance.subscribe_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkPushManager.instance.subscribe_Callback_0_(this);
   }
 
 }
@@ -33115,43 +30960,35 @@
   @DomName('PushMessageData.PushMessageData')
   @DocsEditable()
   factory PushMessageData(String message) {
-    return wrap_jso(_blink.BlinkPushMessageData.instance.constructorCallback_1_(message));
+    return _blink.BlinkPushMessageData.instance.constructorCallback_1_(message);
   }
 
+
   @Deprecated("Internal Use Only")
-  static PushMessageData internalCreatePushMessageData() {
-    return new PushMessageData._internalWrap();
-  }
-
-  factory PushMessageData._internalWrap() {
-    return new PushMessageData.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PushMessageData.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PushMessageData.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  ByteBuffer arrayBuffer() => wrap_jso(_blink.BlinkPushMessageData.instance.arrayBuffer_Callback_0_(unwrap_jso(this)));
+  ByteBuffer arrayBuffer() => _blink.BlinkPushMessageData.instance.arrayBuffer_Callback_0_(this);
   
   @DomName('PushMessageData.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  Blob blob() => wrap_jso(_blink.BlinkPushMessageData.instance.blob_Callback_0_(unwrap_jso(this)));
+  Blob blob() => _blink.BlinkPushMessageData.instance.blob_Callback_0_(this);
   
   @DomName('PushMessageData.json')
   @DocsEditable()
   @Experimental() // untriaged
-  Object json() => wrap_jso(_blink.BlinkPushMessageData.instance.json_Callback_0_(unwrap_jso(this)));
+  Object json() => (_blink.BlinkPushMessageData.instance.json_Callback_0_(this));
   
   @DomName('PushMessageData.text')
   @DocsEditable()
   @Experimental() // untriaged
-  String text() => _blink.BlinkPushMessageData.instance.text_Callback_0_(unwrap_jso(this));
+  String text() => _blink.BlinkPushMessageData.instance.text_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33168,30 +31005,22 @@
   // To suppress missing implicit constructor warnings.
   factory PushSubscription._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PushSubscription internalCreatePushSubscription() {
-    return new PushSubscription._internalWrap();
-  }
 
-  factory PushSubscription._internalWrap() {
-    return new PushSubscription.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PushSubscription.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('PushSubscription.endpoint')
   @DocsEditable()
   @Experimental() // untriaged
-  String get endpoint => _blink.BlinkPushSubscription.instance.endpoint_Getter_(unwrap_jso(this));
+  String get endpoint => _blink.BlinkPushSubscription.instance.endpoint_Getter_(this);
   
   @DomName('PushSubscription.unsubscribe')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unsubscribe() => wrap_jso(_blink.BlinkPushSubscription.instance.unsubscribe_Callback_0_(unwrap_jso(this)));
+  Future unsubscribe() => convertNativePromiseToDartFuture(_blink.BlinkPushSubscription.instance.unsubscribe_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33213,11 +31042,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static QuoteElement internalCreateQuoteElement() {
-    return new QuoteElement._internalWrap();
-  }
-
-  external factory QuoteElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   QuoteElement.internal_() : super.internal_();
@@ -33231,11 +31056,11 @@
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  String get cite => _blink.BlinkHTMLQuoteElement.instance.cite_Getter_(unwrap_jso(this));
+  String get cite => _blink.BlinkHTMLQuoteElement.instance.cite_Getter_(this);
   
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  set cite(String value) => _blink.BlinkHTMLQuoteElement.instance.cite_Setter_(unwrap_jso(this), value);
+  set cite(String value) => _blink.BlinkHTMLQuoteElement.instance.cite_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33288,21 +31113,13 @@
   // To suppress missing implicit constructor warnings.
   factory Range._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Range internalCreateRange() {
-    return new Range._internalWrap();
-  }
 
-  factory Range._internalWrap() {
-    return new Range.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Range.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Range.END_TO_END')
   @DocsEditable()
   static const int END_TO_END = 2;
@@ -33321,126 +31138,126 @@
 
   @DomName('Range.collapsed')
   @DocsEditable()
-  bool get collapsed => _blink.BlinkRange.instance.collapsed_Getter_(unwrap_jso(this));
+  bool get collapsed => _blink.BlinkRange.instance.collapsed_Getter_(this);
   
   @DomName('Range.commonAncestorContainer')
   @DocsEditable()
-  Node get commonAncestorContainer => wrap_jso(_blink.BlinkRange.instance.commonAncestorContainer_Getter_(unwrap_jso(this)));
+  Node get commonAncestorContainer => _blink.BlinkRange.instance.commonAncestorContainer_Getter_(this);
   
   @DomName('Range.endContainer')
   @DocsEditable()
-  Node get endContainer => wrap_jso(_blink.BlinkRange.instance.endContainer_Getter_(unwrap_jso(this)));
+  Node get endContainer => _blink.BlinkRange.instance.endContainer_Getter_(this);
   
   @DomName('Range.endOffset')
   @DocsEditable()
-  int get endOffset => _blink.BlinkRange.instance.endOffset_Getter_(unwrap_jso(this));
+  int get endOffset => _blink.BlinkRange.instance.endOffset_Getter_(this);
   
   @DomName('Range.startContainer')
   @DocsEditable()
-  Node get startContainer => wrap_jso(_blink.BlinkRange.instance.startContainer_Getter_(unwrap_jso(this)));
+  Node get startContainer => _blink.BlinkRange.instance.startContainer_Getter_(this);
   
   @DomName('Range.startOffset')
   @DocsEditable()
-  int get startOffset => _blink.BlinkRange.instance.startOffset_Getter_(unwrap_jso(this));
+  int get startOffset => _blink.BlinkRange.instance.startOffset_Getter_(this);
   
   @DomName('Range.cloneContents')
   @DocsEditable()
-  DocumentFragment cloneContents() => wrap_jso(_blink.BlinkRange.instance.cloneContents_Callback_0_(unwrap_jso(this)));
+  DocumentFragment cloneContents() => _blink.BlinkRange.instance.cloneContents_Callback_0_(this);
   
   @DomName('Range.cloneRange')
   @DocsEditable()
-  Range cloneRange() => wrap_jso(_blink.BlinkRange.instance.cloneRange_Callback_0_(unwrap_jso(this)));
+  Range cloneRange() => _blink.BlinkRange.instance.cloneRange_Callback_0_(this);
   
   void collapse([bool toStart]) {
     if (toStart != null) {
-      _blink.BlinkRange.instance.collapse_Callback_1_(unwrap_jso(this), toStart);
+      _blink.BlinkRange.instance.collapse_Callback_1_(this, toStart);
       return;
     }
-    _blink.BlinkRange.instance.collapse_Callback_0_(unwrap_jso(this));
+    _blink.BlinkRange.instance.collapse_Callback_0_(this);
     return;
   }
 
   @DomName('Range.compareBoundaryPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  int compareBoundaryPoints(int how, Range sourceRange) => _blink.BlinkRange.instance.compareBoundaryPoints_Callback_2_(unwrap_jso(this), how, unwrap_jso(sourceRange));
+  int compareBoundaryPoints(int how, Range sourceRange) => _blink.BlinkRange.instance.compareBoundaryPoints_Callback_2_(this, how, sourceRange);
   
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node node, int offset) => _blink.BlinkRange.instance.comparePoint_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
+  int comparePoint(Node node, int offset) => _blink.BlinkRange.instance.comparePoint_Callback_2_(this, node, offset);
   
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String fragment) => wrap_jso(_blink.BlinkRange.instance.createContextualFragment_Callback_1_(unwrap_jso(this), fragment));
+  DocumentFragment createContextualFragment(String fragment) => _blink.BlinkRange.instance.createContextualFragment_Callback_1_(this, fragment);
   
   @DomName('Range.deleteContents')
   @DocsEditable()
-  void deleteContents() => _blink.BlinkRange.instance.deleteContents_Callback_0_(unwrap_jso(this));
+  void deleteContents() => _blink.BlinkRange.instance.deleteContents_Callback_0_(this);
   
   @DomName('Range.detach')
   @DocsEditable()
-  void detach() => _blink.BlinkRange.instance.detach_Callback_0_(unwrap_jso(this));
+  void detach() => _blink.BlinkRange.instance.detach_Callback_0_(this);
   
   @DomName('Range.expand')
   @DocsEditable()
   @Experimental() // non-standard
-  void expand(String unit) => _blink.BlinkRange.instance.expand_Callback_1_(unwrap_jso(this), unit);
+  void expand(String unit) => _blink.BlinkRange.instance.expand_Callback_1_(this, unit);
   
   @DomName('Range.extractContents')
   @DocsEditable()
-  DocumentFragment extractContents() => wrap_jso(_blink.BlinkRange.instance.extractContents_Callback_0_(unwrap_jso(this)));
+  DocumentFragment extractContents() => _blink.BlinkRange.instance.extractContents_Callback_0_(this);
   
   @DomName('Range.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => make_dart_rectangle(_blink.BlinkRange.instance.getBoundingClientRect_Callback_0_(unwrap_jso(this)));
+  Rectangle getBoundingClientRect() => make_dart_rectangle(_blink.BlinkRange.instance.getBoundingClientRect_Callback_0_(this));
   
   @DomName('Range.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => wrap_jso(_blink.BlinkRange.instance.getClientRects_Callback_0_(unwrap_jso(this)));
+  List<Rectangle> getClientRects() => _blink.BlinkRange.instance.getClientRects_Callback_0_(this);
   
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node node) => _blink.BlinkRange.instance.insertNode_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void insertNode(Node node) => _blink.BlinkRange.instance.insertNode_Callback_1_(this, node);
   
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node node, int offset) => _blink.BlinkRange.instance.isPointInRange_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
+  bool isPointInRange(Node node, int offset) => _blink.BlinkRange.instance.isPointInRange_Callback_2_(this, node, offset);
   
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node node) => _blink.BlinkRange.instance.selectNode_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void selectNode(Node node) => _blink.BlinkRange.instance.selectNode_Callback_1_(this, node);
   
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node node) => _blink.BlinkRange.instance.selectNodeContents_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void selectNodeContents(Node node) => _blink.BlinkRange.instance.selectNodeContents_Callback_1_(this, node);
   
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node node, int offset) => _blink.BlinkRange.instance.setEnd_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
+  void setEnd(Node node, int offset) => _blink.BlinkRange.instance.setEnd_Callback_2_(this, node, offset);
   
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node node) => _blink.BlinkRange.instance.setEndAfter_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void setEndAfter(Node node) => _blink.BlinkRange.instance.setEndAfter_Callback_1_(this, node);
   
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node node) => _blink.BlinkRange.instance.setEndBefore_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void setEndBefore(Node node) => _blink.BlinkRange.instance.setEndBefore_Callback_1_(this, node);
   
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node node, int offset) => _blink.BlinkRange.instance.setStart_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
+  void setStart(Node node, int offset) => _blink.BlinkRange.instance.setStart_Callback_2_(this, node, offset);
   
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node node) => _blink.BlinkRange.instance.setStartAfter_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void setStartAfter(Node node) => _blink.BlinkRange.instance.setStartAfter_Callback_1_(this, node);
   
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node node) => _blink.BlinkRange.instance.setStartBefore_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void setStartBefore(Node node) => _blink.BlinkRange.instance.setStartBefore_Callback_1_(this, node);
   
   @DomName('Range.surroundContents')
   @DocsEditable()
-  void surroundContents(Node newParent) => _blink.BlinkRange.instance.surroundContents_Callback_1_(unwrap_jso(this), unwrap_jso(newParent));
+  void surroundContents(Node newParent) => _blink.BlinkRange.instance.surroundContents_Callback_1_(this, newParent);
   
 
   /**
@@ -33466,32 +31283,24 @@
   // To suppress missing implicit constructor warnings.
   factory ReadableByteStream._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ReadableByteStream internalCreateReadableByteStream() {
-    return new ReadableByteStream._internalWrap();
-  }
 
-  factory ReadableByteStream._internalWrap() {
-    return new ReadableByteStream.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ReadableByteStream.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   Future cancel([Object reason]) {
     if (reason != null) {
-      return wrap_jso(_blink.BlinkReadableByteStream.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+      return _blink.BlinkReadableByteStream.instance.cancel_Callback_1_(this, reason);
     }
-    return wrap_jso(_blink.BlinkReadableByteStream.instance.cancel_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkReadableByteStream.instance.cancel_Callback_0_(this);
   }
 
   @DomName('ReadableByteStream.getReader')
   @DocsEditable()
   @Experimental() // untriaged
-  ReadableByteStreamReader getReader() => wrap_jso(_blink.BlinkReadableByteStream.instance.getReader_Callback_0_(unwrap_jso(this)));
+  ReadableByteStreamReader getReader() => _blink.BlinkReadableByteStream.instance.getReader_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33508,42 +31317,34 @@
   // To suppress missing implicit constructor warnings.
   factory ReadableByteStreamReader._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ReadableByteStreamReader internalCreateReadableByteStreamReader() {
-    return new ReadableByteStreamReader._internalWrap();
-  }
 
-  factory ReadableByteStreamReader._internalWrap() {
-    return new ReadableByteStreamReader.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ReadableByteStreamReader.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ReadableByteStreamReader.closed')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get closed => wrap_jso(_blink.BlinkReadableByteStreamReader.instance.closed_Getter_(unwrap_jso(this)));
+  Future get closed => convertNativePromiseToDartFuture(_blink.BlinkReadableByteStreamReader.instance.closed_Getter_(this));
   
   Future cancel([Object reason]) {
     if (reason != null) {
-      return wrap_jso(_blink.BlinkReadableByteStreamReader.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+      return _blink.BlinkReadableByteStreamReader.instance.cancel_Callback_1_(this, reason);
     }
-    return wrap_jso(_blink.BlinkReadableByteStreamReader.instance.cancel_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkReadableByteStreamReader.instance.cancel_Callback_0_(this);
   }
 
   @DomName('ReadableByteStreamReader.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future read() => wrap_jso(_blink.BlinkReadableByteStreamReader.instance.read_Callback_0_(unwrap_jso(this)));
+  Future read() => convertNativePromiseToDartFuture(_blink.BlinkReadableByteStreamReader.instance.read_Callback_0_(this));
   
   @DomName('ReadableByteStreamReader.releaseLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void releaseLock() => _blink.BlinkReadableByteStreamReader.instance.releaseLock_Callback_0_(unwrap_jso(this));
+  void releaseLock() => _blink.BlinkReadableByteStreamReader.instance.releaseLock_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33560,32 +31361,24 @@
   // To suppress missing implicit constructor warnings.
   factory ReadableStream._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ReadableStream internalCreateReadableStream() {
-    return new ReadableStream._internalWrap();
-  }
 
-  factory ReadableStream._internalWrap() {
-    return new ReadableStream.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ReadableStream.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   Future cancel([Object reason]) {
     if (reason != null) {
-      return wrap_jso(_blink.BlinkReadableStream.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+      return _blink.BlinkReadableStream.instance.cancel_Callback_1_(this, reason);
     }
-    return wrap_jso(_blink.BlinkReadableStream.instance.cancel_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkReadableStream.instance.cancel_Callback_0_(this);
   }
 
   @DomName('ReadableStream.getReader')
   @DocsEditable()
   @Experimental() // untriaged
-  ReadableStreamReader getReader() => wrap_jso(_blink.BlinkReadableStream.instance.getReader_Callback_0_(unwrap_jso(this)));
+  ReadableStreamReader getReader() => _blink.BlinkReadableStream.instance.getReader_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33602,42 +31395,34 @@
   // To suppress missing implicit constructor warnings.
   factory ReadableStreamReader._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ReadableStreamReader internalCreateReadableStreamReader() {
-    return new ReadableStreamReader._internalWrap();
-  }
 
-  factory ReadableStreamReader._internalWrap() {
-    return new ReadableStreamReader.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ReadableStreamReader.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ReadableStreamReader.closed')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get closed => wrap_jso(_blink.BlinkReadableStreamReader.instance.closed_Getter_(unwrap_jso(this)));
+  Future get closed => convertNativePromiseToDartFuture(_blink.BlinkReadableStreamReader.instance.closed_Getter_(this));
   
   Future cancel([Object reason]) {
     if (reason != null) {
-      return wrap_jso(_blink.BlinkReadableStreamReader.instance.cancel_Callback_1_(unwrap_jso(this), reason));
+      return _blink.BlinkReadableStreamReader.instance.cancel_Callback_1_(this, reason);
     }
-    return wrap_jso(_blink.BlinkReadableStreamReader.instance.cancel_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkReadableStreamReader.instance.cancel_Callback_0_(this);
   }
 
   @DomName('ReadableStreamReader.read')
   @DocsEditable()
   @Experimental() // untriaged
-  Future read() => wrap_jso(_blink.BlinkReadableStreamReader.instance.read_Callback_0_(unwrap_jso(this)));
+  Future read() => convertNativePromiseToDartFuture(_blink.BlinkReadableStreamReader.instance.read_Callback_0_(this));
   
   @DomName('ReadableStreamReader.releaseLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void releaseLock() => _blink.BlinkReadableStreamReader.instance.releaseLock_Callback_0_(unwrap_jso(this));
+  void releaseLock() => _blink.BlinkReadableStreamReader.instance.releaseLock_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33659,18 +31444,14 @@
   factory RelatedEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkRelatedEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkRelatedEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkRelatedEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkRelatedEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static RelatedEvent internalCreateRelatedEvent() {
-    return new RelatedEvent._internalWrap();
-  }
-
-  external factory RelatedEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RelatedEvent.internal_() : super.internal_();
@@ -33679,7 +31460,7 @@
   @DomName('RelatedEvent.relatedTarget')
   @DocsEditable()
   @Experimental() // untriaged
-  EventTarget get relatedTarget => wrap_jso(_blink.BlinkRelatedEvent.instance.relatedTarget_Getter_(unwrap_jso(this)));
+  EventTarget get relatedTarget => _blink.BlinkRelatedEvent.instance.relatedTarget_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33708,11 +31489,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ResourceProgressEvent internalCreateResourceProgressEvent() {
-    return new ResourceProgressEvent._internalWrap();
-  }
-
-  external factory ResourceProgressEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ResourceProgressEvent.internal_() : super.internal_();
@@ -33720,7 +31497,7 @@
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable()
-  String get url => _blink.BlinkResourceProgressEvent.instance.url_Getter_(unwrap_jso(this));
+  String get url => _blink.BlinkResourceProgressEvent.instance.url_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33780,11 +31557,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static RtcDataChannel internalCreateRtcDataChannel() {
-    return new RtcDataChannel._internalWrap();
-  }
-
-  external factory RtcDataChannel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcDataChannel.internal_() : super.internal_();
@@ -33792,77 +31565,77 @@
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.BlinkRTCDataChannel.instance.binaryType_Getter_(unwrap_jso(this));
+  String get binaryType => _blink.BlinkRTCDataChannel.instance.binaryType_Getter_(this);
   
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  set binaryType(String value) => _blink.BlinkRTCDataChannel.instance.binaryType_Setter_(unwrap_jso(this), value);
+  set binaryType(String value) => _blink.BlinkRTCDataChannel.instance.binaryType_Setter_(this, value);
   
   @DomName('RTCDataChannel.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.BlinkRTCDataChannel.instance.bufferedAmount_Getter_(unwrap_jso(this));
+  int get bufferedAmount => _blink.BlinkRTCDataChannel.instance.bufferedAmount_Getter_(this);
   
   @DomName('RTCDataChannel.id')
   @DocsEditable()
   @Experimental() // untriaged
-  int get id => _blink.BlinkRTCDataChannel.instance.id_Getter_(unwrap_jso(this));
+  int get id => _blink.BlinkRTCDataChannel.instance.id_Getter_(this);
   
   @DomName('RTCDataChannel.label')
   @DocsEditable()
-  String get label => _blink.BlinkRTCDataChannel.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkRTCDataChannel.instance.label_Getter_(this);
   
   @DomName('RTCDataChannel.maxRetransmitTime')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmitTime => _blink.BlinkRTCDataChannel.instance.maxRetransmitTime_Getter_(unwrap_jso(this));
+  int get maxRetransmitTime => _blink.BlinkRTCDataChannel.instance.maxRetransmitTime_Getter_(this);
   
   @DomName('RTCDataChannel.maxRetransmits')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmits => _blink.BlinkRTCDataChannel.instance.maxRetransmits_Getter_(unwrap_jso(this));
+  int get maxRetransmits => _blink.BlinkRTCDataChannel.instance.maxRetransmits_Getter_(this);
   
   @DomName('RTCDataChannel.negotiated')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get negotiated => _blink.BlinkRTCDataChannel.instance.negotiated_Getter_(unwrap_jso(this));
+  bool get negotiated => _blink.BlinkRTCDataChannel.instance.negotiated_Getter_(this);
   
   @DomName('RTCDataChannel.ordered')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get ordered => _blink.BlinkRTCDataChannel.instance.ordered_Getter_(unwrap_jso(this));
+  bool get ordered => _blink.BlinkRTCDataChannel.instance.ordered_Getter_(this);
   
   @DomName('RTCDataChannel.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.BlinkRTCDataChannel.instance.protocol_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkRTCDataChannel.instance.protocol_Getter_(this);
   
   @DomName('RTCDataChannel.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkRTCDataChannel.instance.readyState_Getter_(unwrap_jso(this));
+  String get readyState => _blink.BlinkRTCDataChannel.instance.readyState_Getter_(this);
   
   @DomName('RTCDataChannel.reliable')
   @DocsEditable()
-  bool get reliable => _blink.BlinkRTCDataChannel.instance.reliable_Getter_(unwrap_jso(this));
+  bool get reliable => _blink.BlinkRTCDataChannel.instance.reliable_Getter_(this);
   
   @DomName('RTCDataChannel.close')
   @DocsEditable()
-  void close() => _blink.BlinkRTCDataChannel.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkRTCDataChannel.instance.close_Callback_0_(this);
   
   void send(data) {
     if ((data is String || data == null)) {
-      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is Blob || data == null)) {
-      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is TypedData || data == null)) {
-      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is ByteBuffer || data == null)) {
-      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -33870,19 +31643,19 @@
 
   @DomName('RTCDataChannel.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void sendBlob(Blob data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
   
   @DomName('RTCDataChannel.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
   
   @DomName('RTCDataChannel.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), data);
+  void sendString(String data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
   
   @DomName('RTCDataChannel.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void sendTypedData(TypedData data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
   
   /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
@@ -33922,11 +31695,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static RtcDataChannelEvent internalCreateRtcDataChannelEvent() {
-    return new RtcDataChannelEvent._internalWrap();
-  }
-
-  external factory RtcDataChannelEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcDataChannelEvent.internal_() : super.internal_();
@@ -33934,7 +31703,7 @@
 
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
-  RtcDataChannel get channel => wrap_jso(_blink.BlinkRTCDataChannelEvent.instance.channel_Getter_(unwrap_jso(this)));
+  RtcDataChannel get channel => _blink.BlinkRTCDataChannelEvent.instance.channel_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33964,11 +31733,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static RtcDtmfSender internalCreateRtcDtmfSender() {
-    return new RtcDtmfSender._internalWrap();
-  }
-
-  external factory RtcDtmfSender._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcDtmfSender.internal_() : super.internal_();
@@ -33976,34 +31741,34 @@
 
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable()
-  bool get canInsertDtmf => _blink.BlinkRTCDTMFSender.instance.canInsertDTMF_Getter_(unwrap_jso(this));
+  bool get canInsertDtmf => _blink.BlinkRTCDTMFSender.instance.canInsertDTMF_Getter_(this);
   
   @DomName('RTCDTMFSender.duration')
   @DocsEditable()
-  int get duration => _blink.BlinkRTCDTMFSender.instance.duration_Getter_(unwrap_jso(this));
+  int get duration => _blink.BlinkRTCDTMFSender.instance.duration_Getter_(this);
   
   @DomName('RTCDTMFSender.interToneGap')
   @DocsEditable()
-  int get interToneGap => _blink.BlinkRTCDTMFSender.instance.interToneGap_Getter_(unwrap_jso(this));
+  int get interToneGap => _blink.BlinkRTCDTMFSender.instance.interToneGap_Getter_(this);
   
   @DomName('RTCDTMFSender.toneBuffer')
   @DocsEditable()
-  String get toneBuffer => _blink.BlinkRTCDTMFSender.instance.toneBuffer_Getter_(unwrap_jso(this));
+  String get toneBuffer => _blink.BlinkRTCDTMFSender.instance.toneBuffer_Getter_(this);
   
   @DomName('RTCDTMFSender.track')
   @DocsEditable()
-  MediaStreamTrack get track => wrap_jso(_blink.BlinkRTCDTMFSender.instance.track_Getter_(unwrap_jso(this)));
+  MediaStreamTrack get track => _blink.BlinkRTCDTMFSender.instance.track_Getter_(this);
   
   void insertDtmf(String tones, [int duration, int interToneGap]) {
     if (interToneGap != null) {
-      _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_3_(unwrap_jso(this), tones, duration, interToneGap);
+      _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_3_(this, tones, duration, interToneGap);
       return;
     }
     if (duration != null) {
-      _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_2_(unwrap_jso(this), tones, duration);
+      _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_2_(this, tones, duration);
       return;
     }
-    _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_1_(unwrap_jso(this), tones);
+    _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_1_(this, tones);
     return;
   }
 
@@ -34032,16 +31797,12 @@
   @DocsEditable()
   factory RtcDtmfToneChangeEvent(String type, Map eventInitDict) {
     var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-    return wrap_jso(_blink.BlinkRTCDTMFToneChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+    return _blink.BlinkRTCDTMFToneChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1);
   }
 
 
   @Deprecated("Internal Use Only")
-  static RtcDtmfToneChangeEvent internalCreateRtcDtmfToneChangeEvent() {
-    return new RtcDtmfToneChangeEvent._internalWrap();
-  }
-
-  external factory RtcDtmfToneChangeEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcDtmfToneChangeEvent.internal_() : super.internal_();
@@ -34049,7 +31810,7 @@
 
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
-  String get tone => _blink.BlinkRTCDTMFToneChangeEvent.instance.tone_Getter_(unwrap_jso(this));
+  String get tone => _blink.BlinkRTCDTMFToneChangeEvent.instance.tone_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34072,47 +31833,39 @@
   @DocsEditable()
   factory RtcIceCandidate(Map candidateInitDict) {
     var candidateInitDict_1 = convertDartToNative_Dictionary(candidateInitDict);
-    return wrap_jso(_blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(candidateInitDict_1));
+    return _blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(candidateInitDict_1);
   }
 
+
   @Deprecated("Internal Use Only")
-  static RtcIceCandidate internalCreateRtcIceCandidate() {
-    return new RtcIceCandidate._internalWrap();
-  }
-
-  factory RtcIceCandidate._internalWrap() {
-    return new RtcIceCandidate.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcIceCandidate.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  String get candidate => _blink.BlinkRTCIceCandidate.instance.candidate_Getter_(unwrap_jso(this));
+  String get candidate => _blink.BlinkRTCIceCandidate.instance.candidate_Getter_(this);
   
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  set candidate(String value) => _blink.BlinkRTCIceCandidate.instance.candidate_Setter_(unwrap_jso(this), value);
+  set candidate(String value) => _blink.BlinkRTCIceCandidate.instance.candidate_Setter_(this, value);
   
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  int get sdpMLineIndex => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Getter_(unwrap_jso(this));
+  int get sdpMLineIndex => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Getter_(this);
   
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  set sdpMLineIndex(int value) => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Setter_(unwrap_jso(this), value);
+  set sdpMLineIndex(int value) => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Setter_(this, value);
   
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  String get sdpMid => _blink.BlinkRTCIceCandidate.instance.sdpMid_Getter_(unwrap_jso(this));
+  String get sdpMid => _blink.BlinkRTCIceCandidate.instance.sdpMid_Getter_(this);
   
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  set sdpMid(String value) => _blink.BlinkRTCIceCandidate.instance.sdpMid_Setter_(unwrap_jso(this), value);
+  set sdpMid(String value) => _blink.BlinkRTCIceCandidate.instance.sdpMid_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34132,11 +31885,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static RtcIceCandidateEvent internalCreateRtcIceCandidateEvent() {
-    return new RtcIceCandidateEvent._internalWrap();
-  }
-
-  external factory RtcIceCandidateEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcIceCandidateEvent.internal_() : super.internal_();
@@ -34144,7 +31893,7 @@
 
   @DomName('RTCIceCandidateEvent.candidate')
   @DocsEditable()
-  RtcIceCandidate get candidate => wrap_jso(_blink.BlinkRTCIceCandidateEvent.instance.candidate_Getter_(unwrap_jso(this)));
+  RtcIceCandidate get candidate => _blink.BlinkRTCIceCandidateEvent.instance.candidate_Getter_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -34264,19 +32013,15 @@
     if (mediaConstraints != null) {
       var rtcConfiguration_1 = convertDartToNative_Dictionary(rtcConfiguration);
       var mediaConstraints_2 = convertDartToNative_Dictionary(mediaConstraints);
-      return wrap_jso(_blink.BlinkRTCPeerConnection.instance.constructorCallback_2_(rtcConfiguration_1, mediaConstraints_2));
+      return _blink.BlinkRTCPeerConnection.instance.constructorCallback_2_(rtcConfiguration_1, mediaConstraints_2);
     }
     var rtcConfiguration_1 = convertDartToNative_Dictionary(rtcConfiguration);
-    return wrap_jso(_blink.BlinkRTCPeerConnection.instance.constructorCallback_1_(rtcConfiguration_1));
+    return _blink.BlinkRTCPeerConnection.instance.constructorCallback_1_(rtcConfiguration_1);
   }
 
 
   @Deprecated("Internal Use Only")
-  static RtcPeerConnection internalCreateRtcPeerConnection() {
-    return new RtcPeerConnection._internalWrap();
-  }
-
-  external factory RtcPeerConnection._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcPeerConnection.internal_() : super.internal_();
@@ -34284,93 +32029,93 @@
 
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
-  String get iceConnectionState => _blink.BlinkRTCPeerConnection.instance.iceConnectionState_Getter_(unwrap_jso(this));
+  String get iceConnectionState => _blink.BlinkRTCPeerConnection.instance.iceConnectionState_Getter_(this);
   
   @DomName('RTCPeerConnection.iceGatheringState')
   @DocsEditable()
-  String get iceGatheringState => _blink.BlinkRTCPeerConnection.instance.iceGatheringState_Getter_(unwrap_jso(this));
+  String get iceGatheringState => _blink.BlinkRTCPeerConnection.instance.iceGatheringState_Getter_(this);
   
   @DomName('RTCPeerConnection.localDescription')
   @DocsEditable()
-  RtcSessionDescription get localDescription => wrap_jso(_blink.BlinkRTCPeerConnection.instance.localDescription_Getter_(unwrap_jso(this)));
+  RtcSessionDescription get localDescription => _blink.BlinkRTCPeerConnection.instance.localDescription_Getter_(this);
   
   @DomName('RTCPeerConnection.remoteDescription')
   @DocsEditable()
-  RtcSessionDescription get remoteDescription => wrap_jso(_blink.BlinkRTCPeerConnection.instance.remoteDescription_Getter_(unwrap_jso(this)));
+  RtcSessionDescription get remoteDescription => _blink.BlinkRTCPeerConnection.instance.remoteDescription_Getter_(this);
   
   @DomName('RTCPeerConnection.signalingState')
   @DocsEditable()
-  String get signalingState => _blink.BlinkRTCPeerConnection.instance.signalingState_Getter_(unwrap_jso(this));
+  String get signalingState => _blink.BlinkRTCPeerConnection.instance.signalingState_Getter_(this);
   
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.instance.addIceCandidate_Callback_3_(unwrap_jso(this), unwrap_jso(candidate), unwrap_jso(() => successCallback()), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
+  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.instance.addIceCandidate_Callback_3_(this, candidate, successCallback, failureCallback);
   
   void addStream(MediaStream stream, [Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.instance.addStream_Callback_2_(unwrap_jso(this), unwrap_jso(stream), convertDartToNative_Dictionary(mediaConstraints));
+      _blink.BlinkRTCPeerConnection.instance.addStream_Callback_2_(this, stream, convertDartToNative_Dictionary(mediaConstraints));
       return;
     }
-    _blink.BlinkRTCPeerConnection.instance.addStream_Callback_1_(unwrap_jso(this), unwrap_jso(stream));
+    _blink.BlinkRTCPeerConnection.instance.addStream_Callback_1_(this, stream);
     return;
   }
 
   @DomName('RTCPeerConnection.close')
   @DocsEditable()
-  void close() => _blink.BlinkRTCPeerConnection.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkRTCPeerConnection.instance.close_Callback_0_(this);
   
   void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_3_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)), convertDartToNative_Dictionary(mediaConstraints));
+      _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_3_(this, successCallback, failureCallback, convertDartToNative_Dictionary(mediaConstraints));
       return;
     }
-    _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_2_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
+    _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_2_(this, successCallback, failureCallback);
     return;
   }
 
   @DomName('RTCPeerConnection.createDTMFSender')
   @DocsEditable()
-  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => wrap_jso(_blink.BlinkRTCPeerConnection.instance.createDTMFSender_Callback_1_(unwrap_jso(this), unwrap_jso(track)));
+  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.BlinkRTCPeerConnection.instance.createDTMFSender_Callback_1_(this, track);
   
   RtcDataChannel createDataChannel(String label, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_2_(unwrap_jso(this), label, convertDartToNative_Dictionary(options)));
+      return _blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_2_(this, label, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_1_(unwrap_jso(this), label));
+    return _blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_1_(this, label);
   }
 
   void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map rtcOfferOptions]) {
     if (rtcOfferOptions != null) {
-      _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_3_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)), convertDartToNative_Dictionary(rtcOfferOptions));
+      _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_3_(this, successCallback, failureCallback, convertDartToNative_Dictionary(rtcOfferOptions));
       return;
     }
-    _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_2_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
+    _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_2_(this, successCallback, failureCallback);
     return;
   }
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
-  List<MediaStream> getLocalStreams() => wrap_jso(_blink.BlinkRTCPeerConnection.instance.getLocalStreams_Callback_0_(unwrap_jso(this)));
+  List<MediaStream> getLocalStreams() => (_blink.BlinkRTCPeerConnection.instance.getLocalStreams_Callback_0_(this));
   
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
-  List<MediaStream> getRemoteStreams() => wrap_jso(_blink.BlinkRTCPeerConnection.instance.getRemoteStreams_Callback_0_(unwrap_jso(this)));
+  List<MediaStream> getRemoteStreams() => (_blink.BlinkRTCPeerConnection.instance.getRemoteStreams_Callback_0_(this));
   
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.instance.getStats_Callback_2_(unwrap_jso(this), unwrap_jso((response) => successCallback(wrap_jso(response))), unwrap_jso(selector));
+  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.instance.getStats_Callback_2_(this, successCallback, selector);
   
   @DomName('RTCPeerConnection.getStreamById')
   @DocsEditable()
-  MediaStream getStreamById(String streamId) => wrap_jso(_blink.BlinkRTCPeerConnection.instance.getStreamById_Callback_1_(unwrap_jso(this), streamId));
+  MediaStream getStreamById(String streamId) => _blink.BlinkRTCPeerConnection.instance.getStreamById_Callback_1_(this, streamId);
   
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
-  void removeStream(MediaStream stream) => _blink.BlinkRTCPeerConnection.instance.removeStream_Callback_1_(unwrap_jso(this), unwrap_jso(stream));
+  void removeStream(MediaStream stream) => _blink.BlinkRTCPeerConnection.instance.removeStream_Callback_1_(this, stream);
   
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setLocalDescription_Callback_3_(unwrap_jso(this), unwrap_jso(description), unwrap_jso(() => successCallback()), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
+  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setLocalDescription_Callback_3_(this, description, successCallback, failureCallback);
   
   Future setLocalDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -34382,7 +32127,7 @@
 
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setRemoteDescription_Callback_3_(unwrap_jso(this), unwrap_jso(description), unwrap_jso(() => successCallback()), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
+  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setRemoteDescription_Callback_3_(this, description, successCallback, failureCallback);
   
   Future setRemoteDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -34394,14 +32139,14 @@
 
   void updateIce([Map configuration, Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_2_(unwrap_jso(this), convertDartToNative_Dictionary(configuration), convertDartToNative_Dictionary(mediaConstraints));
+      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_2_(this, convertDartToNative_Dictionary(configuration), convertDartToNative_Dictionary(mediaConstraints));
       return;
     }
     if (configuration != null) {
-      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(configuration));
+      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_1_(this, convertDartToNative_Dictionary(configuration));
       return;
     }
-    _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_0_(unwrap_jso(this));
+    _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_0_(this);
     return;
   }
 
@@ -34462,41 +32207,33 @@
   factory RtcSessionDescription([Map descriptionInitDict]) {
     if (descriptionInitDict != null) {
       var descriptionInitDict_1 = convertDartToNative_Dictionary(descriptionInitDict);
-      return wrap_jso(_blink.BlinkRTCSessionDescription.instance.constructorCallback_1_(descriptionInitDict_1));
+      return _blink.BlinkRTCSessionDescription.instance.constructorCallback_1_(descriptionInitDict_1);
     }
-    return wrap_jso(_blink.BlinkRTCSessionDescription.instance.constructorCallback_0_());
+    return _blink.BlinkRTCSessionDescription.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static RtcSessionDescription internalCreateRtcSessionDescription() {
-    return new RtcSessionDescription._internalWrap();
-  }
-
-  factory RtcSessionDescription._internalWrap() {
-    return new RtcSessionDescription.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcSessionDescription.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  String get sdp => _blink.BlinkRTCSessionDescription.instance.sdp_Getter_(unwrap_jso(this));
+  String get sdp => _blink.BlinkRTCSessionDescription.instance.sdp_Getter_(this);
   
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  set sdp(String value) => _blink.BlinkRTCSessionDescription.instance.sdp_Setter_(unwrap_jso(this), value);
+  set sdp(String value) => _blink.BlinkRTCSessionDescription.instance.sdp_Setter_(this, value);
   
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  String get type => _blink.BlinkRTCSessionDescription.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkRTCSessionDescription.instance.type_Getter_(this);
   
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkRTCSessionDescription.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkRTCSessionDescription.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34514,40 +32251,32 @@
   // To suppress missing implicit constructor warnings.
   factory RtcStatsReport._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static RtcStatsReport internalCreateRtcStatsReport() {
-    return new RtcStatsReport._internalWrap();
-  }
 
-  factory RtcStatsReport._internalWrap() {
-    return new RtcStatsReport.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcStatsReport.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('RTCStatsReport.id')
   @DocsEditable()
-  String get id => _blink.BlinkRTCStatsReport.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkRTCStatsReport.instance.id_Getter_(this);
   
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable()
-  DateTime get timestamp => _blink.BlinkRTCStatsReport.instance.timestamp_Getter_(unwrap_jso(this));
+  DateTime get timestamp => _blink.BlinkRTCStatsReport.instance.timestamp_Getter_(this);
   
   @DomName('RTCStatsReport.type')
   @DocsEditable()
-  String get type => _blink.BlinkRTCStatsReport.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkRTCStatsReport.instance.type_Getter_(this);
   
   @DomName('RTCStatsReport.names')
   @DocsEditable()
-  List<String> names() => _blink.BlinkRTCStatsReport.instance.names_Callback_0_(unwrap_jso(this));
+  List<String> names() => _blink.BlinkRTCStatsReport.instance.names_Callback_0_(this);
   
   @DomName('RTCStatsReport.stat')
   @DocsEditable()
-  String stat(String name) => _blink.BlinkRTCStatsReport.instance.stat_Callback_1_(unwrap_jso(this), name);
+  String stat(String name) => _blink.BlinkRTCStatsReport.instance.stat_Callback_1_(this, name);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34565,34 +32294,26 @@
   // To suppress missing implicit constructor warnings.
   factory RtcStatsResponse._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static RtcStatsResponse internalCreateRtcStatsResponse() {
-    return new RtcStatsResponse._internalWrap();
-  }
 
-  factory RtcStatsResponse._internalWrap() {
-    return new RtcStatsResponse.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RtcStatsResponse.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   RtcStatsReport namedItem(String name) {
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(this, name);
     }
     if ((name is String || name == null)) {
-      return wrap_jso(_blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(this, name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() => wrap_jso(_blink.BlinkRTCStatsResponse.instance.result_Callback_0_(unwrap_jso(this)));
+  List<RtcStatsReport> result() => _blink.BlinkRTCStatsResponse.instance.result_Callback_0_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -34613,59 +32334,51 @@
   // To suppress missing implicit constructor warnings.
   factory Screen._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Screen internalCreateScreen() {
-    return new Screen._internalWrap();
-  }
 
-  factory Screen._internalWrap() {
-    return new Screen.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Screen.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Screen.availHeight')
   @DocsEditable()
-  int get _availHeight => _blink.BlinkScreen.instance.availHeight_Getter_(unwrap_jso(this));
+  int get _availHeight => _blink.BlinkScreen.instance.availHeight_Getter_(this);
   
   @DomName('Screen.availLeft')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availLeft => _blink.BlinkScreen.instance.availLeft_Getter_(unwrap_jso(this));
+  int get _availLeft => _blink.BlinkScreen.instance.availLeft_Getter_(this);
   
   @DomName('Screen.availTop')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availTop => _blink.BlinkScreen.instance.availTop_Getter_(unwrap_jso(this));
+  int get _availTop => _blink.BlinkScreen.instance.availTop_Getter_(this);
   
   @DomName('Screen.availWidth')
   @DocsEditable()
-  int get _availWidth => _blink.BlinkScreen.instance.availWidth_Getter_(unwrap_jso(this));
+  int get _availWidth => _blink.BlinkScreen.instance.availWidth_Getter_(this);
   
   @DomName('Screen.colorDepth')
   @DocsEditable()
-  int get colorDepth => _blink.BlinkScreen.instance.colorDepth_Getter_(unwrap_jso(this));
+  int get colorDepth => _blink.BlinkScreen.instance.colorDepth_Getter_(this);
   
   @DomName('Screen.height')
   @DocsEditable()
-  int get height => _blink.BlinkScreen.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkScreen.instance.height_Getter_(this);
   
   @DomName('Screen.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  ScreenOrientation get orientation => wrap_jso(_blink.BlinkScreen.instance.orientation_Getter_(unwrap_jso(this)));
+  ScreenOrientation get orientation => _blink.BlinkScreen.instance.orientation_Getter_(this);
   
   @DomName('Screen.pixelDepth')
   @DocsEditable()
-  int get pixelDepth => _blink.BlinkScreen.instance.pixelDepth_Getter_(unwrap_jso(this));
+  int get pixelDepth => _blink.BlinkScreen.instance.pixelDepth_Getter_(this);
   
   @DomName('Screen.width')
   @DocsEditable()
-  int get width => _blink.BlinkScreen.instance.width_Getter_(unwrap_jso(this));
+  int get width => _blink.BlinkScreen.instance.width_Getter_(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
@@ -34688,11 +32401,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ScreenOrientation internalCreateScreenOrientation() {
-    return new ScreenOrientation._internalWrap();
-  }
-
-  external factory ScreenOrientation._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ScreenOrientation.internal_() : super.internal_();
@@ -34701,22 +32410,22 @@
   @DomName('ScreenOrientation.angle')
   @DocsEditable()
   @Experimental() // untriaged
-  int get angle => _blink.BlinkScreenOrientation.instance.angle_Getter_(unwrap_jso(this));
+  int get angle => _blink.BlinkScreenOrientation.instance.angle_Getter_(this);
   
   @DomName('ScreenOrientation.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkScreenOrientation.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkScreenOrientation.instance.type_Getter_(this);
   
   @DomName('ScreenOrientation.lock')
   @DocsEditable()
   @Experimental() // untriaged
-  Future lock(String orientation) => wrap_jso(_blink.BlinkScreenOrientation.instance.lock_Callback_1_(unwrap_jso(this), orientation));
+  Future lock(String orientation) => convertNativePromiseToDartFuture(_blink.BlinkScreenOrientation.instance.lock_Callback_1_(this, orientation));
   
   @DomName('ScreenOrientation.unlock')
   @DocsEditable()
   @Experimental() // untriaged
-  void unlock() => _blink.BlinkScreenOrientation.instance.unlock_Callback_0_(unwrap_jso(this));
+  void unlock() => _blink.BlinkScreenOrientation.instance.unlock_Callback_0_(this);
   
   @DomName('ScreenOrientation.onchange')
   @DocsEditable()
@@ -34743,11 +32452,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ScriptElement internalCreateScriptElement() {
-    return new ScriptElement._internalWrap();
-  }
-
-  external factory ScriptElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ScriptElement.internal_() : super.internal_();
@@ -34761,77 +32466,77 @@
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  bool get async => _blink.BlinkHTMLScriptElement.instance.async_Getter_(unwrap_jso(this));
+  bool get async => _blink.BlinkHTMLScriptElement.instance.async_Getter_(this);
   
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  set async(bool value) => _blink.BlinkHTMLScriptElement.instance.async_Setter_(unwrap_jso(this), value);
+  set async(bool value) => _blink.BlinkHTMLScriptElement.instance.async_Setter_(this, value);
   
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  String get charset => _blink.BlinkHTMLScriptElement.instance.charset_Getter_(unwrap_jso(this));
+  String get charset => _blink.BlinkHTMLScriptElement.instance.charset_Getter_(this);
   
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  set charset(String value) => _blink.BlinkHTMLScriptElement.instance.charset_Setter_(unwrap_jso(this), value);
+  set charset(String value) => _blink.BlinkHTMLScriptElement.instance.charset_Setter_(this, value);
   
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  String get crossOrigin => _blink.BlinkHTMLScriptElement.instance.crossOrigin_Getter_(unwrap_jso(this));
+  String get crossOrigin => _blink.BlinkHTMLScriptElement.instance.crossOrigin_Getter_(this);
   
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  set crossOrigin(String value) => _blink.BlinkHTMLScriptElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLScriptElement.instance.crossOrigin_Setter_(this, value);
   
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  bool get defer => _blink.BlinkHTMLScriptElement.instance.defer_Getter_(unwrap_jso(this));
+  bool get defer => _blink.BlinkHTMLScriptElement.instance.defer_Getter_(this);
   
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  set defer(bool value) => _blink.BlinkHTMLScriptElement.instance.defer_Setter_(unwrap_jso(this), value);
+  set defer(bool value) => _blink.BlinkHTMLScriptElement.instance.defer_Setter_(this, value);
   
   @DomName('HTMLScriptElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLScriptElement.instance.integrity_Getter_(unwrap_jso(this));
+  String get integrity => _blink.BlinkHTMLScriptElement.instance.integrity_Getter_(this);
   
   @DomName('HTMLScriptElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  set integrity(String value) => _blink.BlinkHTMLScriptElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLScriptElement.instance.integrity_Setter_(this, value);
   
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  String get nonce => _blink.BlinkHTMLScriptElement.instance.nonce_Getter_(unwrap_jso(this));
+  String get nonce => _blink.BlinkHTMLScriptElement.instance.nonce_Getter_(this);
   
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  set nonce(String value) => _blink.BlinkHTMLScriptElement.instance.nonce_Setter_(unwrap_jso(this), value);
+  set nonce(String value) => _blink.BlinkHTMLScriptElement.instance.nonce_Setter_(this, value);
   
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLScriptElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLScriptElement.instance.src_Getter_(this);
   
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLScriptElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLScriptElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLScriptElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLScriptElement.instance.type_Getter_(this);
   
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLScriptElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLScriptElement.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34852,101 +32557,93 @@
   @DocsEditable()
   factory ScrollState([num deltaX, num deltaY, num deltaGranularity, num velocityX, num velocityY, bool inInertialPhase, bool isBeginning, bool isEnding]) {
     if (isEnding != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_8_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding));
+      return _blink.BlinkScrollState.instance.constructorCallback_8_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
     }
     if (isBeginning != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_7_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning));
+      return _blink.BlinkScrollState.instance.constructorCallback_7_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
     }
     if (inInertialPhase != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_6_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase));
+      return _blink.BlinkScrollState.instance.constructorCallback_6_(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
     }
     if (velocityY != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_5_(deltaX, deltaY, deltaGranularity, velocityX, velocityY));
+      return _blink.BlinkScrollState.instance.constructorCallback_5_(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
     }
     if (velocityX != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_4_(deltaX, deltaY, deltaGranularity, velocityX));
+      return _blink.BlinkScrollState.instance.constructorCallback_4_(deltaX, deltaY, deltaGranularity, velocityX);
     }
     if (deltaGranularity != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_3_(deltaX, deltaY, deltaGranularity));
+      return _blink.BlinkScrollState.instance.constructorCallback_3_(deltaX, deltaY, deltaGranularity);
     }
     if (deltaY != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_2_(deltaX, deltaY));
+      return _blink.BlinkScrollState.instance.constructorCallback_2_(deltaX, deltaY);
     }
     if (deltaX != null) {
-      return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_1_(deltaX));
+      return _blink.BlinkScrollState.instance.constructorCallback_1_(deltaX);
     }
-    return wrap_jso(_blink.BlinkScrollState.instance.constructorCallback_0_());
+    return _blink.BlinkScrollState.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static ScrollState internalCreateScrollState() {
-    return new ScrollState._internalWrap();
-  }
-
-  factory ScrollState._internalWrap() {
-    return new ScrollState.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ScrollState.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ScrollState.deltaGranularity')
   @DocsEditable()
   @Experimental() // untriaged
-  num get deltaGranularity => _blink.BlinkScrollState.instance.deltaGranularity_Getter_(unwrap_jso(this));
+  num get deltaGranularity => _blink.BlinkScrollState.instance.deltaGranularity_Getter_(this);
   
   @DomName('ScrollState.deltaX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get deltaX => _blink.BlinkScrollState.instance.deltaX_Getter_(unwrap_jso(this));
+  num get deltaX => _blink.BlinkScrollState.instance.deltaX_Getter_(this);
   
   @DomName('ScrollState.deltaY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get deltaY => _blink.BlinkScrollState.instance.deltaY_Getter_(unwrap_jso(this));
+  num get deltaY => _blink.BlinkScrollState.instance.deltaY_Getter_(this);
   
   @DomName('ScrollState.fromUserInput')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get fromUserInput => _blink.BlinkScrollState.instance.fromUserInput_Getter_(unwrap_jso(this));
+  bool get fromUserInput => _blink.BlinkScrollState.instance.fromUserInput_Getter_(this);
   
   @DomName('ScrollState.inInertialPhase')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get inInertialPhase => _blink.BlinkScrollState.instance.inInertialPhase_Getter_(unwrap_jso(this));
+  bool get inInertialPhase => _blink.BlinkScrollState.instance.inInertialPhase_Getter_(this);
   
   @DomName('ScrollState.isBeginning')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isBeginning => _blink.BlinkScrollState.instance.isBeginning_Getter_(unwrap_jso(this));
+  bool get isBeginning => _blink.BlinkScrollState.instance.isBeginning_Getter_(this);
   
   @DomName('ScrollState.isEnding')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isEnding => _blink.BlinkScrollState.instance.isEnding_Getter_(unwrap_jso(this));
+  bool get isEnding => _blink.BlinkScrollState.instance.isEnding_Getter_(this);
   
   @DomName('ScrollState.shouldPropagate')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get shouldPropagate => _blink.BlinkScrollState.instance.shouldPropagate_Getter_(unwrap_jso(this));
+  bool get shouldPropagate => _blink.BlinkScrollState.instance.shouldPropagate_Getter_(this);
   
   @DomName('ScrollState.velocityX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get velocityX => _blink.BlinkScrollState.instance.velocityX_Getter_(unwrap_jso(this));
+  num get velocityX => _blink.BlinkScrollState.instance.velocityX_Getter_(this);
   
   @DomName('ScrollState.velocityY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get velocityY => _blink.BlinkScrollState.instance.velocityY_Getter_(unwrap_jso(this));
+  num get velocityY => _blink.BlinkScrollState.instance.velocityY_Getter_(this);
   
   @DomName('ScrollState.consumeDelta')
   @DocsEditable()
   @Experimental() // untriaged
-  void consumeDelta(num x, num y) => _blink.BlinkScrollState.instance.consumeDelta_Callback_2_(unwrap_jso(this), x, y);
+  void consumeDelta(num x, num y) => _blink.BlinkScrollState.instance.consumeDelta_Callback_2_(this, x, y);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34969,18 +32666,14 @@
   factory SecurityPolicyViolationEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkSecurityPolicyViolationEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkSecurityPolicyViolationEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkSecurityPolicyViolationEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkSecurityPolicyViolationEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static SecurityPolicyViolationEvent internalCreateSecurityPolicyViolationEvent() {
-    return new SecurityPolicyViolationEvent._internalWrap();
-  }
-
-  external factory SecurityPolicyViolationEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SecurityPolicyViolationEvent.internal_() : super.internal_();
@@ -34988,44 +32681,44 @@
 
   @DomName('SecurityPolicyViolationEvent.blockedURI')
   @DocsEditable()
-  String get blockedUri => _blink.BlinkSecurityPolicyViolationEvent.instance.blockedURI_Getter_(unwrap_jso(this));
+  String get blockedUri => _blink.BlinkSecurityPolicyViolationEvent.instance.blockedURI_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable()
-  int get columnNumber => _blink.BlinkSecurityPolicyViolationEvent.instance.columnNumber_Getter_(unwrap_jso(this));
+  int get columnNumber => _blink.BlinkSecurityPolicyViolationEvent.instance.columnNumber_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.documentURI')
   @DocsEditable()
-  String get documentUri => _blink.BlinkSecurityPolicyViolationEvent.instance.documentURI_Getter_(unwrap_jso(this));
+  String get documentUri => _blink.BlinkSecurityPolicyViolationEvent.instance.documentURI_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.effectiveDirective')
   @DocsEditable()
-  String get effectiveDirective => _blink.BlinkSecurityPolicyViolationEvent.instance.effectiveDirective_Getter_(unwrap_jso(this));
+  String get effectiveDirective => _blink.BlinkSecurityPolicyViolationEvent.instance.effectiveDirective_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.lineNumber')
   @DocsEditable()
-  int get lineNumber => _blink.BlinkSecurityPolicyViolationEvent.instance.lineNumber_Getter_(unwrap_jso(this));
+  int get lineNumber => _blink.BlinkSecurityPolicyViolationEvent.instance.lineNumber_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.originalPolicy')
   @DocsEditable()
-  String get originalPolicy => _blink.BlinkSecurityPolicyViolationEvent.instance.originalPolicy_Getter_(unwrap_jso(this));
+  String get originalPolicy => _blink.BlinkSecurityPolicyViolationEvent.instance.originalPolicy_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.referrer')
   @DocsEditable()
-  String get referrer => _blink.BlinkSecurityPolicyViolationEvent.instance.referrer_Getter_(unwrap_jso(this));
+  String get referrer => _blink.BlinkSecurityPolicyViolationEvent.instance.referrer_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.sourceFile')
   @DocsEditable()
-  String get sourceFile => _blink.BlinkSecurityPolicyViolationEvent.instance.sourceFile_Getter_(unwrap_jso(this));
+  String get sourceFile => _blink.BlinkSecurityPolicyViolationEvent.instance.sourceFile_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.statusCode')
   @DocsEditable()
   @Experimental() // untriaged
-  int get statusCode => _blink.BlinkSecurityPolicyViolationEvent.instance.statusCode_Getter_(unwrap_jso(this));
+  int get statusCode => _blink.BlinkSecurityPolicyViolationEvent.instance.statusCode_Getter_(this);
   
   @DomName('SecurityPolicyViolationEvent.violatedDirective')
   @DocsEditable()
-  String get violatedDirective => _blink.BlinkSecurityPolicyViolationEvent.instance.violatedDirective_Getter_(unwrap_jso(this));
+  String get violatedDirective => _blink.BlinkSecurityPolicyViolationEvent.instance.violatedDirective_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35044,11 +32737,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SelectElement internalCreateSelectElement() {
-    return new SelectElement._internalWrap();
-  }
-
-  external factory SelectElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SelectElement.internal_() : super.internal_();
@@ -35062,130 +32751,130 @@
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLSelectElement.instance.autofocus_Getter_(unwrap_jso(this));
+  bool get autofocus => _blink.BlinkHTMLSelectElement.instance.autofocus_Getter_(this);
   
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  set autofocus(bool value) => _blink.BlinkHTMLSelectElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLSelectElement.instance.autofocus_Setter_(this, value);
   
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLSelectElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLSelectElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLSelectElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLSelectElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLSelectElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLSelectElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLSelectElement.instance.form_Getter_(this);
   
   @DomName('HTMLSelectElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLSelectElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLSelectElement.instance.labels_Getter_(this));
   
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  int get length => _blink.BlinkHTMLSelectElement.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkHTMLSelectElement.instance.length_Getter_(this);
   
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  set length(int value) => _blink.BlinkHTMLSelectElement.instance.length_Setter_(unwrap_jso(this), value);
+  set length(int value) => _blink.BlinkHTMLSelectElement.instance.length_Setter_(this, value);
   
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.BlinkHTMLSelectElement.instance.multiple_Getter_(unwrap_jso(this));
+  bool get multiple => _blink.BlinkHTMLSelectElement.instance.multiple_Getter_(this);
   
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  set multiple(bool value) => _blink.BlinkHTMLSelectElement.instance.multiple_Setter_(unwrap_jso(this), value);
+  set multiple(bool value) => _blink.BlinkHTMLSelectElement.instance.multiple_Setter_(this, value);
   
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLSelectElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLSelectElement.instance.name_Getter_(this);
   
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLSelectElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLSelectElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  bool get required => _blink.BlinkHTMLSelectElement.instance.required_Getter_(unwrap_jso(this));
+  bool get required => _blink.BlinkHTMLSelectElement.instance.required_Getter_(this);
   
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  set required(bool value) => _blink.BlinkHTMLSelectElement.instance.required_Setter_(unwrap_jso(this), value);
+  set required(bool value) => _blink.BlinkHTMLSelectElement.instance.required_Setter_(this, value);
   
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  int get selectedIndex => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Getter_(unwrap_jso(this));
+  int get selectedIndex => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Getter_(this);
   
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Setter_(unwrap_jso(this), value);
+  set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Setter_(this, value);
   
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  int get size => _blink.BlinkHTMLSelectElement.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkHTMLSelectElement.instance.size_Getter_(this);
   
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  set size(int value) => _blink.BlinkHTMLSelectElement.instance.size_Setter_(unwrap_jso(this), value);
+  set size(int value) => _blink.BlinkHTMLSelectElement.instance.size_Setter_(this, value);
   
   @DomName('HTMLSelectElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLSelectElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLSelectElement.instance.type_Getter_(this);
   
   @DomName('HTMLSelectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLSelectElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLSelectElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLSelectElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLSelectElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLSelectElement.instance.validity_Getter_(this);
   
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLSelectElement.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkHTMLSelectElement.instance.value_Getter_(this);
   
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkHTMLSelectElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLSelectElement.instance.value_Setter_(this, value);
   
   @DomName('HTMLSelectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLSelectElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLSelectElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement option) => _blink.BlinkHTMLSelectElement.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(option));
+  void __setter__(int index, OptionElement option) => _blink.BlinkHTMLSelectElement.instance.$__setter___Callback_2_(this, index, option);
   
   @DomName('HTMLSelectElement.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(Object element, Object before) => _blink.BlinkHTMLSelectElement.instance.add_Callback_2_(unwrap_jso(this), element, before);
+  void add(Object element, Object before) => _blink.BlinkHTMLSelectElement.instance.add_Callback_2_(this, element, before);
   
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLSelectElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLSelectElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLSelectElement.item')
   @DocsEditable()
-  Element item(int index) => wrap_jso(_blink.BlinkHTMLSelectElement.instance.item_Callback_1_(unwrap_jso(this), index));
+  Element item(int index) => _blink.BlinkHTMLSelectElement.instance.item_Callback_1_(this, index);
   
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  OptionElement namedItem(String name) => wrap_jso(_blink.BlinkHTMLSelectElement.instance.namedItem_Callback_1_(unwrap_jso(this), name));
+  OptionElement namedItem(String name) => _blink.BlinkHTMLSelectElement.instance.namedItem_Callback_1_(this, name);
   
   @DomName('HTMLSelectElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLSelectElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLSelectElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLSelectElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLSelectElement.instance.setCustomValidity_Callback_1_(this, error);
   
 
   // Override default options, since IE returns SelectElement itself and it
@@ -35219,142 +32908,134 @@
   // To suppress missing implicit constructor warnings.
   factory Selection._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Selection internalCreateSelection() {
-    return new Selection._internalWrap();
-  }
 
-  factory Selection._internalWrap() {
-    return new Selection.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Selection.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Selection.anchorNode')
   @DocsEditable()
-  Node get anchorNode => wrap_jso(_blink.BlinkSelection.instance.anchorNode_Getter_(unwrap_jso(this)));
+  Node get anchorNode => _blink.BlinkSelection.instance.anchorNode_Getter_(this);
   
   @DomName('Selection.anchorOffset')
   @DocsEditable()
-  int get anchorOffset => _blink.BlinkSelection.instance.anchorOffset_Getter_(unwrap_jso(this));
+  int get anchorOffset => _blink.BlinkSelection.instance.anchorOffset_Getter_(this);
   
   @DomName('Selection.baseNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get baseNode => wrap_jso(_blink.BlinkSelection.instance.baseNode_Getter_(unwrap_jso(this)));
+  Node get baseNode => _blink.BlinkSelection.instance.baseNode_Getter_(this);
   
   @DomName('Selection.baseOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get baseOffset => _blink.BlinkSelection.instance.baseOffset_Getter_(unwrap_jso(this));
+  int get baseOffset => _blink.BlinkSelection.instance.baseOffset_Getter_(this);
   
   @DomName('Selection.extentNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get extentNode => wrap_jso(_blink.BlinkSelection.instance.extentNode_Getter_(unwrap_jso(this)));
+  Node get extentNode => _blink.BlinkSelection.instance.extentNode_Getter_(this);
   
   @DomName('Selection.extentOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get extentOffset => _blink.BlinkSelection.instance.extentOffset_Getter_(unwrap_jso(this));
+  int get extentOffset => _blink.BlinkSelection.instance.extentOffset_Getter_(this);
   
   @DomName('Selection.focusNode')
   @DocsEditable()
-  Node get focusNode => wrap_jso(_blink.BlinkSelection.instance.focusNode_Getter_(unwrap_jso(this)));
+  Node get focusNode => _blink.BlinkSelection.instance.focusNode_Getter_(this);
   
   @DomName('Selection.focusOffset')
   @DocsEditable()
-  int get focusOffset => _blink.BlinkSelection.instance.focusOffset_Getter_(unwrap_jso(this));
+  int get focusOffset => _blink.BlinkSelection.instance.focusOffset_Getter_(this);
   
   @DomName('Selection.isCollapsed')
   @DocsEditable()
-  bool get isCollapsed => _blink.BlinkSelection.instance.isCollapsed_Getter_(unwrap_jso(this));
+  bool get isCollapsed => _blink.BlinkSelection.instance.isCollapsed_Getter_(this);
   
   @DomName('Selection.rangeCount')
   @DocsEditable()
-  int get rangeCount => _blink.BlinkSelection.instance.rangeCount_Getter_(unwrap_jso(this));
+  int get rangeCount => _blink.BlinkSelection.instance.rangeCount_Getter_(this);
   
   @DomName('Selection.type')
   @DocsEditable()
   @Experimental() // non-standard
-  String get type => _blink.BlinkSelection.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkSelection.instance.type_Getter_(this);
   
   @DomName('Selection.addRange')
   @DocsEditable()
-  void addRange(Range range) => _blink.BlinkSelection.instance.addRange_Callback_1_(unwrap_jso(this), unwrap_jso(range));
+  void addRange(Range range) => _blink.BlinkSelection.instance.addRange_Callback_1_(this, range);
   
   void collapse(Node node, [int offset]) {
     if (offset != null) {
-      _blink.BlinkSelection.instance.collapse_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
+      _blink.BlinkSelection.instance.collapse_Callback_2_(this, node, offset);
       return;
     }
-    _blink.BlinkSelection.instance.collapse_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+    _blink.BlinkSelection.instance.collapse_Callback_1_(this, node);
     return;
   }
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
-  void collapseToEnd() => _blink.BlinkSelection.instance.collapseToEnd_Callback_0_(unwrap_jso(this));
+  void collapseToEnd() => _blink.BlinkSelection.instance.collapseToEnd_Callback_0_(this);
   
   @DomName('Selection.collapseToStart')
   @DocsEditable()
-  void collapseToStart() => _blink.BlinkSelection.instance.collapseToStart_Callback_0_(unwrap_jso(this));
+  void collapseToStart() => _blink.BlinkSelection.instance.collapseToStart_Callback_0_(this);
   
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartialContainment) => _blink.BlinkSelection.instance.containsNode_Callback_2_(unwrap_jso(this), unwrap_jso(node), allowPartialContainment);
+  bool containsNode(Node node, bool allowPartialContainment) => _blink.BlinkSelection.instance.containsNode_Callback_2_(this, node, allowPartialContainment);
   
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
-  void deleteFromDocument() => _blink.BlinkSelection.instance.deleteFromDocument_Callback_0_(unwrap_jso(this));
+  void deleteFromDocument() => _blink.BlinkSelection.instance.deleteFromDocument_Callback_0_(this);
   
   @DomName('Selection.empty')
   @DocsEditable()
   @Experimental() // non-standard
-  void empty() => _blink.BlinkSelection.instance.empty_Callback_0_(unwrap_jso(this));
+  void empty() => _blink.BlinkSelection.instance.empty_Callback_0_(this);
   
   void extend(Node node, [int offset]) {
     if (offset != null) {
-      _blink.BlinkSelection.instance.extend_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
+      _blink.BlinkSelection.instance.extend_Callback_2_(this, node, offset);
       return;
     }
-    _blink.BlinkSelection.instance.extend_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+    _blink.BlinkSelection.instance.extend_Callback_1_(this, node);
     return;
   }
 
   @DomName('Selection.getRangeAt')
   @DocsEditable()
-  Range getRangeAt(int index) => wrap_jso(_blink.BlinkSelection.instance.getRangeAt_Callback_1_(unwrap_jso(this), index));
+  Range getRangeAt(int index) => _blink.BlinkSelection.instance.getRangeAt_Callback_1_(this, index);
   
   @DomName('Selection.modify')
   @DocsEditable()
   @Experimental() // non-standard
-  void modify(String alter, String direction, String granularity) => _blink.BlinkSelection.instance.modify_Callback_3_(unwrap_jso(this), alter, direction, granularity);
+  void modify(String alter, String direction, String granularity) => _blink.BlinkSelection.instance.modify_Callback_3_(this, alter, direction, granularity);
   
   @DomName('Selection.removeAllRanges')
   @DocsEditable()
-  void removeAllRanges() => _blink.BlinkSelection.instance.removeAllRanges_Callback_0_(unwrap_jso(this));
+  void removeAllRanges() => _blink.BlinkSelection.instance.removeAllRanges_Callback_0_(this);
   
   @DomName('Selection.selectAllChildren')
   @DocsEditable()
-  void selectAllChildren(Node node) => _blink.BlinkSelection.instance.selectAllChildren_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+  void selectAllChildren(Node node) => _blink.BlinkSelection.instance.selectAllChildren_Callback_1_(this, node);
   
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable()
   @Experimental() // non-standard
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.BlinkSelection.instance.setBaseAndExtent_Callback_4_(unwrap_jso(this), unwrap_jso(baseNode), baseOffset, unwrap_jso(extentNode), extentOffset);
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.BlinkSelection.instance.setBaseAndExtent_Callback_4_(this, baseNode, baseOffset, extentNode, extentOffset);
   
   void setPosition(Node node, [int offset]) {
     if (offset != null) {
-      _blink.BlinkSelection.instance.setPosition_Callback_2_(unwrap_jso(this), unwrap_jso(node), offset);
+      _blink.BlinkSelection.instance.setPosition_Callback_2_(this, node, offset);
       return;
     }
-    _blink.BlinkSelection.instance.setPosition_Callback_1_(unwrap_jso(this), unwrap_jso(node));
+    _blink.BlinkSelection.instance.setPosition_Callback_1_(this, node);
     return;
   }
 
@@ -35373,47 +33054,39 @@
   // To suppress missing implicit constructor warnings.
   factory ServicePort._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ServicePort internalCreateServicePort() {
-    return new ServicePort._internalWrap();
-  }
 
-  factory ServicePort._internalWrap() {
-    return new ServicePort.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ServicePort.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ServicePort.data')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get data => wrap_jso(_blink.BlinkServicePort.instance.data_Getter_(unwrap_jso(this)));
+  Object get data => (_blink.BlinkServicePort.instance.data_Getter_(this));
   
   @DomName('ServicePort.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkServicePort.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkServicePort.instance.name_Getter_(this);
   
   @DomName('ServicePort.targetURL')
   @DocsEditable()
   @Experimental() // untriaged
-  String get targetUrl => _blink.BlinkServicePort.instance.targetURL_Getter_(unwrap_jso(this));
+  String get targetUrl => _blink.BlinkServicePort.instance.targetURL_Getter_(this);
   
   @DomName('ServicePort.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.BlinkServicePort.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkServicePort.instance.close_Callback_0_(this);
   
   void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkServicePort.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkServicePort.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkServicePort.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkServicePort.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
@@ -35439,11 +33112,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ServicePortCollection internalCreateServicePortCollection() {
-    return new ServicePortCollection._internalWrap();
-  }
-
-  external factory ServicePortCollection._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ServicePortCollection.internal_() : super.internal_();
@@ -35451,21 +33120,21 @@
 
   Future connect(String url, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkServicePortCollection.instance.connect_Callback_2_(unwrap_jso(this), url, convertDartToNative_Dictionary(options)));
+      return _blink.BlinkServicePortCollection.instance.connect_Callback_2_(this, url, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkServicePortCollection.instance.connect_Callback_1_(unwrap_jso(this), url));
+    return _blink.BlinkServicePortCollection.instance.connect_Callback_1_(this, url);
   }
 
   @DomName('ServicePortCollection.match')
   @DocsEditable()
   @Experimental() // untriaged
-  Future match(Map options) => wrap_jso(_blink.BlinkServicePortCollection.instance.match_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+  Future match(Map options) => convertNativePromiseToDartFuture(_blink.BlinkServicePortCollection.instance.match_Callback_1_(this, convertDartToNative_Dictionary(options)));
   
   Future matchAll([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkServicePortCollection.instance.matchAll_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkServicePortCollection.instance.matchAll_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkServicePortCollection.instance.matchAll_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkServicePortCollection.instance.matchAll_Callback_0_(this);
   }
 
   @DomName('ServicePortCollection.onmessage')
@@ -35493,18 +33162,14 @@
   factory ServicePortConnectEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkServicePortConnectEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkServicePortConnectEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkServicePortConnectEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkServicePortConnectEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static ServicePortConnectEvent internalCreateServicePortConnectEvent() {
-    return new ServicePortConnectEvent._internalWrap();
-  }
-
-  external factory ServicePortConnectEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ServicePortConnectEvent.internal_() : super.internal_();
@@ -35513,17 +33178,17 @@
   @DomName('ServicePortConnectEvent.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkServicePortConnectEvent.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkServicePortConnectEvent.instance.origin_Getter_(this);
   
   @DomName('ServicePortConnectEvent.targetURL')
   @DocsEditable()
   @Experimental() // untriaged
-  String get targetUrl => _blink.BlinkServicePortConnectEvent.instance.targetURL_Getter_(unwrap_jso(this));
+  String get targetUrl => _blink.BlinkServicePortConnectEvent.instance.targetURL_Getter_(this);
   
   @DomName('ServicePortConnectEvent.respondWith')
   @DocsEditable()
   @Experimental() // untriaged
-  Future respondWith(Future response) => wrap_jso(_blink.BlinkServicePortConnectEvent.instance.respondWith_Callback_1_(unwrap_jso(this), response));
+  Future respondWith(Future response) => convertNativePromiseToDartFuture(_blink.BlinkServicePortConnectEvent.instance.respondWith_Callback_1_(this, response));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35547,11 +33212,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ServiceWorkerContainer internalCreateServiceWorkerContainer() {
-    return new ServiceWorkerContainer._internalWrap();
-  }
-
-  external factory ServiceWorkerContainer._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ServiceWorkerContainer.internal_() : super.internal_();
@@ -35560,30 +33221,30 @@
   @DomName('ServiceWorkerContainer.controller')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get controller => wrap_jso(_blink.BlinkServiceWorkerContainer.instance.controller_Getter_(unwrap_jso(this)));
+  _ServiceWorker get controller => _blink.BlinkServiceWorkerContainer.instance.controller_Getter_(this);
   
   @DomName('ServiceWorkerContainer.ready')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get ready => wrap_jso(_blink.BlinkServiceWorkerContainer.instance.ready_Getter_(unwrap_jso(this)));
+  Future get ready => convertNativePromiseToDartFuture(_blink.BlinkServiceWorkerContainer.instance.ready_Getter_(this));
   
   Future getRegistration([String documentURL]) {
     if (documentURL != null) {
-      return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_1_(unwrap_jso(this), documentURL));
+      return _blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_1_(this, documentURL);
     }
-    return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_0_(this);
   }
 
   @DomName('ServiceWorkerContainer.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() => wrap_jso(_blink.BlinkServiceWorkerContainer.instance.getRegistrations_Callback_0_(unwrap_jso(this)));
+  Future getRegistrations() => convertNativePromiseToDartFuture(_blink.BlinkServiceWorkerContainer.instance.getRegistrations_Callback_0_(this));
   
   Future register(String url, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.register_Callback_2_(unwrap_jso(this), url, convertDartToNative_Dictionary(options)));
+      return _blink.BlinkServiceWorkerContainer.instance.register_Callback_2_(this, url, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.register_Callback_1_(unwrap_jso(this), url));
+    return _blink.BlinkServiceWorkerContainer.instance.register_Callback_1_(this, url);
   }
 
   @DomName('ServiceWorkerContainer.onmessage')
@@ -35613,11 +33274,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ServiceWorkerGlobalScope internalCreateServiceWorkerGlobalScope() {
-    return new ServiceWorkerGlobalScope._internalWrap();
-  }
-
-  external factory ServiceWorkerGlobalScope._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ServiceWorkerGlobalScope.internal_() : super.internal_();
@@ -35626,34 +33283,34 @@
   @DomName('ServiceWorkerGlobalScope.clients')
   @DocsEditable()
   @Experimental() // untriaged
-  Clients get clients => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.clients_Getter_(unwrap_jso(this)));
+  Clients get clients => _blink.BlinkServiceWorkerGlobalScope.instance.clients_Getter_(this);
   
   @DomName('ServiceWorkerGlobalScope.ports')
   @DocsEditable()
   @Experimental() // untriaged
-  StashedPortCollection get ports => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.ports_Getter_(unwrap_jso(this)));
+  StashedPortCollection get ports => _blink.BlinkServiceWorkerGlobalScope.instance.ports_Getter_(this);
   
   @DomName('ServiceWorkerGlobalScope.registration')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerRegistration get registration => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.registration_Getter_(unwrap_jso(this)));
+  ServiceWorkerRegistration get registration => _blink.BlinkServiceWorkerGlobalScope.instance.registration_Getter_(this);
   
   @DomName('ServiceWorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.BlinkServiceWorkerGlobalScope.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkServiceWorkerGlobalScope.instance.close_Callback_0_(this);
   
   Future _fetch(/*RequestInfo*/ input, [Map init]) {
     if (init != null) {
-      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), input, convertDartToNative_Dictionary(init)));
+      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(this, input, convertDartToNative_Dictionary(init));
     }
-    return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), input));
+    return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(this, input);
   }
 
   @DomName('ServiceWorkerGlobalScope.skipWaiting')
   @DocsEditable()
   @Experimental() // untriaged
-  Future skipWaiting() => wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.skipWaiting_Callback_0_(unwrap_jso(this)));
+  Future skipWaiting() => convertNativePromiseToDartFuture(_blink.BlinkServiceWorkerGlobalScope.instance.skipWaiting_Callback_0_(this));
   
   @DomName('ServiceWorkerGlobalScope.onmessage')
   @DocsEditable()
@@ -35680,7 +33337,7 @@
   @DomName('ServiceWorkerMessageEvent.data')
   @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(
-      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+      _blink.BlinkMessageEvent.instance.data_Getter_(this));
 
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerMessageEvent._() { throw new UnsupportedError("Not supported"); }
@@ -35690,18 +33347,14 @@
   factory ServiceWorkerMessageEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkServiceWorkerMessageEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkServiceWorkerMessageEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static ServiceWorkerMessageEvent internalCreateServiceWorkerMessageEvent() {
-    return new ServiceWorkerMessageEvent._internalWrap();
-  }
-
-  external factory ServiceWorkerMessageEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ServiceWorkerMessageEvent.internal_() : super.internal_();
@@ -35710,22 +33363,22 @@
   @DomName('ServiceWorkerMessageEvent.lastEventId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get lastEventId => _blink.BlinkServiceWorkerMessageEvent.instance.lastEventId_Getter_(unwrap_jso(this));
+  String get lastEventId => _blink.BlinkServiceWorkerMessageEvent.instance.lastEventId_Getter_(this);
   
   @DomName('ServiceWorkerMessageEvent.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkServiceWorkerMessageEvent.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkServiceWorkerMessageEvent.instance.origin_Getter_(this);
   
   @DomName('ServiceWorkerMessageEvent.ports')
   @DocsEditable()
   @Experimental() // untriaged
-  List<MessagePort> get ports => wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.ports_Getter_(unwrap_jso(this)));
+  List<MessagePort> get ports => (_blink.BlinkServiceWorkerMessageEvent.instance.ports_Getter_(this));
   
   @DomName('ServiceWorkerMessageEvent.source')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get source => wrap_jso(_blink.BlinkServiceWorkerMessageEvent.instance.source_Getter_(unwrap_jso(this)));
+  Object get source => (_blink.BlinkServiceWorkerMessageEvent.instance.source_Getter_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35744,11 +33397,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ServiceWorkerRegistration internalCreateServiceWorkerRegistration() {
-    return new ServiceWorkerRegistration._internalWrap();
-  }
-
-  external factory ServiceWorkerRegistration._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ServiceWorkerRegistration.internal_() : super.internal_();
@@ -35757,66 +33406,66 @@
   @DomName('ServiceWorkerRegistration.active')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get active => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.active_Getter_(unwrap_jso(this)));
+  _ServiceWorker get active => _blink.BlinkServiceWorkerRegistration.instance.active_Getter_(this);
   
   @DomName('ServiceWorkerRegistration.geofencing')
   @DocsEditable()
   @Experimental() // untriaged
-  Geofencing get geofencing => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.geofencing_Getter_(unwrap_jso(this)));
+  Geofencing get geofencing => _blink.BlinkServiceWorkerRegistration.instance.geofencing_Getter_(this);
   
   @DomName('ServiceWorkerRegistration.installing')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get installing => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.installing_Getter_(unwrap_jso(this)));
+  _ServiceWorker get installing => _blink.BlinkServiceWorkerRegistration.instance.installing_Getter_(this);
   
   @DomName('ServiceWorkerRegistration.periodicSync')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicSyncManager get periodicSync => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.periodicSync_Getter_(unwrap_jso(this)));
+  PeriodicSyncManager get periodicSync => _blink.BlinkServiceWorkerRegistration.instance.periodicSync_Getter_(this);
   
   @DomName('ServiceWorkerRegistration.pushManager')
   @DocsEditable()
   @Experimental() // untriaged
-  PushManager get pushManager => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.pushManager_Getter_(unwrap_jso(this)));
+  PushManager get pushManager => _blink.BlinkServiceWorkerRegistration.instance.pushManager_Getter_(this);
   
   @DomName('ServiceWorkerRegistration.scope')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scope => _blink.BlinkServiceWorkerRegistration.instance.scope_Getter_(unwrap_jso(this));
+  String get scope => _blink.BlinkServiceWorkerRegistration.instance.scope_Getter_(this);
   
   @DomName('ServiceWorkerRegistration.sync')
   @DocsEditable()
   @Experimental() // untriaged
-  SyncManager get sync => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.sync_Getter_(unwrap_jso(this)));
+  SyncManager get sync => _blink.BlinkServiceWorkerRegistration.instance.sync_Getter_(this);
   
   @DomName('ServiceWorkerRegistration.waiting')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get waiting => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.waiting_Getter_(unwrap_jso(this)));
+  _ServiceWorker get waiting => _blink.BlinkServiceWorkerRegistration.instance.waiting_Getter_(this);
   
   Future getNotifications([Map filter]) {
     if (filter != null) {
-      return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.getNotifications_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(filter)));
+      return _blink.BlinkServiceWorkerRegistration.instance.getNotifications_Callback_1_(this, convertDartToNative_Dictionary(filter));
     }
-    return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.getNotifications_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkServiceWorkerRegistration.instance.getNotifications_Callback_0_(this);
   }
 
   Future showNotification(String title, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.showNotification_Callback_2_(unwrap_jso(this), title, convertDartToNative_Dictionary(options)));
+      return _blink.BlinkServiceWorkerRegistration.instance.showNotification_Callback_2_(this, title, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.showNotification_Callback_1_(unwrap_jso(this), title));
+    return _blink.BlinkServiceWorkerRegistration.instance.showNotification_Callback_1_(this, title);
   }
 
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.unregister_Callback_0_(unwrap_jso(this)));
+  Future unregister() => convertNativePromiseToDartFuture(_blink.BlinkServiceWorkerRegistration.instance.unregister_Callback_0_(this));
   
   @DomName('ServiceWorkerRegistration.update')
   @DocsEditable()
   @Experimental() // untriaged
-  void update() => _blink.BlinkServiceWorkerRegistration.instance.update_Callback_0_(unwrap_jso(this));
+  void update() => _blink.BlinkServiceWorkerRegistration.instance.update_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35841,11 +33490,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ShadowElement internalCreateShadowElement() {
-    return new ShadowElement._internalWrap();
-  }
-
-  external factory ShadowElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ShadowElement.internal_() : super.internal_();
@@ -35863,7 +33508,7 @@
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDistributedNodes() => wrap_jso(_blink.BlinkHTMLShadowElement.instance.getDistributedNodes_Callback_0_(unwrap_jso(this)));
+  List<Node> getDistributedNodes() => (_blink.BlinkHTMLShadowElement.instance.getDistributedNodes_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35883,11 +33528,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ShadowRoot internalCreateShadowRoot() {
-    return new ShadowRoot._internalWrap();
-  }
-
-  external factory ShadowRoot._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ShadowRoot.internal_() : super.internal_();
@@ -35895,52 +33536,52 @@
 
   @DomName('ShadowRoot.activeElement')
   @DocsEditable()
-  Element get activeElement => wrap_jso(_blink.BlinkShadowRoot.instance.activeElement_Getter_(unwrap_jso(this)));
+  Element get activeElement => _blink.BlinkShadowRoot.instance.activeElement_Getter_(this);
   
   @DomName('ShadowRoot.delegatesFocus')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get delegatesFocus => _blink.BlinkShadowRoot.instance.delegatesFocus_Getter_(unwrap_jso(this));
+  bool get delegatesFocus => _blink.BlinkShadowRoot.instance.delegatesFocus_Getter_(this);
   
   @DomName('ShadowRoot.host')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get host => wrap_jso(_blink.BlinkShadowRoot.instance.host_Getter_(unwrap_jso(this)));
+  Element get host => _blink.BlinkShadowRoot.instance.host_Getter_(this);
   
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  String get innerHtml => _blink.BlinkShadowRoot.instance.innerHTML_Getter_(unwrap_jso(this));
+  String get innerHtml => _blink.BlinkShadowRoot.instance.innerHTML_Getter_(this);
   
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  set innerHtml(String value) => _blink.BlinkShadowRoot.instance.innerHTML_Setter_(unwrap_jso(this), value);
+  set innerHtml(String value) => _blink.BlinkShadowRoot.instance.innerHTML_Setter_(this, value);
   
   @DomName('ShadowRoot.olderShadowRoot')
   @DocsEditable()
   @Experimental() // untriaged
-  ShadowRoot get olderShadowRoot => wrap_jso(_blink.BlinkShadowRoot.instance.olderShadowRoot_Getter_(unwrap_jso(this)));
+  ShadowRoot get olderShadowRoot => _blink.BlinkShadowRoot.instance.olderShadowRoot_Getter_(this);
   
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
-  List<StyleSheet> get styleSheets => wrap_jso(_blink.BlinkShadowRoot.instance.styleSheets_Getter_(unwrap_jso(this)));
+  List<StyleSheet> get styleSheets => (_blink.BlinkShadowRoot.instance.styleSheets_Getter_(this));
   
   @DomName('ShadowRoot.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => wrap_jso(_blink.BlinkShadowRoot.instance.cloneNode_Callback_1_(unwrap_jso(this), deep));
+  Node clone(bool deep) => _blink.BlinkShadowRoot.instance.cloneNode_Callback_1_(this, deep);
   
   @DomName('ShadowRoot.elementFromPoint')
   @DocsEditable()
-  Element elementFromPoint(int x, int y) => wrap_jso(_blink.BlinkShadowRoot.instance.elementFromPoint_Callback_2_(unwrap_jso(this), x, y));
+  Element elementFromPoint(int x, int y) => _blink.BlinkShadowRoot.instance.elementFromPoint_Callback_2_(this, x, y);
   
   @DomName('ShadowRoot.elementsFromPoint')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Element> elementsFromPoint(int x, int y) => wrap_jso(_blink.BlinkShadowRoot.instance.elementsFromPoint_Callback_2_(unwrap_jso(this), x, y));
+  List<Element> elementsFromPoint(int x, int y) => (_blink.BlinkShadowRoot.instance.elementsFromPoint_Callback_2_(this, x, y));
   
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
-  Selection getSelection() => wrap_jso(_blink.BlinkShadowRoot.instance.getSelection_Callback_0_(unwrap_jso(this)));
+  Selection getSelection() => _blink.BlinkShadowRoot.instance.getSelection_Callback_0_(this);
   
   static final bool supported = true;
 
@@ -35993,25 +33634,17 @@
   // To suppress missing implicit constructor warnings.
   factory SharedArrayBuffer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SharedArrayBuffer internalCreateSharedArrayBuffer() {
-    return new SharedArrayBuffer._internalWrap();
-  }
 
-  factory SharedArrayBuffer._internalWrap() {
-    return new SharedArrayBuffer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SharedArrayBuffer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SharedArrayBuffer.byteLength')
   @DocsEditable()
   @Experimental() // untriaged
-  int get byteLength => _blink.BlinkSharedArrayBuffer.instance.byteLength_Getter_(unwrap_jso(this));
+  int get byteLength => _blink.BlinkSharedArrayBuffer.instance.byteLength_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36037,16 +33670,12 @@
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable()
   factory SharedWorker(String scriptURL, [String name]) {
-    return wrap_jso(_blink.BlinkSharedWorker.instance.constructorCallback_2_(scriptURL, name));
+    return _blink.BlinkSharedWorker.instance.constructorCallback_2_(scriptURL, name);
   }
 
 
   @Deprecated("Internal Use Only")
-  static SharedWorker internalCreateSharedWorker() {
-    return new SharedWorker._internalWrap();
-  }
-
-  external factory SharedWorker._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SharedWorker.internal_() : super.internal_();
@@ -36054,12 +33683,12 @@
 
   @DomName('SharedWorker.port')
   @DocsEditable()
-  MessagePort get port => wrap_jso(_blink.BlinkSharedWorker.instance.port_Getter_(unwrap_jso(this)));
+  MessagePort get port => _blink.BlinkSharedWorker.instance.port_Getter_(this);
   
   @DomName('SharedWorker.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get workerStart => _blink.BlinkSharedWorker.instance.workerStart_Getter_(unwrap_jso(this));
+  num get workerStart => _blink.BlinkSharedWorker.instance.workerStart_Getter_(this);
   
   @DomName('SharedWorker.onerror')
   @DocsEditable()
@@ -36094,11 +33723,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SharedWorkerGlobalScope internalCreateSharedWorkerGlobalScope() {
-    return new SharedWorkerGlobalScope._internalWrap();
-  }
-
-  external factory SharedWorkerGlobalScope._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SharedWorkerGlobalScope.internal_() : super.internal_();
@@ -36107,7 +33732,7 @@
   @DomName('SharedWorkerGlobalScope.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkSharedWorkerGlobalScope.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkSharedWorkerGlobalScope.instance.name_Getter_(this);
   
   /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
@@ -36133,11 +33758,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SourceBuffer internalCreateSourceBuffer() {
-    return new SourceBuffer._internalWrap();
-  }
-
-  external factory SourceBuffer._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SourceBuffer.internal_() : super.internal_();
@@ -36146,87 +33767,87 @@
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowEnd => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Getter_(unwrap_jso(this));
+  num get appendWindowEnd => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Getter_(this);
   
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Setter_(unwrap_jso(this), value);
+  set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Setter_(this, value);
   
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowStart => _blink.BlinkSourceBuffer.instance.appendWindowStart_Getter_(unwrap_jso(this));
+  num get appendWindowStart => _blink.BlinkSourceBuffer.instance.appendWindowStart_Getter_(this);
   
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  set appendWindowStart(num value) => _blink.BlinkSourceBuffer.instance.appendWindowStart_Setter_(unwrap_jso(this), value);
+  set appendWindowStart(num value) => _blink.BlinkSourceBuffer.instance.appendWindowStart_Setter_(this, value);
   
   @DomName('SourceBuffer.buffered')
   @DocsEditable()
-  TimeRanges get buffered => wrap_jso(_blink.BlinkSourceBuffer.instance.buffered_Getter_(unwrap_jso(this)));
+  TimeRanges get buffered => _blink.BlinkSourceBuffer.instance.buffered_Getter_(this);
   
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mode => _blink.BlinkSourceBuffer.instance.mode_Getter_(unwrap_jso(this));
+  String get mode => _blink.BlinkSourceBuffer.instance.mode_Getter_(this);
   
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  set mode(String value) => _blink.BlinkSourceBuffer.instance.mode_Setter_(unwrap_jso(this), value);
+  set mode(String value) => _blink.BlinkSourceBuffer.instance.mode_Setter_(this, value);
   
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  num get timestampOffset => _blink.BlinkSourceBuffer.instance.timestampOffset_Getter_(unwrap_jso(this));
+  num get timestampOffset => _blink.BlinkSourceBuffer.instance.timestampOffset_Getter_(this);
   
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  set timestampOffset(num value) => _blink.BlinkSourceBuffer.instance.timestampOffset_Setter_(unwrap_jso(this), value);
+  set timestampOffset(num value) => _blink.BlinkSourceBuffer.instance.timestampOffset_Setter_(this, value);
   
   @DomName('SourceBuffer.trackDefaults')
   @DocsEditable()
   @Experimental() // untriaged
-  TrackDefaultList get trackDefaults => wrap_jso(_blink.BlinkSourceBuffer.instance.trackDefaults_Getter_(unwrap_jso(this)));
+  TrackDefaultList get trackDefaults => _blink.BlinkSourceBuffer.instance.trackDefaults_Getter_(this);
   
   @DomName('SourceBuffer.trackDefaults')
   @DocsEditable()
   @Experimental() // untriaged
-  set trackDefaults(TrackDefaultList value) => _blink.BlinkSourceBuffer.instance.trackDefaults_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set trackDefaults(TrackDefaultList value) => _blink.BlinkSourceBuffer.instance.trackDefaults_Setter_(this, value);
   
   @DomName('SourceBuffer.updating')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get updating => _blink.BlinkSourceBuffer.instance.updating_Getter_(unwrap_jso(this));
+  bool get updating => _blink.BlinkSourceBuffer.instance.updating_Getter_(this);
   
   @DomName('SourceBuffer.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkSourceBuffer.instance.abort_Callback_0_(unwrap_jso(this));
+  void abort() => _blink.BlinkSourceBuffer.instance.abort_Callback_0_(this);
   
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(this, data);
   
   void appendStream(FileStream stream, [int maxSize]) {
     if (maxSize != null) {
-      _blink.BlinkSourceBuffer.instance.appendStream_Callback_2_(unwrap_jso(this), unwrap_jso(stream), maxSize);
+      _blink.BlinkSourceBuffer.instance.appendStream_Callback_2_(this, stream, maxSize);
       return;
     }
-    _blink.BlinkSourceBuffer.instance.appendStream_Callback_1_(unwrap_jso(this), unwrap_jso(stream));
+    _blink.BlinkSourceBuffer.instance.appendStream_Callback_1_(this, stream);
     return;
   }
 
   @DomName('SourceBuffer.appendTypedData')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendTypedData(TypedData data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void appendTypedData(TypedData data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(this, data);
   
   @DomName('SourceBuffer.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(num start, num end) => _blink.BlinkSourceBuffer.instance.remove_Callback_2_(unwrap_jso(this), start, end);
+  void remove(num start, num end) => _blink.BlinkSourceBuffer.instance.remove_Callback_2_(this, start, end);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36246,11 +33867,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SourceBufferList internalCreateSourceBufferList() {
-    return new SourceBufferList._internalWrap();
-  }
-
-  external factory SourceBufferList._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SourceBufferList.internal_() : super.internal_();
@@ -36258,15 +33875,15 @@
 
   @DomName('SourceBufferList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSourceBufferList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSourceBufferList.instance.length_Getter_(this);
   
   SourceBuffer operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkSourceBufferList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  SourceBuffer _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSourceBufferList.instance.item_Callback_1_(unwrap_jso(this), index));
+  SourceBuffer _nativeIndexedGetter(int index) => (_blink.BlinkSourceBufferList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -36308,7 +33925,7 @@
 
   @DomName('SourceBufferList.item')
   @DocsEditable()
-  SourceBuffer item(int index) => wrap_jso(_blink.BlinkSourceBufferList.instance.item_Callback_1_(unwrap_jso(this), index));
+  SourceBuffer item(int index) => _blink.BlinkSourceBufferList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36330,11 +33947,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SourceElement internalCreateSourceElement() {
-    return new SourceElement._internalWrap();
-  }
-
-  external factory SourceElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SourceElement.internal_() : super.internal_();
@@ -36348,47 +33961,47 @@
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkHTMLSourceElement.instance.media_Getter_(unwrap_jso(this));
+  String get media => _blink.BlinkHTMLSourceElement.instance.media_Getter_(this);
   
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  set media(String value) => _blink.BlinkHTMLSourceElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkHTMLSourceElement.instance.media_Setter_(this, value);
   
   @DomName('HTMLSourceElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  String get sizes => _blink.BlinkHTMLSourceElement.instance.sizes_Getter_(unwrap_jso(this));
+  String get sizes => _blink.BlinkHTMLSourceElement.instance.sizes_Getter_(this);
   
   @DomName('HTMLSourceElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  set sizes(String value) => _blink.BlinkHTMLSourceElement.instance.sizes_Setter_(unwrap_jso(this), value);
+  set sizes(String value) => _blink.BlinkHTMLSourceElement.instance.sizes_Setter_(this, value);
   
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLSourceElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLSourceElement.instance.src_Getter_(this);
   
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLSourceElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLSourceElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLSourceElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  String get srcset => _blink.BlinkHTMLSourceElement.instance.srcset_Getter_(unwrap_jso(this));
+  String get srcset => _blink.BlinkHTMLSourceElement.instance.srcset_Getter_(this);
   
   @DomName('HTMLSourceElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  set srcset(String value) => _blink.BlinkHTMLSourceElement.instance.srcset_Setter_(unwrap_jso(this), value);
+  set srcset(String value) => _blink.BlinkHTMLSourceElement.instance.srcset_Setter_(this, value);
   
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLSourceElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLSourceElement.instance.type_Getter_(this);
   
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLSourceElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLSourceElement.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36405,40 +34018,32 @@
   // To suppress missing implicit constructor warnings.
   factory SourceInfo._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SourceInfo internalCreateSourceInfo() {
-    return new SourceInfo._internalWrap();
-  }
 
-  factory SourceInfo._internalWrap() {
-    return new SourceInfo.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SourceInfo.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SourceInfo.facing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get facing => _blink.BlinkSourceInfo.instance.facing_Getter_(unwrap_jso(this));
+  String get facing => _blink.BlinkSourceInfo.instance.facing_Getter_(this);
   
   @DomName('SourceInfo.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkSourceInfo.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkSourceInfo.instance.id_Getter_(this);
   
   @DomName('SourceInfo.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkSourceInfo.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkSourceInfo.instance.kind_Getter_(this);
   
   @DomName('SourceInfo.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkSourceInfo.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkSourceInfo.instance.label_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36460,11 +34065,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SpanElement internalCreateSpanElement() {
-    return new SpanElement._internalWrap();
-  }
-
-  external factory SpanElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpanElement.internal_() : super.internal_();
@@ -36495,39 +34096,31 @@
   @DomName('SpeechGrammar.SpeechGrammar')
   @DocsEditable()
   factory SpeechGrammar() {
-    return wrap_jso(_blink.BlinkSpeechGrammar.instance.constructorCallback_0_());
+    return _blink.BlinkSpeechGrammar.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static SpeechGrammar internalCreateSpeechGrammar() {
-    return new SpeechGrammar._internalWrap();
-  }
-
-  factory SpeechGrammar._internalWrap() {
-    return new SpeechGrammar.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechGrammar.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  String get src => _blink.BlinkSpeechGrammar.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkSpeechGrammar.instance.src_Getter_(this);
   
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkSpeechGrammar.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkSpeechGrammar.instance.src_Setter_(this, value);
   
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  num get weight => _blink.BlinkSpeechGrammar.instance.weight_Getter_(unwrap_jso(this));
+  num get weight => _blink.BlinkSpeechGrammar.instance.weight_Getter_(this);
   
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  set weight(num value) => _blink.BlinkSpeechGrammar.instance.weight_Setter_(unwrap_jso(this), value);
+  set weight(num value) => _blink.BlinkSpeechGrammar.instance.weight_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36548,35 +34141,27 @@
   @DomName('SpeechGrammarList.SpeechGrammarList')
   @DocsEditable()
   factory SpeechGrammarList() {
-    return wrap_jso(_blink.BlinkSpeechGrammarList.instance.constructorCallback_0_());
+    return _blink.BlinkSpeechGrammarList.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static SpeechGrammarList internalCreateSpeechGrammarList() {
-    return new SpeechGrammarList._internalWrap();
-  }
-
-  factory SpeechGrammarList._internalWrap() {
-    return new SpeechGrammarList.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechGrammarList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSpeechGrammarList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSpeechGrammarList.instance.length_Getter_(this);
   
   SpeechGrammar operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkSpeechGrammarList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  SpeechGrammar _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSpeechGrammarList.instance.item_Callback_1_(unwrap_jso(this), index));
+  SpeechGrammar _nativeIndexedGetter(int index) => (_blink.BlinkSpeechGrammarList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, SpeechGrammar value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -36618,25 +34203,25 @@
 
   void addFromString(String string, [num weight]) {
     if (weight != null) {
-      _blink.BlinkSpeechGrammarList.instance.addFromString_Callback_2_(unwrap_jso(this), string, weight);
+      _blink.BlinkSpeechGrammarList.instance.addFromString_Callback_2_(this, string, weight);
       return;
     }
-    _blink.BlinkSpeechGrammarList.instance.addFromString_Callback_1_(unwrap_jso(this), string);
+    _blink.BlinkSpeechGrammarList.instance.addFromString_Callback_1_(this, string);
     return;
   }
 
   void addFromUri(String src, [num weight]) {
     if (weight != null) {
-      _blink.BlinkSpeechGrammarList.instance.addFromUri_Callback_2_(unwrap_jso(this), src, weight);
+      _blink.BlinkSpeechGrammarList.instance.addFromUri_Callback_2_(this, src, weight);
       return;
     }
-    _blink.BlinkSpeechGrammarList.instance.addFromUri_Callback_1_(unwrap_jso(this), src);
+    _blink.BlinkSpeechGrammarList.instance.addFromUri_Callback_1_(this, src);
     return;
   }
 
   @DomName('SpeechGrammarList.item')
   @DocsEditable()
-  SpeechGrammar item(int index) => wrap_jso(_blink.BlinkSpeechGrammarList.instance.item_Callback_1_(unwrap_jso(this), index));
+  SpeechGrammar item(int index) => _blink.BlinkSpeechGrammarList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36768,16 +34353,12 @@
   @DomName('SpeechRecognition.SpeechRecognition')
   @DocsEditable()
   factory SpeechRecognition() {
-    return wrap_jso(_blink.BlinkSpeechRecognition.instance.constructorCallback_0_());
+    return _blink.BlinkSpeechRecognition.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static SpeechRecognition internalCreateSpeechRecognition() {
-    return new SpeechRecognition._internalWrap();
-  }
-
-  external factory SpeechRecognition._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechRecognition.internal_() : super.internal_();
@@ -36789,74 +34370,74 @@
   @DomName('SpeechRecognition.audioTrack')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaStreamTrack get audioTrack => wrap_jso(_blink.BlinkSpeechRecognition.instance.audioTrack_Getter_(unwrap_jso(this)));
+  MediaStreamTrack get audioTrack => _blink.BlinkSpeechRecognition.instance.audioTrack_Getter_(this);
   
   @DomName('SpeechRecognition.audioTrack')
   @DocsEditable()
   @Experimental() // untriaged
-  set audioTrack(MediaStreamTrack value) => _blink.BlinkSpeechRecognition.instance.audioTrack_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set audioTrack(MediaStreamTrack value) => _blink.BlinkSpeechRecognition.instance.audioTrack_Setter_(this, value);
   
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  bool get continuous => _blink.BlinkSpeechRecognition.instance.continuous_Getter_(unwrap_jso(this));
+  bool get continuous => _blink.BlinkSpeechRecognition.instance.continuous_Getter_(this);
   
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  set continuous(bool value) => _blink.BlinkSpeechRecognition.instance.continuous_Setter_(unwrap_jso(this), value);
+  set continuous(bool value) => _blink.BlinkSpeechRecognition.instance.continuous_Setter_(this, value);
   
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  SpeechGrammarList get grammars => wrap_jso(_blink.BlinkSpeechRecognition.instance.grammars_Getter_(unwrap_jso(this)));
+  SpeechGrammarList get grammars => _blink.BlinkSpeechRecognition.instance.grammars_Getter_(this);
   
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.instance.grammars_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.instance.grammars_Setter_(this, value);
   
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  bool get interimResults => _blink.BlinkSpeechRecognition.instance.interimResults_Getter_(unwrap_jso(this));
+  bool get interimResults => _blink.BlinkSpeechRecognition.instance.interimResults_Getter_(this);
   
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  set interimResults(bool value) => _blink.BlinkSpeechRecognition.instance.interimResults_Setter_(unwrap_jso(this), value);
+  set interimResults(bool value) => _blink.BlinkSpeechRecognition.instance.interimResults_Setter_(this, value);
   
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkSpeechRecognition.instance.lang_Getter_(unwrap_jso(this));
+  String get lang => _blink.BlinkSpeechRecognition.instance.lang_Getter_(this);
   
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  set lang(String value) => _blink.BlinkSpeechRecognition.instance.lang_Setter_(unwrap_jso(this), value);
+  set lang(String value) => _blink.BlinkSpeechRecognition.instance.lang_Setter_(this, value);
   
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  int get maxAlternatives => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Getter_(unwrap_jso(this));
+  int get maxAlternatives => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Getter_(this);
   
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Setter_(unwrap_jso(this), value);
+  set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Setter_(this, value);
   
   @DomName('SpeechRecognition.serviceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get serviceUri => _blink.BlinkSpeechRecognition.instance.serviceURI_Getter_(unwrap_jso(this));
+  String get serviceUri => _blink.BlinkSpeechRecognition.instance.serviceURI_Getter_(this);
   
   @DomName('SpeechRecognition.serviceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  set serviceUri(String value) => _blink.BlinkSpeechRecognition.instance.serviceURI_Setter_(unwrap_jso(this), value);
+  set serviceUri(String value) => _blink.BlinkSpeechRecognition.instance.serviceURI_Setter_(this, value);
   
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkSpeechRecognition.instance.abort_Callback_0_(unwrap_jso(this));
+  void abort() => _blink.BlinkSpeechRecognition.instance.abort_Callback_0_(this);
   
   @DomName('SpeechRecognition.start')
   @DocsEditable()
-  void start() => _blink.BlinkSpeechRecognition.instance.start_Callback_0_(unwrap_jso(this));
+  void start() => _blink.BlinkSpeechRecognition.instance.start_Callback_0_(this);
   
   @DomName('SpeechRecognition.stop')
   @DocsEditable()
-  void stop() => _blink.BlinkSpeechRecognition.instance.stop_Callback_0_(unwrap_jso(this));
+  void stop() => _blink.BlinkSpeechRecognition.instance.stop_Callback_0_(this);
   
   /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
@@ -36930,28 +34511,20 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionAlternative._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SpeechRecognitionAlternative internalCreateSpeechRecognitionAlternative() {
-    return new SpeechRecognitionAlternative._internalWrap();
-  }
 
-  factory SpeechRecognitionAlternative._internalWrap() {
-    return new SpeechRecognitionAlternative.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechRecognitionAlternative.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  num get confidence => _blink.BlinkSpeechRecognitionAlternative.instance.confidence_Getter_(unwrap_jso(this));
+  num get confidence => _blink.BlinkSpeechRecognitionAlternative.instance.confidence_Getter_(this);
   
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
-  String get transcript => _blink.BlinkSpeechRecognitionAlternative.instance.transcript_Getter_(unwrap_jso(this));
+  String get transcript => _blink.BlinkSpeechRecognitionAlternative.instance.transcript_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36975,18 +34548,14 @@
   factory SpeechRecognitionError(String type, [Map initDict]) {
     if (initDict != null) {
       var initDict_1 = convertDartToNative_Dictionary(initDict);
-      return wrap_jso(_blink.BlinkSpeechRecognitionError.instance.constructorCallback_2_(type, initDict_1));
+      return _blink.BlinkSpeechRecognitionError.instance.constructorCallback_2_(type, initDict_1);
     }
-    return wrap_jso(_blink.BlinkSpeechRecognitionError.instance.constructorCallback_1_(type));
+    return _blink.BlinkSpeechRecognitionError.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static SpeechRecognitionError internalCreateSpeechRecognitionError() {
-    return new SpeechRecognitionError._internalWrap();
-  }
-
-  external factory SpeechRecognitionError._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechRecognitionError.internal_() : super.internal_();
@@ -36994,11 +34563,11 @@
 
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
-  String get error => _blink.BlinkSpeechRecognitionError.instance.error_Getter_(unwrap_jso(this));
+  String get error => _blink.BlinkSpeechRecognitionError.instance.error_Getter_(this);
   
   @DomName('SpeechRecognitionError.message')
   @DocsEditable()
-  String get message => _blink.BlinkSpeechRecognitionError.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkSpeechRecognitionError.instance.message_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37022,18 +34591,14 @@
   factory SpeechRecognitionEvent(String type, [Map initDict]) {
     if (initDict != null) {
       var initDict_1 = convertDartToNative_Dictionary(initDict);
-      return wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.constructorCallback_2_(type, initDict_1));
+      return _blink.BlinkSpeechRecognitionEvent.instance.constructorCallback_2_(type, initDict_1);
     }
-    return wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkSpeechRecognitionEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static SpeechRecognitionEvent internalCreateSpeechRecognitionEvent() {
-    return new SpeechRecognitionEvent._internalWrap();
-  }
-
-  external factory SpeechRecognitionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechRecognitionEvent.internal_() : super.internal_();
@@ -37041,19 +34606,19 @@
 
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
-  Document get emma => wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.emma_Getter_(unwrap_jso(this)));
+  Document get emma => _blink.BlinkSpeechRecognitionEvent.instance.emma_Getter_(this);
   
   @DomName('SpeechRecognitionEvent.interpretation')
   @DocsEditable()
-  Document get interpretation => wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.interpretation_Getter_(unwrap_jso(this)));
+  Document get interpretation => _blink.BlinkSpeechRecognitionEvent.instance.interpretation_Getter_(this);
   
   @DomName('SpeechRecognitionEvent.resultIndex')
   @DocsEditable()
-  int get resultIndex => _blink.BlinkSpeechRecognitionEvent.instance.resultIndex_Getter_(unwrap_jso(this));
+  int get resultIndex => _blink.BlinkSpeechRecognitionEvent.instance.resultIndex_Getter_(this);
   
   @DomName('SpeechRecognitionEvent.results')
   @DocsEditable()
-  List<SpeechRecognitionResult> get results => wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.results_Getter_(unwrap_jso(this)));
+  List<SpeechRecognitionResult> get results => (_blink.BlinkSpeechRecognitionEvent.instance.results_Getter_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37072,32 +34637,24 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionResult._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SpeechRecognitionResult internalCreateSpeechRecognitionResult() {
-    return new SpeechRecognitionResult._internalWrap();
-  }
 
-  factory SpeechRecognitionResult._internalWrap() {
-    return new SpeechRecognitionResult.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechRecognitionResult.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SpeechRecognitionResult.isFinal')
   @DocsEditable()
-  bool get isFinal => _blink.BlinkSpeechRecognitionResult.instance.isFinal_Getter_(unwrap_jso(this));
+  bool get isFinal => _blink.BlinkSpeechRecognitionResult.instance.isFinal_Getter_(this);
   
   @DomName('SpeechRecognitionResult.length')
   @DocsEditable()
-  int get length => _blink.BlinkSpeechRecognitionResult.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSpeechRecognitionResult.instance.length_Getter_(this);
   
   @DomName('SpeechRecognitionResult.item')
   @DocsEditable()
-  SpeechRecognitionAlternative item(int index) => wrap_jso(_blink.BlinkSpeechRecognitionResult.instance.item_Callback_1_(unwrap_jso(this), index));
+  SpeechRecognitionAlternative item(int index) => _blink.BlinkSpeechRecognitionResult.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37117,11 +34674,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SpeechSynthesis internalCreateSpeechSynthesis() {
-    return new SpeechSynthesis._internalWrap();
-  }
-
-  external factory SpeechSynthesis._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechSynthesis.internal_() : super.internal_();
@@ -37129,35 +34682,35 @@
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable()
-  bool get paused => _blink.BlinkSpeechSynthesis.instance.paused_Getter_(unwrap_jso(this));
+  bool get paused => _blink.BlinkSpeechSynthesis.instance.paused_Getter_(this);
   
   @DomName('SpeechSynthesis.pending')
   @DocsEditable()
-  bool get pending => _blink.BlinkSpeechSynthesis.instance.pending_Getter_(unwrap_jso(this));
+  bool get pending => _blink.BlinkSpeechSynthesis.instance.pending_Getter_(this);
   
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable()
-  bool get speaking => _blink.BlinkSpeechSynthesis.instance.speaking_Getter_(unwrap_jso(this));
+  bool get speaking => _blink.BlinkSpeechSynthesis.instance.speaking_Getter_(this);
   
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable()
-  void cancel() => _blink.BlinkSpeechSynthesis.instance.cancel_Callback_0_(unwrap_jso(this));
+  void cancel() => _blink.BlinkSpeechSynthesis.instance.cancel_Callback_0_(this);
   
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() => wrap_jso(_blink.BlinkSpeechSynthesis.instance.getVoices_Callback_0_(unwrap_jso(this)));
+  List<SpeechSynthesisVoice> getVoices() => (_blink.BlinkSpeechSynthesis.instance.getVoices_Callback_0_(this));
   
   @DomName('SpeechSynthesis.pause')
   @DocsEditable()
-  void pause() => _blink.BlinkSpeechSynthesis.instance.pause_Callback_0_(unwrap_jso(this));
+  void pause() => _blink.BlinkSpeechSynthesis.instance.pause_Callback_0_(this);
   
   @DomName('SpeechSynthesis.resume')
   @DocsEditable()
-  void resume() => _blink.BlinkSpeechSynthesis.instance.resume_Callback_0_(unwrap_jso(this));
+  void resume() => _blink.BlinkSpeechSynthesis.instance.resume_Callback_0_(this);
   
   @DomName('SpeechSynthesis.speak')
   @DocsEditable()
-  void speak(SpeechSynthesisUtterance utterance) => _blink.BlinkSpeechSynthesis.instance.speak_Callback_1_(unwrap_jso(this), unwrap_jso(utterance));
+  void speak(SpeechSynthesisUtterance utterance) => _blink.BlinkSpeechSynthesis.instance.speak_Callback_1_(this, utterance);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37177,11 +34730,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SpeechSynthesisEvent internalCreateSpeechSynthesisEvent() {
-    return new SpeechSynthesisEvent._internalWrap();
-  }
-
-  external factory SpeechSynthesisEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechSynthesisEvent.internal_() : super.internal_();
@@ -37189,20 +34738,20 @@
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable()
-  int get charIndex => _blink.BlinkSpeechSynthesisEvent.instance.charIndex_Getter_(unwrap_jso(this));
+  int get charIndex => _blink.BlinkSpeechSynthesisEvent.instance.charIndex_Getter_(this);
   
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  num get elapsedTime => _blink.BlinkSpeechSynthesisEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
+  num get elapsedTime => _blink.BlinkSpeechSynthesisEvent.instance.elapsedTime_Getter_(this);
   
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
-  String get name => _blink.BlinkSpeechSynthesisEvent.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkSpeechSynthesisEvent.instance.name_Getter_(this);
   
   @DomName('SpeechSynthesisEvent.utterance')
   @DocsEditable()
   @Experimental() // untriaged
-  SpeechSynthesisUtterance get utterance => wrap_jso(_blink.BlinkSpeechSynthesisEvent.instance.utterance_Getter_(unwrap_jso(this)));
+  SpeechSynthesisUtterance get utterance => _blink.BlinkSpeechSynthesisEvent.instance.utterance_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37293,16 +34842,12 @@
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable()
   factory SpeechSynthesisUtterance([String text]) {
-    return wrap_jso(_blink.BlinkSpeechSynthesisUtterance.instance.constructorCallback_1_(text));
+    return _blink.BlinkSpeechSynthesisUtterance.instance.constructorCallback_1_(text);
   }
 
 
   @Deprecated("Internal Use Only")
-  static SpeechSynthesisUtterance internalCreateSpeechSynthesisUtterance() {
-    return new SpeechSynthesisUtterance._internalWrap();
-  }
-
-  external factory SpeechSynthesisUtterance._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechSynthesisUtterance.internal_() : super.internal_();
@@ -37310,51 +34855,51 @@
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Getter_(unwrap_jso(this));
+  String get lang => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Getter_(this);
   
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Setter_(unwrap_jso(this), value);
+  set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Setter_(this, value);
   
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  num get pitch => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Getter_(unwrap_jso(this));
+  num get pitch => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Getter_(this);
   
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Setter_(unwrap_jso(this), value);
+  set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Setter_(this, value);
   
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  num get rate => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Getter_(unwrap_jso(this));
+  num get rate => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Getter_(this);
   
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Setter_(unwrap_jso(this), value);
+  set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Setter_(this, value);
   
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  String get text => _blink.BlinkSpeechSynthesisUtterance.instance.text_Getter_(unwrap_jso(this));
+  String get text => _blink.BlinkSpeechSynthesisUtterance.instance.text_Getter_(this);
   
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  set text(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.text_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.text_Setter_(this, value);
   
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  SpeechSynthesisVoice get voice => wrap_jso(_blink.BlinkSpeechSynthesisUtterance.instance.voice_Getter_(unwrap_jso(this)));
+  SpeechSynthesisVoice get voice => _blink.BlinkSpeechSynthesisUtterance.instance.voice_Getter_(this);
   
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.instance.voice_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.instance.voice_Setter_(this, value);
   
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  num get volume => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Getter_(unwrap_jso(this));
+  num get volume => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Getter_(this);
   
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Setter_(unwrap_jso(this), value);
+  set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Setter_(this, value);
   
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
@@ -37407,40 +34952,32 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisVoice._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SpeechSynthesisVoice internalCreateSpeechSynthesisVoice() {
-    return new SpeechSynthesisVoice._internalWrap();
-  }
 
-  factory SpeechSynthesisVoice._internalWrap() {
-    return new SpeechSynthesisVoice.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SpeechSynthesisVoice.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable()
-  bool get defaultValue => _blink.BlinkSpeechSynthesisVoice.instance.default_Getter_(unwrap_jso(this));
+  bool get defaultValue => _blink.BlinkSpeechSynthesisVoice.instance.default_Getter_(this);
   
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkSpeechSynthesisVoice.instance.lang_Getter_(unwrap_jso(this));
+  String get lang => _blink.BlinkSpeechSynthesisVoice.instance.lang_Getter_(this);
   
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable()
-  bool get localService => _blink.BlinkSpeechSynthesisVoice.instance.localService_Getter_(unwrap_jso(this));
+  bool get localService => _blink.BlinkSpeechSynthesisVoice.instance.localService_Getter_(this);
   
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable()
-  String get name => _blink.BlinkSpeechSynthesisVoice.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkSpeechSynthesisVoice.instance.name_Getter_(this);
   
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable()
-  String get voiceUri => _blink.BlinkSpeechSynthesisVoice.instance.voiceURI_Getter_(unwrap_jso(this));
+  String get voiceUri => _blink.BlinkSpeechSynthesisVoice.instance.voiceURI_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37459,11 +34996,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static StashedMessagePort internalCreateStashedMessagePort() {
-    return new StashedMessagePort._internalWrap();
-  }
-
-  external factory StashedMessagePort._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StashedMessagePort.internal_() : super.internal_();
@@ -37472,7 +35005,7 @@
   @DomName('StashedMessagePort.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkStashedMessagePort.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkStashedMessagePort.instance.name_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37496,11 +35029,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static StashedPortCollection internalCreateStashedPortCollection() {
-    return new StashedPortCollection._internalWrap();
-  }
-
-  external factory StashedPortCollection._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StashedPortCollection.internal_() : super.internal_();
@@ -37509,7 +35038,7 @@
   @DomName('StashedPortCollection.add')
   @DocsEditable()
   @Experimental() // untriaged
-  StashedMessagePort add(String name, MessagePort port) => wrap_jso(_blink.BlinkStashedPortCollection.instance.add_Callback_2_(unwrap_jso(this), name, unwrap_jso(port)));
+  StashedMessagePort add(String name, MessagePort port) => _blink.BlinkStashedPortCollection.instance.add_Callback_2_(this, name, port);
   
   @DomName('StashedPortCollection.onmessage')
   @DocsEditable()
@@ -37607,52 +35136,44 @@
   // To suppress missing implicit constructor warnings.
   factory Storage._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Storage internalCreateStorage() {
-    return new Storage._internalWrap();
-  }
 
-  factory Storage._internalWrap() {
-    return new Storage.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Storage.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Storage.length')
   @DocsEditable()
-  int get _length => _blink.BlinkStorage.instance.length_Getter_(unwrap_jso(this));
+  int get _length => _blink.BlinkStorage.instance.length_Getter_(this);
   
   bool __delete__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkStorage.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return _blink.BlinkStorage.instance.$__delete___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkStorage.instance.$__delete___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return _blink.BlinkStorage.instance.$__delete___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   String __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkStorage.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return _blink.BlinkStorage.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkStorage.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return _blink.BlinkStorage.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   void __setter__(index_OR_name, String value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      _blink.BlinkStorage.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), value);
+      _blink.BlinkStorage.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      _blink.BlinkStorage.instance.$__setter___Callback_2_(unwrap_jso(this), unwrap_jso(index_OR_name), value);
+      _blink.BlinkStorage.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -37660,23 +35181,23 @@
 
   @DomName('Storage.clear')
   @DocsEditable()
-  void _clear() => _blink.BlinkStorage.instance.clear_Callback_0_(unwrap_jso(this));
+  void _clear() => _blink.BlinkStorage.instance.clear_Callback_0_(this);
   
   @DomName('Storage.getItem')
   @DocsEditable()
-  String _getItem(String key) => _blink.BlinkStorage.instance.getItem_Callback_1_(unwrap_jso(this), key);
+  String _getItem(String key) => _blink.BlinkStorage.instance.getItem_Callback_1_(this, key);
   
   @DomName('Storage.key')
   @DocsEditable()
-  String _key(int index) => _blink.BlinkStorage.instance.key_Callback_1_(unwrap_jso(this), index);
+  String _key(int index) => _blink.BlinkStorage.instance.key_Callback_1_(this, index);
   
   @DomName('Storage.removeItem')
   @DocsEditable()
-  void _removeItem(String key) => _blink.BlinkStorage.instance.removeItem_Callback_1_(unwrap_jso(this), key);
+  void _removeItem(String key) => _blink.BlinkStorage.instance.removeItem_Callback_1_(this, key);
   
   @DomName('Storage.setItem')
   @DocsEditable()
-  void _setItem(String key, String data) => _blink.BlinkStorage.instance.setItem_Callback_2_(unwrap_jso(this), key, data);
+  void _setItem(String key, String data) => _blink.BlinkStorage.instance.setItem_Callback_2_(this, key, data);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37715,18 +35236,14 @@
   factory StorageEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkStorageEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkStorageEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkStorageEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkStorageEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static StorageEvent internalCreateStorageEvent() {
-    return new StorageEvent._internalWrap();
-  }
-
-  external factory StorageEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StorageEvent.internal_() : super.internal_();
@@ -37734,27 +35251,27 @@
 
   @DomName('StorageEvent.key')
   @DocsEditable()
-  String get key => _blink.BlinkStorageEvent.instance.key_Getter_(unwrap_jso(this));
+  String get key => _blink.BlinkStorageEvent.instance.key_Getter_(this);
   
   @DomName('StorageEvent.newValue')
   @DocsEditable()
-  String get newValue => _blink.BlinkStorageEvent.instance.newValue_Getter_(unwrap_jso(this));
+  String get newValue => _blink.BlinkStorageEvent.instance.newValue_Getter_(this);
   
   @DomName('StorageEvent.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.BlinkStorageEvent.instance.oldValue_Getter_(unwrap_jso(this));
+  String get oldValue => _blink.BlinkStorageEvent.instance.oldValue_Getter_(this);
   
   @DomName('StorageEvent.storageArea')
   @DocsEditable()
-  Storage get storageArea => wrap_jso(_blink.BlinkStorageEvent.instance.storageArea_Getter_(unwrap_jso(this)));
+  Storage get storageArea => _blink.BlinkStorageEvent.instance.storageArea_Getter_(this);
   
   @DomName('StorageEvent.url')
   @DocsEditable()
-  String get url => _blink.BlinkStorageEvent.instance.url_Getter_(unwrap_jso(this));
+  String get url => _blink.BlinkStorageEvent.instance.url_Getter_(this);
   
   @DomName('StorageEvent.initStorageEvent')
   @DocsEditable()
-  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.BlinkStorageEvent.instance.initStorageEvent_Callback_8_(unwrap_jso(this), typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, unwrap_jso(storageAreaArg));
+  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.BlinkStorageEvent.instance.initStorageEvent_Callback_8_(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37772,30 +35289,22 @@
   // To suppress missing implicit constructor warnings.
   factory StorageInfo._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static StorageInfo internalCreateStorageInfo() {
-    return new StorageInfo._internalWrap();
-  }
 
-  factory StorageInfo._internalWrap() {
-    return new StorageInfo.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StorageInfo.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('StorageInfo.quota')
   @DocsEditable()
   @Experimental() // untriaged
-  int get quota => _blink.BlinkStorageInfo.instance.quota_Getter_(unwrap_jso(this));
+  int get quota => _blink.BlinkStorageInfo.instance.quota_Getter_(this);
   
   @DomName('StorageInfo.usage')
   @DocsEditable()
   @Experimental() // untriaged
-  int get usage => _blink.BlinkStorageInfo.instance.usage_Getter_(unwrap_jso(this));
+  int get usage => _blink.BlinkStorageInfo.instance.usage_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37813,35 +35322,27 @@
   // To suppress missing implicit constructor warnings.
   factory StorageQuota._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static StorageQuota internalCreateStorageQuota() {
-    return new StorageQuota._internalWrap();
-  }
 
-  factory StorageQuota._internalWrap() {
-    return new StorageQuota.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StorageQuota.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('StorageQuota.supportedTypes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get supportedTypes => wrap_jso(_blink.BlinkStorageQuota.instance.supportedTypes_Getter_(unwrap_jso(this)));
+  List<String> get supportedTypes => _blink.BlinkStorageQuota.instance.supportedTypes_Getter_(this);
   
   @DomName('StorageQuota.queryInfo')
   @DocsEditable()
   @Experimental() // untriaged
-  Future queryInfo(String type) => wrap_jso(_blink.BlinkStorageQuota.instance.queryInfo_Callback_1_(unwrap_jso(this), type));
+  Future queryInfo(String type) => convertNativePromiseToDartFuture(_blink.BlinkStorageQuota.instance.queryInfo_Callback_1_(this, type));
   
   @DomName('StorageQuota.requestPersistentQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestPersistentQuota(int newQuota) => wrap_jso(_blink.BlinkStorageQuota.instance.requestPersistentQuota_Callback_1_(unwrap_jso(this), newQuota));
+  Future requestPersistentQuota(int newQuota) => convertNativePromiseToDartFuture(_blink.BlinkStorageQuota.instance.requestPersistentQuota_Callback_1_(this, newQuota));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37896,11 +35397,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static StyleElement internalCreateStyleElement() {
-    return new StyleElement._internalWrap();
-  }
-
-  external factory StyleElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StyleElement.internal_() : super.internal_();
@@ -37914,31 +35411,31 @@
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLStyleElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLStyleElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLStyleElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLStyleElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkHTMLStyleElement.instance.media_Getter_(unwrap_jso(this));
+  String get media => _blink.BlinkHTMLStyleElement.instance.media_Getter_(this);
   
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  set media(String value) => _blink.BlinkHTMLStyleElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkHTMLStyleElement.instance.media_Setter_(this, value);
   
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => wrap_jso(_blink.BlinkHTMLStyleElement.instance.sheet_Getter_(unwrap_jso(this)));
+  StyleSheet get sheet => _blink.BlinkHTMLStyleElement.instance.sheet_Getter_(this);
   
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLStyleElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLStyleElement.instance.type_Getter_(this);
   
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkHTMLStyleElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLStyleElement.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37956,28 +35453,20 @@
   // To suppress missing implicit constructor warnings.
   factory StyleMedia._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static StyleMedia internalCreateStyleMedia() {
-    return new StyleMedia._internalWrap();
-  }
 
-  factory StyleMedia._internalWrap() {
-    return new StyleMedia.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StyleMedia.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('StyleMedia.type')
   @DocsEditable()
-  String get type => _blink.BlinkStyleMedia.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkStyleMedia.instance.type_Getter_(this);
   
   @DomName('StyleMedia.matchMedium')
   @DocsEditable()
-  bool matchMedium(String mediaquery) => _blink.BlinkStyleMedia.instance.matchMedium_Callback_1_(unwrap_jso(this), mediaquery);
+  bool matchMedium(String mediaquery) => _blink.BlinkStyleMedia.instance.matchMedium_Callback_1_(this, mediaquery);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37993,52 +35482,44 @@
   // To suppress missing implicit constructor warnings.
   factory StyleSheet._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static StyleSheet internalCreateStyleSheet() {
-    return new StyleSheet._internalWrap();
-  }
 
-  factory StyleSheet._internalWrap() {
-    return new StyleSheet.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StyleSheet.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkStyleSheet.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkStyleSheet.instance.disabled_Getter_(this);
   
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkStyleSheet.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkStyleSheet.instance.disabled_Setter_(this, value);
   
   @DomName('StyleSheet.href')
   @DocsEditable()
-  String get href => _blink.BlinkStyleSheet.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkStyleSheet.instance.href_Getter_(this);
   
   @DomName('StyleSheet.media')
   @DocsEditable()
-  MediaList get media => wrap_jso(_blink.BlinkStyleSheet.instance.media_Getter_(unwrap_jso(this)));
+  MediaList get media => _blink.BlinkStyleSheet.instance.media_Getter_(this);
   
   @DomName('StyleSheet.ownerNode')
   @DocsEditable()
-  Node get ownerNode => wrap_jso(_blink.BlinkStyleSheet.instance.ownerNode_Getter_(unwrap_jso(this)));
+  Node get ownerNode => _blink.BlinkStyleSheet.instance.ownerNode_Getter_(this);
   
   @DomName('StyleSheet.parentStyleSheet')
   @DocsEditable()
-  StyleSheet get parentStyleSheet => wrap_jso(_blink.BlinkStyleSheet.instance.parentStyleSheet_Getter_(unwrap_jso(this)));
+  StyleSheet get parentStyleSheet => _blink.BlinkStyleSheet.instance.parentStyleSheet_Getter_(this);
   
   @DomName('StyleSheet.title')
   @DocsEditable()
-  String get title => _blink.BlinkStyleSheet.instance.title_Getter_(unwrap_jso(this));
+  String get title => _blink.BlinkStyleSheet.instance.title_Getter_(this);
   
   @DomName('StyleSheet.type')
   @DocsEditable()
-  String get type => _blink.BlinkStyleSheet.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkStyleSheet.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38059,16 +35540,12 @@
   @DocsEditable()
   factory SyncEvent(String type, Map init) {
     var init_1 = convertDartToNative_Dictionary(init);
-    return wrap_jso(_blink.BlinkSyncEvent.instance.constructorCallback_2_(type, init_1));
+    return _blink.BlinkSyncEvent.instance.constructorCallback_2_(type, init_1);
   }
 
 
   @Deprecated("Internal Use Only")
-  static SyncEvent internalCreateSyncEvent() {
-    return new SyncEvent._internalWrap();
-  }
-
-  external factory SyncEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SyncEvent.internal_() : super.internal_();
@@ -38077,7 +35554,7 @@
   @DomName('SyncEvent.registration')
   @DocsEditable()
   @Experimental() // untriaged
-  SyncRegistration get registration => wrap_jso(_blink.BlinkSyncEvent.instance.registration_Getter_(unwrap_jso(this)));
+  SyncRegistration get registration => _blink.BlinkSyncEvent.instance.registration_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38094,41 +35571,33 @@
   // To suppress missing implicit constructor warnings.
   factory SyncManager._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SyncManager internalCreateSyncManager() {
-    return new SyncManager._internalWrap();
-  }
 
-  factory SyncManager._internalWrap() {
-    return new SyncManager.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SyncManager.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SyncManager.getRegistration')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistration(String tag) => wrap_jso(_blink.BlinkSyncManager.instance.getRegistration_Callback_1_(unwrap_jso(this), tag));
+  Future getRegistration(String tag) => convertNativePromiseToDartFuture(_blink.BlinkSyncManager.instance.getRegistration_Callback_1_(this, tag));
   
   @DomName('SyncManager.getRegistrations')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegistrations() => wrap_jso(_blink.BlinkSyncManager.instance.getRegistrations_Callback_0_(unwrap_jso(this)));
+  Future getRegistrations() => convertNativePromiseToDartFuture(_blink.BlinkSyncManager.instance.getRegistrations_Callback_0_(this));
   
   @DomName('SyncManager.permissionState')
   @DocsEditable()
   @Experimental() // untriaged
-  Future permissionState() => wrap_jso(_blink.BlinkSyncManager.instance.permissionState_Callback_0_(unwrap_jso(this)));
+  Future permissionState() => convertNativePromiseToDartFuture(_blink.BlinkSyncManager.instance.permissionState_Callback_0_(this));
   
   Future register([Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkSyncManager.instance.register_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
+      return _blink.BlinkSyncManager.instance.register_Callback_1_(this, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkSyncManager.instance.register_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkSyncManager.instance.register_Callback_0_(this);
   }
 
 }
@@ -38146,30 +35615,22 @@
   // To suppress missing implicit constructor warnings.
   factory SyncRegistration._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SyncRegistration internalCreateSyncRegistration() {
-    return new SyncRegistration._internalWrap();
-  }
 
-  factory SyncRegistration._internalWrap() {
-    return new SyncRegistration.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SyncRegistration.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SyncRegistration.tag')
   @DocsEditable()
   @Experimental() // untriaged
-  String get tag => _blink.BlinkSyncRegistration.instance.tag_Getter_(unwrap_jso(this));
+  String get tag => _blink.BlinkSyncRegistration.instance.tag_Getter_(this);
   
   @DomName('SyncRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() => wrap_jso(_blink.BlinkSyncRegistration.instance.unregister_Callback_0_(unwrap_jso(this)));
+  Future unregister() => convertNativePromiseToDartFuture(_blink.BlinkSyncRegistration.instance.unregister_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38191,11 +35652,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TableCaptionElement internalCreateTableCaptionElement() {
-    return new TableCaptionElement._internalWrap();
-  }
-
-  external factory TableCaptionElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TableCaptionElement.internal_() : super.internal_();
@@ -38227,11 +35684,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TableCellElement internalCreateTableCellElement() {
-    return new TableCellElement._internalWrap();
-  }
-
-  external factory TableCellElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TableCellElement.internal_() : super.internal_();
@@ -38245,31 +35698,31 @@
 
   @DomName('HTMLTableCellElement.cellIndex')
   @DocsEditable()
-  int get cellIndex => _blink.BlinkHTMLTableCellElement.instance.cellIndex_Getter_(unwrap_jso(this));
+  int get cellIndex => _blink.BlinkHTMLTableCellElement.instance.cellIndex_Getter_(this);
   
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  int get colSpan => _blink.BlinkHTMLTableCellElement.instance.colSpan_Getter_(unwrap_jso(this));
+  int get colSpan => _blink.BlinkHTMLTableCellElement.instance.colSpan_Getter_(this);
   
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  set colSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.colSpan_Setter_(unwrap_jso(this), value);
+  set colSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.colSpan_Setter_(this, value);
   
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  String get headers => _blink.BlinkHTMLTableCellElement.instance.headers_Getter_(unwrap_jso(this));
+  String get headers => _blink.BlinkHTMLTableCellElement.instance.headers_Getter_(this);
   
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  set headers(String value) => _blink.BlinkHTMLTableCellElement.instance.headers_Setter_(unwrap_jso(this), value);
+  set headers(String value) => _blink.BlinkHTMLTableCellElement.instance.headers_Setter_(this, value);
   
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  int get rowSpan => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Getter_(unwrap_jso(this));
+  int get rowSpan => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Getter_(this);
   
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Setter_(unwrap_jso(this), value);
+  set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38291,11 +35744,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TableColElement internalCreateTableColElement() {
-    return new TableColElement._internalWrap();
-  }
-
-  external factory TableColElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TableColElement.internal_() : super.internal_();
@@ -38309,11 +35758,11 @@
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  int get span => _blink.BlinkHTMLTableColElement.instance.span_Getter_(unwrap_jso(this));
+  int get span => _blink.BlinkHTMLTableColElement.instance.span_Getter_(this);
   
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  set span(int value) => _blink.BlinkHTMLTableColElement.instance.span_Setter_(unwrap_jso(this), value);
+  set span(int value) => _blink.BlinkHTMLTableColElement.instance.span_Setter_(this, value);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -38353,11 +35802,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TableElement internalCreateTableElement() {
-    return new TableElement._internalWrap();
-  }
-
-  external factory TableElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TableElement.internal_() : super.internal_();
@@ -38371,73 +35816,73 @@
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  TableCaptionElement get caption => wrap_jso(_blink.BlinkHTMLTableElement.instance.caption_Getter_(unwrap_jso(this)));
+  TableCaptionElement get caption => _blink.BlinkHTMLTableElement.instance.caption_Getter_(this);
   
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.instance.caption_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.instance.caption_Setter_(this, value);
   
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  List<Node> get _rows => wrap_jso(_blink.BlinkHTMLTableElement.instance.rows_Getter_(unwrap_jso(this)));
+  List<Node> get _rows => (_blink.BlinkHTMLTableElement.instance.rows_Getter_(this));
   
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  List<Node> get _tBodies => wrap_jso(_blink.BlinkHTMLTableElement.instance.tBodies_Getter_(unwrap_jso(this)));
+  List<Node> get _tBodies => (_blink.BlinkHTMLTableElement.instance.tBodies_Getter_(this));
   
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  TableSectionElement get tFoot => wrap_jso(_blink.BlinkHTMLTableElement.instance.tFoot_Getter_(unwrap_jso(this)));
+  TableSectionElement get tFoot => _blink.BlinkHTMLTableElement.instance.tFoot_Getter_(this);
   
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tFoot_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tFoot_Setter_(this, value);
   
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  TableSectionElement get tHead => wrap_jso(_blink.BlinkHTMLTableElement.instance.tHead_Getter_(unwrap_jso(this)));
+  TableSectionElement get tHead => _blink.BlinkHTMLTableElement.instance.tHead_Getter_(this);
   
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tHead_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tHead_Setter_(this, value);
   
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  HtmlElement _createCaption() => wrap_jso(_blink.BlinkHTMLTableElement.instance.createCaption_Callback_0_(unwrap_jso(this)));
+  HtmlElement _createCaption() => _blink.BlinkHTMLTableElement.instance.createCaption_Callback_0_(this);
   
   @DomName('HTMLTableElement.createTBody')
   @DocsEditable()
-  HtmlElement _createTBody() => wrap_jso(_blink.BlinkHTMLTableElement.instance.createTBody_Callback_0_(unwrap_jso(this)));
+  HtmlElement _createTBody() => _blink.BlinkHTMLTableElement.instance.createTBody_Callback_0_(this);
   
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  HtmlElement _createTFoot() => wrap_jso(_blink.BlinkHTMLTableElement.instance.createTFoot_Callback_0_(unwrap_jso(this)));
+  HtmlElement _createTFoot() => _blink.BlinkHTMLTableElement.instance.createTFoot_Callback_0_(this);
   
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  HtmlElement _createTHead() => wrap_jso(_blink.BlinkHTMLTableElement.instance.createTHead_Callback_0_(unwrap_jso(this)));
+  HtmlElement _createTHead() => _blink.BlinkHTMLTableElement.instance.createTHead_Callback_0_(this);
   
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
-  void deleteCaption() => _blink.BlinkHTMLTableElement.instance.deleteCaption_Callback_0_(unwrap_jso(this));
+  void deleteCaption() => _blink.BlinkHTMLTableElement.instance.deleteCaption_Callback_0_(this);
   
   @DomName('HTMLTableElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.BlinkHTMLTableElement.instance.deleteRow_Callback_1_(unwrap_jso(this), index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableElement.instance.deleteRow_Callback_1_(this, index);
   
   @DomName('HTMLTableElement.deleteTFoot')
   @DocsEditable()
-  void deleteTFoot() => _blink.BlinkHTMLTableElement.instance.deleteTFoot_Callback_0_(unwrap_jso(this));
+  void deleteTFoot() => _blink.BlinkHTMLTableElement.instance.deleteTFoot_Callback_0_(this);
   
   @DomName('HTMLTableElement.deleteTHead')
   @DocsEditable()
-  void deleteTHead() => _blink.BlinkHTMLTableElement.instance.deleteTHead_Callback_0_(unwrap_jso(this));
+  void deleteTHead() => _blink.BlinkHTMLTableElement.instance.deleteTHead_Callback_0_(this);
   
   HtmlElement _insertRow([int index]) {
     if (index != null) {
-      return wrap_jso(_blink.BlinkHTMLTableElement.instance.insertRow_Callback_1_(unwrap_jso(this), index));
+      return _blink.BlinkHTMLTableElement.instance.insertRow_Callback_1_(this, index);
     }
-    return wrap_jso(_blink.BlinkHTMLTableElement.instance.insertRow_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkHTMLTableElement.instance.insertRow_Callback_0_(this);
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -38469,11 +35914,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TableRowElement internalCreateTableRowElement() {
-    return new TableRowElement._internalWrap();
-  }
-
-  external factory TableRowElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TableRowElement.internal_() : super.internal_();
@@ -38487,25 +35928,25 @@
 
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  List<Node> get _cells => wrap_jso(_blink.BlinkHTMLTableRowElement.instance.cells_Getter_(unwrap_jso(this)));
+  List<Node> get _cells => (_blink.BlinkHTMLTableRowElement.instance.cells_Getter_(this));
   
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
-  int get rowIndex => _blink.BlinkHTMLTableRowElement.instance.rowIndex_Getter_(unwrap_jso(this));
+  int get rowIndex => _blink.BlinkHTMLTableRowElement.instance.rowIndex_Getter_(this);
   
   @DomName('HTMLTableRowElement.sectionRowIndex')
   @DocsEditable()
-  int get sectionRowIndex => _blink.BlinkHTMLTableRowElement.instance.sectionRowIndex_Getter_(unwrap_jso(this));
+  int get sectionRowIndex => _blink.BlinkHTMLTableRowElement.instance.sectionRowIndex_Getter_(this);
   
   @DomName('HTMLTableRowElement.deleteCell')
   @DocsEditable()
-  void deleteCell(int index) => _blink.BlinkHTMLTableRowElement.instance.deleteCell_Callback_1_(unwrap_jso(this), index);
+  void deleteCell(int index) => _blink.BlinkHTMLTableRowElement.instance.deleteCell_Callback_1_(this, index);
   
   HtmlElement _insertCell([int index]) {
     if (index != null) {
-      return wrap_jso(_blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_1_(unwrap_jso(this), index));
+      return _blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_1_(this, index);
     }
-    return wrap_jso(_blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_0_(this);
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -38533,11 +35974,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TableSectionElement internalCreateTableSectionElement() {
-    return new TableSectionElement._internalWrap();
-  }
-
-  external factory TableSectionElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TableSectionElement.internal_() : super.internal_();
@@ -38551,17 +35988,17 @@
 
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  List<Node> get _rows => wrap_jso(_blink.BlinkHTMLTableSectionElement.instance.rows_Getter_(unwrap_jso(this)));
+  List<Node> get _rows => (_blink.BlinkHTMLTableSectionElement.instance.rows_Getter_(this));
   
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.BlinkHTMLTableSectionElement.instance.deleteRow_Callback_1_(unwrap_jso(this), index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableSectionElement.instance.deleteRow_Callback_1_(this, index);
   
   HtmlElement _insertRow([int index]) {
     if (index != null) {
-      return wrap_jso(_blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_1_(unwrap_jso(this), index));
+      return _blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_1_(this, index);
     }
-    return wrap_jso(_blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_0_(this);
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -38586,11 +36023,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TemplateElement internalCreateTemplateElement() {
-    return new TemplateElement._internalWrap();
-  }
-
-  external factory TemplateElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TemplateElement.internal_() : super.internal_();
@@ -38607,7 +36040,7 @@
 
   @DomName('HTMLTemplateElement.content')
   @DocsEditable()
-  DocumentFragment get content => wrap_jso(_blink.BlinkHTMLTemplateElement.instance.content_Getter_(unwrap_jso(this)));
+  DocumentFragment get content => _blink.BlinkHTMLTemplateElement.instance.content_Getter_(this);
   
 
   /**
@@ -38641,11 +36074,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Text internalCreateText() {
-    return new Text._internalWrap();
-  }
-
-  external factory Text._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Text.internal_() : super.internal_();
@@ -38653,16 +36082,16 @@
 
   @DomName('Text.wholeText')
   @DocsEditable()
-  String get wholeText => _blink.BlinkText.instance.wholeText_Getter_(unwrap_jso(this));
+  String get wholeText => _blink.BlinkText.instance.wholeText_Getter_(this);
   
   @DomName('Text.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => wrap_jso(_blink.BlinkText.instance.getDestinationInsertionPoints_Callback_0_(unwrap_jso(this)));
+  List<Node> getDestinationInsertionPoints() => (_blink.BlinkText.instance.getDestinationInsertionPoints_Callback_0_(this));
   
   @DomName('Text.splitText')
   @DocsEditable()
-  Text splitText(int offset) => wrap_jso(_blink.BlinkText.instance.splitText_Callback_1_(unwrap_jso(this), offset));
+  Text splitText(int offset) => _blink.BlinkText.instance.splitText_Callback_1_(this, offset);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38684,11 +36113,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextAreaElement internalCreateTextAreaElement() {
-    return new TextAreaElement._internalWrap();
-  }
-
-  external factory TextAreaElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextAreaElement.internal_() : super.internal_();
@@ -38703,218 +36128,218 @@
   @DomName('HTMLTextAreaElement.autocapitalize')
   @DocsEditable()
   @Experimental() // untriaged
-  String get autocapitalize => _blink.BlinkHTMLTextAreaElement.instance.autocapitalize_Getter_(unwrap_jso(this));
+  String get autocapitalize => _blink.BlinkHTMLTextAreaElement.instance.autocapitalize_Getter_(this);
   
   @DomName('HTMLTextAreaElement.autocapitalize')
   @DocsEditable()
   @Experimental() // untriaged
-  set autocapitalize(String value) => _blink.BlinkHTMLTextAreaElement.instance.autocapitalize_Setter_(unwrap_jso(this), value);
+  set autocapitalize(String value) => _blink.BlinkHTMLTextAreaElement.instance.autocapitalize_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Getter_(unwrap_jso(this));
+  bool get autofocus => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Getter_(this);
   
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  int get cols => _blink.BlinkHTMLTextAreaElement.instance.cols_Getter_(unwrap_jso(this));
+  int get cols => _blink.BlinkHTMLTextAreaElement.instance.cols_Getter_(this);
   
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  set cols(int value) => _blink.BlinkHTMLTextAreaElement.instance.cols_Setter_(unwrap_jso(this), value);
+  set cols(int value) => _blink.BlinkHTMLTextAreaElement.instance.cols_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Getter_(unwrap_jso(this));
+  String get defaultValue => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Getter_(this);
   
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
+  set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  String get dirName => _blink.BlinkHTMLTextAreaElement.instance.dirName_Getter_(unwrap_jso(this));
+  String get dirName => _blink.BlinkHTMLTextAreaElement.instance.dirName_Getter_(this);
   
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  set dirName(String value) => _blink.BlinkHTMLTextAreaElement.instance.dirName_Setter_(unwrap_jso(this), value);
+  set dirName(String value) => _blink.BlinkHTMLTextAreaElement.instance.dirName_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLTextAreaElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkHTMLTextAreaElement.instance.disabled_Getter_(this);
   
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.instance.disabled_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.form')
   @DocsEditable()
-  FormElement get form => wrap_jso(_blink.BlinkHTMLTextAreaElement.instance.form_Getter_(unwrap_jso(this)));
+  FormElement get form => _blink.BlinkHTMLTextAreaElement.instance.form_Getter_(this);
   
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Getter_(unwrap_jso(this));
+  String get inputMode => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Getter_(this);
   
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Setter_(unwrap_jso(this), value);
+  set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso(_blink.BlinkHTMLTextAreaElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => (_blink.BlinkHTMLTextAreaElement.instance.labels_Getter_(this));
   
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Getter_(unwrap_jso(this));
+  int get maxLength => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Getter_(this);
   
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Setter_(unwrap_jso(this), value);
+  set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.minLength')
   @DocsEditable()
   @Experimental() // untriaged
-  int get minLength => _blink.BlinkHTMLTextAreaElement.instance.minLength_Getter_(unwrap_jso(this));
+  int get minLength => _blink.BlinkHTMLTextAreaElement.instance.minLength_Getter_(this);
   
   @DomName('HTMLTextAreaElement.minLength')
   @DocsEditable()
   @Experimental() // untriaged
-  set minLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.minLength_Setter_(unwrap_jso(this), value);
+  set minLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.minLength_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLTextAreaElement.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkHTMLTextAreaElement.instance.name_Getter_(this);
   
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkHTMLTextAreaElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLTextAreaElement.instance.name_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Getter_(unwrap_jso(this));
+  String get placeholder => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Getter_(this);
   
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Setter_(unwrap_jso(this), value);
+  set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Getter_(unwrap_jso(this));
+  bool get readOnly => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Getter_(this);
   
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Setter_(unwrap_jso(this), value);
+  set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  bool get required => _blink.BlinkHTMLTextAreaElement.instance.required_Getter_(unwrap_jso(this));
+  bool get required => _blink.BlinkHTMLTextAreaElement.instance.required_Getter_(this);
   
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  set required(bool value) => _blink.BlinkHTMLTextAreaElement.instance.required_Setter_(unwrap_jso(this), value);
+  set required(bool value) => _blink.BlinkHTMLTextAreaElement.instance.required_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  int get rows => _blink.BlinkHTMLTextAreaElement.instance.rows_Getter_(unwrap_jso(this));
+  int get rows => _blink.BlinkHTMLTextAreaElement.instance.rows_Getter_(this);
   
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  set rows(int value) => _blink.BlinkHTMLTextAreaElement.instance.rows_Setter_(unwrap_jso(this), value);
+  set rows(int value) => _blink.BlinkHTMLTextAreaElement.instance.rows_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Getter_(unwrap_jso(this));
+  String get selectionDirection => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Getter_(this);
   
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Setter_(unwrap_jso(this), value);
+  set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Getter_(unwrap_jso(this));
+  int get selectionEnd => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Getter_(this);
   
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Setter_(unwrap_jso(this), value);
+  set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Getter_(unwrap_jso(this));
+  int get selectionStart => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Getter_(this);
   
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Setter_(unwrap_jso(this), value);
+  set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.textLength')
   @DocsEditable()
-  int get textLength => _blink.BlinkHTMLTextAreaElement.instance.textLength_Getter_(unwrap_jso(this));
+  int get textLength => _blink.BlinkHTMLTextAreaElement.instance.textLength_Getter_(this);
   
   @DomName('HTMLTextAreaElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLTextAreaElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkHTMLTextAreaElement.instance.type_Getter_(this);
   
   @DomName('HTMLTextAreaElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLTextAreaElement.instance.validationMessage_Getter_(unwrap_jso(this));
+  String get validationMessage => _blink.BlinkHTMLTextAreaElement.instance.validationMessage_Getter_(this);
   
   @DomName('HTMLTextAreaElement.validity')
   @DocsEditable()
-  ValidityState get validity => wrap_jso(_blink.BlinkHTMLTextAreaElement.instance.validity_Getter_(unwrap_jso(this)));
+  ValidityState get validity => _blink.BlinkHTMLTextAreaElement.instance.validity_Getter_(this);
   
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLTextAreaElement.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkHTMLTextAreaElement.instance.value_Getter_(this);
   
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkHTMLTextAreaElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLTextAreaElement.instance.value_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLTextAreaElement.instance.willValidate_Getter_(unwrap_jso(this));
+  bool get willValidate => _blink.BlinkHTMLTextAreaElement.instance.willValidate_Getter_(this);
   
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  String get wrap => _blink.BlinkHTMLTextAreaElement.instance.wrap_Getter_(unwrap_jso(this));
+  String get wrap => _blink.BlinkHTMLTextAreaElement.instance.wrap_Getter_(this);
   
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  set wrap(String value) => _blink.BlinkHTMLTextAreaElement.instance.wrap_Setter_(unwrap_jso(this), value);
+  set wrap(String value) => _blink.BlinkHTMLTextAreaElement.instance.wrap_Setter_(this, value);
   
   @DomName('HTMLTextAreaElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLTextAreaElement.instance.checkValidity_Callback_0_(unwrap_jso(this));
+  bool checkValidity() => _blink.BlinkHTMLTextAreaElement.instance.checkValidity_Callback_0_(this);
   
   @DomName('HTMLTextAreaElement.reportValidity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool reportValidity() => _blink.BlinkHTMLTextAreaElement.instance.reportValidity_Callback_0_(unwrap_jso(this));
+  bool reportValidity() => _blink.BlinkHTMLTextAreaElement.instance.reportValidity_Callback_0_(this);
   
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
-  void select() => _blink.BlinkHTMLTextAreaElement.instance.select_Callback_0_(unwrap_jso(this));
+  void select() => _blink.BlinkHTMLTextAreaElement.instance.select_Callback_0_(this);
   
   @DomName('HTMLTextAreaElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLTextAreaElement.instance.setCustomValidity_Callback_1_(unwrap_jso(this), error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLTextAreaElement.instance.setCustomValidity_Callback_1_(this, error);
   
   void setRangeText(String replacement, {int start, int end, String selectionMode}) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      _blink.BlinkHTMLTextAreaElement.instance.setRangeText_Callback_1_(unwrap_jso(this), replacement);
+      _blink.BlinkHTMLTextAreaElement.instance.setRangeText_Callback_1_(this, replacement);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      _blink.BlinkHTMLTextAreaElement.instance.setRangeText_Callback_4_(unwrap_jso(this), replacement, start, end, selectionMode);
+      _blink.BlinkHTMLTextAreaElement.instance.setRangeText_Callback_4_(this, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -38922,10 +36347,10 @@
 
   void setSelectionRange(int start, int end, [String direction]) {
     if (direction != null) {
-      _blink.BlinkHTMLTextAreaElement.instance.setSelectionRange_Callback_3_(unwrap_jso(this), start, end, direction);
+      _blink.BlinkHTMLTextAreaElement.instance.setSelectionRange_Callback_3_(this, start, end, direction);
       return;
     }
-    _blink.BlinkHTMLTextAreaElement.instance.setSelectionRange_Callback_2_(unwrap_jso(this), start, end);
+    _blink.BlinkHTMLTextAreaElement.instance.setSelectionRange_Callback_2_(this, start, end);
     return;
   }
 
@@ -38954,11 +36379,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextEvent internalCreateTextEvent() {
-    return new TextEvent._internalWrap();
-  }
-
-  external factory TextEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextEvent.internal_() : super.internal_();
@@ -38966,11 +36387,11 @@
 
   @DomName('TextEvent.data')
   @DocsEditable()
-  String get data => _blink.BlinkTextEvent.instance.data_Getter_(unwrap_jso(this));
+  String get data => _blink.BlinkTextEvent.instance.data_Getter_(this);
   
   @DomName('TextEvent.initTextEvent')
   @DocsEditable()
-  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkTextEvent.instance.initTextEvent_Callback_5_(unwrap_jso(this), typeArg, canBubbleArg, cancelableArg, unwrap_jso(viewArg), dataArg);
+  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkTextEvent.instance.initTextEvent_Callback_5_(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -38986,79 +36407,71 @@
   // To suppress missing implicit constructor warnings.
   factory TextMetrics._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static TextMetrics internalCreateTextMetrics() {
-    return new TextMetrics._internalWrap();
-  }
 
-  factory TextMetrics._internalWrap() {
-    return new TextMetrics.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextMetrics.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('TextMetrics.actualBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  num get actualBoundingBoxAscent => _blink.BlinkTextMetrics.instance.actualBoundingBoxAscent_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxAscent => _blink.BlinkTextMetrics.instance.actualBoundingBoxAscent_Getter_(this);
   
   @DomName('TextMetrics.actualBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  num get actualBoundingBoxDescent => _blink.BlinkTextMetrics.instance.actualBoundingBoxDescent_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxDescent => _blink.BlinkTextMetrics.instance.actualBoundingBoxDescent_Getter_(this);
   
   @DomName('TextMetrics.actualBoundingBoxLeft')
   @DocsEditable()
   @Experimental() // untriaged
-  num get actualBoundingBoxLeft => _blink.BlinkTextMetrics.instance.actualBoundingBoxLeft_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxLeft => _blink.BlinkTextMetrics.instance.actualBoundingBoxLeft_Getter_(this);
   
   @DomName('TextMetrics.actualBoundingBoxRight')
   @DocsEditable()
   @Experimental() // untriaged
-  num get actualBoundingBoxRight => _blink.BlinkTextMetrics.instance.actualBoundingBoxRight_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxRight => _blink.BlinkTextMetrics.instance.actualBoundingBoxRight_Getter_(this);
   
   @DomName('TextMetrics.alphabeticBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  num get alphabeticBaseline => _blink.BlinkTextMetrics.instance.alphabeticBaseline_Getter_(unwrap_jso(this));
+  num get alphabeticBaseline => _blink.BlinkTextMetrics.instance.alphabeticBaseline_Getter_(this);
   
   @DomName('TextMetrics.emHeightAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  num get emHeightAscent => _blink.BlinkTextMetrics.instance.emHeightAscent_Getter_(unwrap_jso(this));
+  num get emHeightAscent => _blink.BlinkTextMetrics.instance.emHeightAscent_Getter_(this);
   
   @DomName('TextMetrics.emHeightDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  num get emHeightDescent => _blink.BlinkTextMetrics.instance.emHeightDescent_Getter_(unwrap_jso(this));
+  num get emHeightDescent => _blink.BlinkTextMetrics.instance.emHeightDescent_Getter_(this);
   
   @DomName('TextMetrics.fontBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  num get fontBoundingBoxAscent => _blink.BlinkTextMetrics.instance.fontBoundingBoxAscent_Getter_(unwrap_jso(this));
+  num get fontBoundingBoxAscent => _blink.BlinkTextMetrics.instance.fontBoundingBoxAscent_Getter_(this);
   
   @DomName('TextMetrics.fontBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  num get fontBoundingBoxDescent => _blink.BlinkTextMetrics.instance.fontBoundingBoxDescent_Getter_(unwrap_jso(this));
+  num get fontBoundingBoxDescent => _blink.BlinkTextMetrics.instance.fontBoundingBoxDescent_Getter_(this);
   
   @DomName('TextMetrics.hangingBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  num get hangingBaseline => _blink.BlinkTextMetrics.instance.hangingBaseline_Getter_(unwrap_jso(this));
+  num get hangingBaseline => _blink.BlinkTextMetrics.instance.hangingBaseline_Getter_(this);
   
   @DomName('TextMetrics.ideographicBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  num get ideographicBaseline => _blink.BlinkTextMetrics.instance.ideographicBaseline_Getter_(unwrap_jso(this));
+  num get ideographicBaseline => _blink.BlinkTextMetrics.instance.ideographicBaseline_Getter_(this);
   
   @DomName('TextMetrics.width')
   @DocsEditable()
-  num get width => _blink.BlinkTextMetrics.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkTextMetrics.instance.width_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39088,11 +36501,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextTrack internalCreateTextTrack() {
-    return new TextTrack._internalWrap();
-  }
-
-  external factory TextTrack._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextTrack.internal_() : super.internal_();
@@ -39100,59 +36509,59 @@
 
   @DomName('TextTrack.activeCues')
   @DocsEditable()
-  TextTrackCueList get activeCues => wrap_jso(_blink.BlinkTextTrack.instance.activeCues_Getter_(unwrap_jso(this)));
+  TextTrackCueList get activeCues => _blink.BlinkTextTrack.instance.activeCues_Getter_(this);
   
   @DomName('TextTrack.cues')
   @DocsEditable()
-  TextTrackCueList get cues => wrap_jso(_blink.BlinkTextTrack.instance.cues_Getter_(unwrap_jso(this)));
+  TextTrackCueList get cues => _blink.BlinkTextTrack.instance.cues_Getter_(this);
   
   @DomName('TextTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkTextTrack.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkTextTrack.instance.id_Getter_(this);
   
   @DomName('TextTrack.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkTextTrack.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkTextTrack.instance.kind_Getter_(this);
   
   @DomName('TextTrack.label')
   @DocsEditable()
-  String get label => _blink.BlinkTextTrack.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkTextTrack.instance.label_Getter_(this);
   
   @DomName('TextTrack.language')
   @DocsEditable()
-  String get language => _blink.BlinkTextTrack.instance.language_Getter_(unwrap_jso(this));
+  String get language => _blink.BlinkTextTrack.instance.language_Getter_(this);
   
   @DomName('TextTrack.mode')
   @DocsEditable()
-  String get mode => _blink.BlinkTextTrack.instance.mode_Getter_(unwrap_jso(this));
+  String get mode => _blink.BlinkTextTrack.instance.mode_Getter_(this);
   
   @DomName('TextTrack.mode')
   @DocsEditable()
-  set mode(String value) => _blink.BlinkTextTrack.instance.mode_Setter_(unwrap_jso(this), value);
+  set mode(String value) => _blink.BlinkTextTrack.instance.mode_Setter_(this, value);
   
   @DomName('TextTrack.regions')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegionList get regions => wrap_jso(_blink.BlinkTextTrack.instance.regions_Getter_(unwrap_jso(this)));
+  VttRegionList get regions => _blink.BlinkTextTrack.instance.regions_Getter_(this);
   
   @DomName('TextTrack.addCue')
   @DocsEditable()
-  void addCue(TextTrackCue cue) => _blink.BlinkTextTrack.instance.addCue_Callback_1_(unwrap_jso(this), unwrap_jso(cue));
+  void addCue(TextTrackCue cue) => _blink.BlinkTextTrack.instance.addCue_Callback_1_(this, cue);
   
   @DomName('TextTrack.addRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void addRegion(VttRegion region) => _blink.BlinkTextTrack.instance.addRegion_Callback_1_(unwrap_jso(this), unwrap_jso(region));
+  void addRegion(VttRegion region) => _blink.BlinkTextTrack.instance.addRegion_Callback_1_(this, region);
   
   @DomName('TextTrack.removeCue')
   @DocsEditable()
-  void removeCue(TextTrackCue cue) => _blink.BlinkTextTrack.instance.removeCue_Callback_1_(unwrap_jso(this), unwrap_jso(cue));
+  void removeCue(TextTrackCue cue) => _blink.BlinkTextTrack.instance.removeCue_Callback_1_(this, cue);
   
   @DomName('TextTrack.removeRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeRegion(VttRegion region) => _blink.BlinkTextTrack.instance.removeRegion_Callback_1_(unwrap_jso(this), unwrap_jso(region));
+  void removeRegion(VttRegion region) => _blink.BlinkTextTrack.instance.removeRegion_Callback_1_(this, region);
   
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
@@ -39197,11 +36606,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextTrackCue internalCreateTextTrackCue() {
-    return new TextTrackCue._internalWrap();
-  }
-
-  external factory TextTrackCue._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextTrackCue.internal_() : super.internal_();
@@ -39209,39 +36614,39 @@
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  num get endTime => _blink.BlinkTextTrackCue.instance.endTime_Getter_(unwrap_jso(this));
+  num get endTime => _blink.BlinkTextTrackCue.instance.endTime_Getter_(this);
   
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  set endTime(num value) => _blink.BlinkTextTrackCue.instance.endTime_Setter_(unwrap_jso(this), value);
+  set endTime(num value) => _blink.BlinkTextTrackCue.instance.endTime_Setter_(this, value);
   
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  String get id => _blink.BlinkTextTrackCue.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkTextTrackCue.instance.id_Getter_(this);
   
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  set id(String value) => _blink.BlinkTextTrackCue.instance.id_Setter_(unwrap_jso(this), value);
+  set id(String value) => _blink.BlinkTextTrackCue.instance.id_Setter_(this, value);
   
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  bool get pauseOnExit => _blink.BlinkTextTrackCue.instance.pauseOnExit_Getter_(unwrap_jso(this));
+  bool get pauseOnExit => _blink.BlinkTextTrackCue.instance.pauseOnExit_Getter_(this);
   
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.instance.pauseOnExit_Setter_(unwrap_jso(this), value);
+  set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.instance.pauseOnExit_Setter_(this, value);
   
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  num get startTime => _blink.BlinkTextTrackCue.instance.startTime_Getter_(unwrap_jso(this));
+  num get startTime => _blink.BlinkTextTrackCue.instance.startTime_Getter_(this);
   
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  set startTime(num value) => _blink.BlinkTextTrackCue.instance.startTime_Setter_(unwrap_jso(this), value);
+  set startTime(num value) => _blink.BlinkTextTrackCue.instance.startTime_Setter_(this, value);
   
   @DomName('TextTrackCue.track')
   @DocsEditable()
-  TextTrack get track => wrap_jso(_blink.BlinkTextTrackCue.instance.track_Getter_(unwrap_jso(this)));
+  TextTrack get track => _blink.BlinkTextTrackCue.instance.track_Getter_(this);
   
   /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
@@ -39269,32 +36674,24 @@
   // To suppress missing implicit constructor warnings.
   factory TextTrackCueList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static TextTrackCueList internalCreateTextTrackCueList() {
-    return new TextTrackCueList._internalWrap();
-  }
 
-  factory TextTrackCueList._internalWrap() {
-    return new TextTrackCueList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextTrackCueList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('TextTrackCueList.length')
   @DocsEditable()
-  int get length => _blink.BlinkTextTrackCueList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkTextTrackCueList.instance.length_Getter_(this);
   
   TextTrackCue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkTextTrackCueList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  TextTrackCue _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkTextTrackCueList.instance.item_Callback_1_(unwrap_jso(this), index));
+  TextTrackCue _nativeIndexedGetter(int index) => (_blink.BlinkTextTrackCueList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, TextTrackCue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -39336,11 +36733,11 @@
 
   @DomName('TextTrackCueList.getCueById')
   @DocsEditable()
-  TextTrackCue getCueById(String id) => wrap_jso(_blink.BlinkTextTrackCueList.instance.getCueById_Callback_1_(unwrap_jso(this), id));
+  TextTrackCue getCueById(String id) => _blink.BlinkTextTrackCueList.instance.getCueById_Callback_1_(this, id);
   
   @DomName('TextTrackCueList.item')
   @DocsEditable()
-  TextTrackCue item(int index) => wrap_jso(_blink.BlinkTextTrackCueList.instance.item_Callback_1_(unwrap_jso(this), index));
+  TextTrackCue item(int index) => _blink.BlinkTextTrackCueList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39375,11 +36772,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextTrackList internalCreateTextTrackList() {
-    return new TextTrackList._internalWrap();
-  }
-
-  external factory TextTrackList._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextTrackList.internal_() : super.internal_();
@@ -39387,15 +36780,15 @@
 
   @DomName('TextTrackList.length')
   @DocsEditable()
-  int get length => _blink.BlinkTextTrackList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkTextTrackList.instance.length_Getter_(this);
   
   TextTrack operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkTextTrackList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  TextTrack _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkTextTrackList.instance.item_Callback_1_(unwrap_jso(this), index));
+  TextTrack _nativeIndexedGetter(int index) => (_blink.BlinkTextTrackList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, TextTrack value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -39438,11 +36831,11 @@
   @DomName('TextTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack getTrackById(String id) => wrap_jso(_blink.BlinkTextTrackList.instance.getTrackById_Callback_1_(unwrap_jso(this), id));
+  TextTrack getTrackById(String id) => _blink.BlinkTextTrackList.instance.getTrackById_Callback_1_(this, id);
   
   @DomName('TextTrackList.item')
   @DocsEditable()
-  TextTrack item(int index) => wrap_jso(_blink.BlinkTextTrackList.instance.item_Callback_1_(unwrap_jso(this), index));
+  TextTrack item(int index) => _blink.BlinkTextTrackList.instance.item_Callback_1_(this, index);
   
   /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
@@ -39469,32 +36862,24 @@
   // To suppress missing implicit constructor warnings.
   factory TimeRanges._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static TimeRanges internalCreateTimeRanges() {
-    return new TimeRanges._internalWrap();
-  }
 
-  factory TimeRanges._internalWrap() {
-    return new TimeRanges.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TimeRanges.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('TimeRanges.length')
   @DocsEditable()
-  int get length => _blink.BlinkTimeRanges.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkTimeRanges.instance.length_Getter_(this);
   
   @DomName('TimeRanges.end')
   @DocsEditable()
-  num end(int index) => _blink.BlinkTimeRanges.instance.end_Callback_1_(unwrap_jso(this), index);
+  num end(int index) => _blink.BlinkTimeRanges.instance.end_Callback_1_(this, index);
   
   @DomName('TimeRanges.start')
   @DocsEditable()
-  num start(int index) => _blink.BlinkTimeRanges.instance.start_Callback_1_(unwrap_jso(this), index);
+  num start(int index) => _blink.BlinkTimeRanges.instance.start_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39525,11 +36910,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TitleElement internalCreateTitleElement() {
-    return new TitleElement._internalWrap();
-  }
-
-  external factory TitleElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TitleElement.internal_() : super.internal_();
@@ -39555,84 +36936,76 @@
   // To suppress missing implicit constructor warnings.
   factory Touch._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Touch internalCreateTouch() {
-    return new Touch._internalWrap();
-  }
 
-  factory Touch._internalWrap() {
-    return new Touch.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Touch.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('Touch.clientX')
   @DocsEditable()
-  num get _clientX => _blink.BlinkTouch.instance.clientX_Getter_(unwrap_jso(this));
+  num get _clientX => _blink.BlinkTouch.instance.clientX_Getter_(this);
   
   @DomName('Touch.clientY')
   @DocsEditable()
-  num get _clientY => _blink.BlinkTouch.instance.clientY_Getter_(unwrap_jso(this));
+  num get _clientY => _blink.BlinkTouch.instance.clientY_Getter_(this);
   
   @DomName('Touch.force')
   @DocsEditable()
   @Experimental() // untriaged
-  num get force => _blink.BlinkTouch.instance.force_Getter_(unwrap_jso(this));
+  num get force => _blink.BlinkTouch.instance.force_Getter_(this);
   
   @DomName('Touch.identifier')
   @DocsEditable()
-  int get identifier => _blink.BlinkTouch.instance.identifier_Getter_(unwrap_jso(this));
+  int get identifier => _blink.BlinkTouch.instance.identifier_Getter_(this);
   
   @DomName('Touch.pageX')
   @DocsEditable()
-  num get _pageX => _blink.BlinkTouch.instance.pageX_Getter_(unwrap_jso(this));
+  num get _pageX => _blink.BlinkTouch.instance.pageX_Getter_(this);
   
   @DomName('Touch.pageY')
   @DocsEditable()
-  num get _pageY => _blink.BlinkTouch.instance.pageY_Getter_(unwrap_jso(this));
+  num get _pageY => _blink.BlinkTouch.instance.pageY_Getter_(this);
   
   @DomName('Touch.radiusX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get _radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(unwrap_jso(this));
+  num get _radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(this);
   
   @DomName('Touch.radiusY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get _radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this));
+  num get _radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(this);
   
   @DomName('Touch.rotationAngle')
   @DocsEditable()
   @Experimental() // untriaged
-  num get rotationAngle => _blink.BlinkTouch.instance.rotationAngle_Getter_(unwrap_jso(this));
+  num get rotationAngle => _blink.BlinkTouch.instance.rotationAngle_Getter_(this);
   
   @DomName('Touch.screenX')
   @DocsEditable()
-  num get _screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this));
+  num get _screenX => _blink.BlinkTouch.instance.screenX_Getter_(this);
   
   @DomName('Touch.screenY')
   @DocsEditable()
-  num get _screenY => _blink.BlinkTouch.instance.screenY_Getter_(unwrap_jso(this));
+  num get _screenY => _blink.BlinkTouch.instance.screenY_Getter_(this);
   
   @DomName('Touch.target')
   @DocsEditable()
-  EventTarget get target => wrap_jso(_blink.BlinkTouch.instance.target_Getter_(unwrap_jso(this)));
+  EventTarget get target => _blink.BlinkTouch.instance.target_Getter_(this);
   
 
 // As of Chrome 37, these all changed from long to double.  This code
 // preserves backwards compatability for the time being.
-  int get __clientX => _blink.BlinkTouch.instance.clientX_Getter_(unwrap_jso(this)).round();
-  int get __clientY => _blink.BlinkTouch.instance.clientY_Getter_(unwrap_jso(this)).round();
-  int get __screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this)).round();
-  int get __screenY => _blink.BlinkTouch.instance.screenY_Getter_(unwrap_jso(this)).round();
-  int get __pageX => _blink.BlinkTouch.instance.pageX_Getter_(unwrap_jso(this)).round();
-  int get __pageY => _blink.BlinkTouch.instance.pageY_Getter_(unwrap_jso(this)).round();
-  int get __radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(unwrap_jso(this)).round();
-  int get __radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this)).round();
+  int get __clientX => _blink.BlinkTouch.instance.clientX_Getter_(this).round();
+  int get __clientY => _blink.BlinkTouch.instance.clientY_Getter_(this).round();
+  int get __screenX => _blink.BlinkTouch.instance.screenX_Getter_(this).round();
+  int get __screenY => _blink.BlinkTouch.instance.screenY_Getter_(this).round();
+  int get __pageX => _blink.BlinkTouch.instance.pageX_Getter_(this).round();
+  int get __pageY => _blink.BlinkTouch.instance.pageY_Getter_(this).round();
+  int get __radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(this).round();
+  int get __radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(this).round();
 
   @DomName('Touch.clientX')
   @DomName('Touch.clientY')
@@ -39690,11 +37063,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TouchEvent internalCreateTouchEvent() {
-    return new TouchEvent._internalWrap();
-  }
-
-  external factory TouchEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TouchEvent.internal_() : super.internal_();
@@ -39702,35 +37071,35 @@
 
   @DomName('TouchEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.BlinkTouchEvent.instance.altKey_Getter_(unwrap_jso(this));
+  bool get altKey => _blink.BlinkTouchEvent.instance.altKey_Getter_(this);
   
   @DomName('TouchEvent.changedTouches')
   @DocsEditable()
-  TouchList get changedTouches => wrap_jso(_blink.BlinkTouchEvent.instance.changedTouches_Getter_(unwrap_jso(this)));
+  TouchList get changedTouches => _blink.BlinkTouchEvent.instance.changedTouches_Getter_(this);
   
   @DomName('TouchEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.BlinkTouchEvent.instance.ctrlKey_Getter_(unwrap_jso(this));
+  bool get ctrlKey => _blink.BlinkTouchEvent.instance.ctrlKey_Getter_(this);
   
   @DomName('TouchEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.BlinkTouchEvent.instance.metaKey_Getter_(unwrap_jso(this));
+  bool get metaKey => _blink.BlinkTouchEvent.instance.metaKey_Getter_(this);
   
   @DomName('TouchEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.BlinkTouchEvent.instance.shiftKey_Getter_(unwrap_jso(this));
+  bool get shiftKey => _blink.BlinkTouchEvent.instance.shiftKey_Getter_(this);
   
   @DomName('TouchEvent.targetTouches')
   @DocsEditable()
-  TouchList get targetTouches => wrap_jso(_blink.BlinkTouchEvent.instance.targetTouches_Getter_(unwrap_jso(this)));
+  TouchList get targetTouches => _blink.BlinkTouchEvent.instance.targetTouches_Getter_(this);
   
   @DomName('TouchEvent.touches')
   @DocsEditable()
-  TouchList get touches => wrap_jso(_blink.BlinkTouchEvent.instance.touches_Getter_(unwrap_jso(this)));
+  TouchList get touches => _blink.BlinkTouchEvent.instance.touches_Getter_(this);
   
   @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) => _blink.BlinkTouchEvent.instance.initTouchEvent_Callback_13_(unwrap_jso(this), unwrap_jso(touches), unwrap_jso(targetTouches), unwrap_jso(changedTouches), type, unwrap_jso(view), unused1, unused2, unused3, unused4, ctrlKey, altKey, shiftKey, metaKey);
+  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) => _blink.BlinkTouchEvent.instance.initTouchEvent_Callback_13_(this, touches, targetTouches, changedTouches, type, view, unused1, unused2, unused3, unused4, ctrlKey, altKey, shiftKey, metaKey);
   
 
   /**
@@ -39760,35 +37129,27 @@
   // To suppress missing implicit constructor warnings.
   factory TouchList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static TouchList internalCreateTouchList() {
-    return new TouchList._internalWrap();
-  }
 
-  factory TouchList._internalWrap() {
-    return new TouchList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TouchList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('TouchList.length')
   @DocsEditable()
-  int get length => _blink.BlinkTouchList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkTouchList.instance.length_Getter_(this);
   
   Touch operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkTouchList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Touch _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkTouchList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Touch _nativeIndexedGetter(int index) => (_blink.BlinkTouchList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Touch value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -39830,7 +37191,7 @@
 
   @DomName('TouchList.item')
   @DocsEditable()
-  Touch item(int index) => wrap_jso(_blink.BlinkTouchList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Touch item(int index) => _blink.BlinkTouchList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39852,51 +37213,43 @@
   factory TrackDefault(String type, String language, String label, List<String> kinds, [String byteStreamTrackID]) {
     if (byteStreamTrackID != null) {
       List kinds_1 = convertDartToNative_StringArray(kinds);
-      return wrap_jso(_blink.BlinkTrackDefault.instance.constructorCallback_5_(type, language, label, kinds_1, byteStreamTrackID));
+      return _blink.BlinkTrackDefault.instance.constructorCallback_5_(type, language, label, kinds_1, byteStreamTrackID);
     }
     List kinds_1 = convertDartToNative_StringArray(kinds);
-    return wrap_jso(_blink.BlinkTrackDefault.instance.constructorCallback_4_(type, language, label, kinds_1));
+    return _blink.BlinkTrackDefault.instance.constructorCallback_4_(type, language, label, kinds_1);
   }
 
+
   @Deprecated("Internal Use Only")
-  static TrackDefault internalCreateTrackDefault() {
-    return new TrackDefault._internalWrap();
-  }
-
-  factory TrackDefault._internalWrap() {
-    return new TrackDefault.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TrackDefault.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('TrackDefault.byteStreamTrackID')
   @DocsEditable()
   @Experimental() // untriaged
-  String get byteStreamTrackID => _blink.BlinkTrackDefault.instance.byteStreamTrackID_Getter_(unwrap_jso(this));
+  String get byteStreamTrackID => _blink.BlinkTrackDefault.instance.byteStreamTrackID_Getter_(this);
   
   @DomName('TrackDefault.kinds')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get kinds => _blink.BlinkTrackDefault.instance.kinds_Getter_(unwrap_jso(this));
+  List<String> get kinds => _blink.BlinkTrackDefault.instance.kinds_Getter_(this);
   
   @DomName('TrackDefault.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkTrackDefault.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkTrackDefault.instance.label_Getter_(this);
   
   @DomName('TrackDefault.language')
   @DocsEditable()
   @Experimental() // untriaged
-  String get language => _blink.BlinkTrackDefault.instance.language_Getter_(unwrap_jso(this));
+  String get language => _blink.BlinkTrackDefault.instance.language_Getter_(this);
   
   @DomName('TrackDefault.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkTrackDefault.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkTrackDefault.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39917,35 +37270,27 @@
   @DocsEditable()
   factory TrackDefaultList([List<TrackDefault> trackDefaults]) {
     if (trackDefaults != null) {
-      return wrap_jso(_blink.BlinkTrackDefaultList.instance.constructorCallback_1_(trackDefaults));
+      return _blink.BlinkTrackDefaultList.instance.constructorCallback_1_(trackDefaults);
     }
-    return wrap_jso(_blink.BlinkTrackDefaultList.instance.constructorCallback_0_());
+    return _blink.BlinkTrackDefaultList.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static TrackDefaultList internalCreateTrackDefaultList() {
-    return new TrackDefaultList._internalWrap();
-  }
-
-  factory TrackDefaultList._internalWrap() {
-    return new TrackDefaultList.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TrackDefaultList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('TrackDefaultList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkTrackDefaultList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkTrackDefaultList.instance.length_Getter_(this);
   
   @DomName('TrackDefaultList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  TrackDefault item(int index) => wrap_jso(_blink.BlinkTrackDefaultList.instance.item_Callback_1_(unwrap_jso(this), index));
+  TrackDefault item(int index) => _blink.BlinkTrackDefaultList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -39972,11 +37317,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TrackElement internalCreateTrackElement() {
-    return new TrackElement._internalWrap();
-  }
-
-  external factory TrackElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TrackElement.internal_() : super.internal_();
@@ -40009,51 +37350,51 @@
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  bool get defaultValue => _blink.BlinkHTMLTrackElement.instance.default_Getter_(unwrap_jso(this));
+  bool get defaultValue => _blink.BlinkHTMLTrackElement.instance.default_Getter_(this);
   
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.instance.default_Setter_(unwrap_jso(this), value);
+  set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.instance.default_Setter_(this, value);
   
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkHTMLTrackElement.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkHTMLTrackElement.instance.kind_Getter_(this);
   
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  set kind(String value) => _blink.BlinkHTMLTrackElement.instance.kind_Setter_(unwrap_jso(this), value);
+  set kind(String value) => _blink.BlinkHTMLTrackElement.instance.kind_Setter_(this, value);
   
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  String get label => _blink.BlinkHTMLTrackElement.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkHTMLTrackElement.instance.label_Getter_(this);
   
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  set label(String value) => _blink.BlinkHTMLTrackElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLTrackElement.instance.label_Setter_(this, value);
   
   @DomName('HTMLTrackElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkHTMLTrackElement.instance.readyState_Getter_(unwrap_jso(this));
+  int get readyState => _blink.BlinkHTMLTrackElement.instance.readyState_Getter_(this);
   
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLTrackElement.instance.src_Getter_(unwrap_jso(this));
+  String get src => _blink.BlinkHTMLTrackElement.instance.src_Getter_(this);
   
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  set src(String value) => _blink.BlinkHTMLTrackElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLTrackElement.instance.src_Setter_(this, value);
   
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  String get srclang => _blink.BlinkHTMLTrackElement.instance.srclang_Getter_(unwrap_jso(this));
+  String get srclang => _blink.BlinkHTMLTrackElement.instance.srclang_Getter_(this);
   
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  set srclang(String value) => _blink.BlinkHTMLTrackElement.instance.srclang_Setter_(unwrap_jso(this), value);
+  set srclang(String value) => _blink.BlinkHTMLTrackElement.instance.srclang_Setter_(this, value);
   
   @DomName('HTMLTrackElement.track')
   @DocsEditable()
-  TextTrack get track => wrap_jso(_blink.BlinkHTMLTrackElement.instance.track_Getter_(unwrap_jso(this)));
+  TextTrack get track => _blink.BlinkHTMLTrackElement.instance.track_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40075,18 +37416,14 @@
   factory TrackEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkTrackEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkTrackEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkTrackEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkTrackEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static TrackEvent internalCreateTrackEvent() {
-    return new TrackEvent._internalWrap();
-  }
-
-  external factory TrackEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TrackEvent.internal_() : super.internal_();
@@ -40094,7 +37431,7 @@
 
   @DomName('TrackEvent.track')
   @DocsEditable()
-  Object get track => wrap_jso(_blink.BlinkTrackEvent.instance.track_Getter_(unwrap_jso(this)));
+  Object get track => (_blink.BlinkTrackEvent.instance.track_Getter_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40115,18 +37452,14 @@
   factory TransitionEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkTransitionEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkTransitionEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkTransitionEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkTransitionEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static TransitionEvent internalCreateTransitionEvent() {
-    return new TransitionEvent._internalWrap();
-  }
-
-  external factory TransitionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TransitionEvent.internal_() : super.internal_();
@@ -40134,15 +37467,15 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  num get elapsedTime => _blink.BlinkTransitionEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
+  num get elapsedTime => _blink.BlinkTransitionEvent.instance.elapsedTime_Getter_(this);
   
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
-  String get propertyName => _blink.BlinkTransitionEvent.instance.propertyName_Getter_(unwrap_jso(this));
+  String get propertyName => _blink.BlinkTransitionEvent.instance.propertyName_Getter_(this);
   
   @DomName('TransitionEvent.pseudoElement')
   @DocsEditable()
-  String get pseudoElement => _blink.BlinkTransitionEvent.instance.pseudoElement_Getter_(unwrap_jso(this));
+  String get pseudoElement => _blink.BlinkTransitionEvent.instance.pseudoElement_Getter_(this);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -40159,68 +37492,60 @@
   // To suppress missing implicit constructor warnings.
   factory TreeWalker._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static TreeWalker internalCreateTreeWalker() {
-    return new TreeWalker._internalWrap();
-  }
 
-  factory TreeWalker._internalWrap() {
-    return new TreeWalker.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TreeWalker.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  Node get currentNode => wrap_jso(_blink.BlinkTreeWalker.instance.currentNode_Getter_(unwrap_jso(this)));
+  Node get currentNode => _blink.BlinkTreeWalker.instance.currentNode_Getter_(this);
   
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  set currentNode(Node value) => _blink.BlinkTreeWalker.instance.currentNode_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set currentNode(Node value) => _blink.BlinkTreeWalker.instance.currentNode_Setter_(this, value);
   
   @DomName('TreeWalker.filter')
   @DocsEditable()
-  NodeFilter get filter => wrap_jso(_blink.BlinkTreeWalker.instance.filter_Getter_(unwrap_jso(this)));
+  NodeFilter get filter => _blink.BlinkTreeWalker.instance.filter_Getter_(this);
   
   @DomName('TreeWalker.root')
   @DocsEditable()
-  Node get root => wrap_jso(_blink.BlinkTreeWalker.instance.root_Getter_(unwrap_jso(this)));
+  Node get root => _blink.BlinkTreeWalker.instance.root_Getter_(this);
   
   @DomName('TreeWalker.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.BlinkTreeWalker.instance.whatToShow_Getter_(unwrap_jso(this));
+  int get whatToShow => _blink.BlinkTreeWalker.instance.whatToShow_Getter_(this);
   
   @DomName('TreeWalker.firstChild')
   @DocsEditable()
-  Node firstChild() => wrap_jso(_blink.BlinkTreeWalker.instance.firstChild_Callback_0_(unwrap_jso(this)));
+  Node firstChild() => _blink.BlinkTreeWalker.instance.firstChild_Callback_0_(this);
   
   @DomName('TreeWalker.lastChild')
   @DocsEditable()
-  Node lastChild() => wrap_jso(_blink.BlinkTreeWalker.instance.lastChild_Callback_0_(unwrap_jso(this)));
+  Node lastChild() => _blink.BlinkTreeWalker.instance.lastChild_Callback_0_(this);
   
   @DomName('TreeWalker.nextNode')
   @DocsEditable()
-  Node nextNode() => wrap_jso(_blink.BlinkTreeWalker.instance.nextNode_Callback_0_(unwrap_jso(this)));
+  Node nextNode() => _blink.BlinkTreeWalker.instance.nextNode_Callback_0_(this);
   
   @DomName('TreeWalker.nextSibling')
   @DocsEditable()
-  Node nextSibling() => wrap_jso(_blink.BlinkTreeWalker.instance.nextSibling_Callback_0_(unwrap_jso(this)));
+  Node nextSibling() => _blink.BlinkTreeWalker.instance.nextSibling_Callback_0_(this);
   
   @DomName('TreeWalker.parentNode')
   @DocsEditable()
-  Node parentNode() => wrap_jso(_blink.BlinkTreeWalker.instance.parentNode_Callback_0_(unwrap_jso(this)));
+  Node parentNode() => _blink.BlinkTreeWalker.instance.parentNode_Callback_0_(this);
   
   @DomName('TreeWalker.previousNode')
   @DocsEditable()
-  Node previousNode() => wrap_jso(_blink.BlinkTreeWalker.instance.previousNode_Callback_0_(unwrap_jso(this)));
+  Node previousNode() => _blink.BlinkTreeWalker.instance.previousNode_Callback_0_(this);
   
   @DomName('TreeWalker.previousSibling')
   @DocsEditable()
-  Node previousSibling() => wrap_jso(_blink.BlinkTreeWalker.instance.previousSibling_Callback_0_(unwrap_jso(this)));
+  Node previousSibling() => _blink.BlinkTreeWalker.instance.previousSibling_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40254,18 +37579,14 @@
   factory UIEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkUIEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkUIEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkUIEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkUIEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static UIEvent internalCreateUIEvent() {
-    return new UIEvent._internalWrap();
-  }
-
-  external factory UIEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   UIEvent.internal_() : super.internal_();
@@ -40274,34 +37595,34 @@
   @DomName('UIEvent.charCode')
   @DocsEditable()
   @Unstable()
-  int get _charCode => _blink.BlinkUIEvent.instance.charCode_Getter_(unwrap_jso(this));
+  int get _charCode => _blink.BlinkUIEvent.instance.charCode_Getter_(this);
   
   @DomName('UIEvent.detail')
   @DocsEditable()
-  int get detail => _blink.BlinkUIEvent.instance.detail_Getter_(unwrap_jso(this));
+  int get detail => _blink.BlinkUIEvent.instance.detail_Getter_(this);
   
   @DomName('UIEvent.keyCode')
   @DocsEditable()
   @Unstable()
-  int get _keyCode => _blink.BlinkUIEvent.instance.keyCode_Getter_(unwrap_jso(this));
+  int get _keyCode => _blink.BlinkUIEvent.instance.keyCode_Getter_(this);
   
   @DomName('UIEvent.sourceDevice')
   @DocsEditable()
   @Experimental() // untriaged
-  InputDevice get sourceDevice => wrap_jso(_blink.BlinkUIEvent.instance.sourceDevice_Getter_(unwrap_jso(this)));
+  InputDevice get sourceDevice => _blink.BlinkUIEvent.instance.sourceDevice_Getter_(this);
   
   @DomName('UIEvent.view')
   @DocsEditable()
-  WindowBase get view => wrap_jso(_blink.BlinkUIEvent.instance.view_Getter_(unwrap_jso(this)));
+  WindowBase get view => _blink.BlinkUIEvent.instance.view_Getter_(this);
   
   @DomName('UIEvent.which')
   @DocsEditable()
   @Unstable()
-  int get _which => _blink.BlinkUIEvent.instance.which_Getter_(unwrap_jso(this));
+  int get _which => _blink.BlinkUIEvent.instance.which_Getter_(this);
   
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool bubbles, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.instance.initUIEvent_Callback_5_(unwrap_jso(this), type, bubbles, cancelable, unwrap_jso(view), detail);
+  void _initUIEvent(String type, bool bubbles, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.instance.initUIEvent_Callback_5_(this, type, bubbles, cancelable, view, detail);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40323,11 +37644,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static UListElement internalCreateUListElement() {
-    return new UListElement._internalWrap();
-  }
-
-  external factory UListElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   UListElement.internal_() : super.internal_();
@@ -40355,11 +37672,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static UnknownElement internalCreateUnknownElement() {
-    return new UnknownElement._internalWrap();
-  }
-
-  external factory UnknownElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   UnknownElement.internal_() : super.internal_();
@@ -40385,45 +37698,37 @@
   // To suppress missing implicit constructor warnings.
   factory Url._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Url internalCreateUrl() {
-    return new Url._internalWrap();
-  }
 
-  factory Url._internalWrap() {
-    return new Url.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Url.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   static String createObjectUrl(blob_OR_source_OR_stream) {
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
-      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(blob_OR_source_OR_stream));
-    }
-    if ((blob_OR_source_OR_stream is MediaSource)) {
-      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(blob_OR_source_OR_stream));
+      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     if ((blob_OR_source_OR_stream is MediaStream)) {
-      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(blob_OR_source_OR_stream));
+      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
+    }
+    if ((blob_OR_source_OR_stream is MediaSource)) {
+      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('URL.createObjectUrlFromBlob')
   @DocsEditable()
-  static String createObjectUrlFromBlob(Blob blob) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(blob));
+  static String createObjectUrlFromBlob(Blob blob) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob);
   
   @DomName('URL.createObjectUrlFromSource')
   @DocsEditable()
-  static String createObjectUrlFromSource(MediaSource source) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(source));
+  static String createObjectUrlFromSource(MediaSource source) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(source);
   
   @DomName('URL.createObjectUrlFromStream')
   @DocsEditable()
-  static String createObjectUrlFromStream(MediaStream stream) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(unwrap_jso(stream));
+  static String createObjectUrlFromStream(MediaStream stream) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(stream);
   
   @DomName('URL.revokeObjectURL')
   @DocsEditable()
@@ -40432,112 +37737,112 @@
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.BlinkURL.instance.hash_Getter_(unwrap_jso(this));
+  String get hash => _blink.BlinkURL.instance.hash_Getter_(this);
   
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  set hash(String value) => _blink.BlinkURL.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkURL.instance.hash_Setter_(this, value);
   
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.BlinkURL.instance.host_Getter_(unwrap_jso(this));
+  String get host => _blink.BlinkURL.instance.host_Getter_(this);
   
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  set host(String value) => _blink.BlinkURL.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkURL.instance.host_Setter_(this, value);
   
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.BlinkURL.instance.hostname_Getter_(unwrap_jso(this));
+  String get hostname => _blink.BlinkURL.instance.hostname_Getter_(this);
   
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  set hostname(String value) => _blink.BlinkURL.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkURL.instance.hostname_Setter_(this, value);
   
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.BlinkURL.instance.href_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkURL.instance.href_Getter_(this);
   
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  set href(String value) => _blink.BlinkURL.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkURL.instance.href_Setter_(this, value);
   
   @DomName('URL.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkURL.instance.origin_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkURL.instance.origin_Getter_(this);
   
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkURL.instance.password_Getter_(unwrap_jso(this));
+  String get password => _blink.BlinkURL.instance.password_Getter_(this);
   
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  set password(String value) => _blink.BlinkURL.instance.password_Setter_(unwrap_jso(this), value);
+  set password(String value) => _blink.BlinkURL.instance.password_Setter_(this, value);
   
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.BlinkURL.instance.pathname_Getter_(unwrap_jso(this));
+  String get pathname => _blink.BlinkURL.instance.pathname_Getter_(this);
   
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  set pathname(String value) => _blink.BlinkURL.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkURL.instance.pathname_Setter_(this, value);
   
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.BlinkURL.instance.port_Getter_(unwrap_jso(this));
+  String get port => _blink.BlinkURL.instance.port_Getter_(this);
   
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  set port(String value) => _blink.BlinkURL.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkURL.instance.port_Setter_(this, value);
   
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.BlinkURL.instance.protocol_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkURL.instance.protocol_Getter_(this);
   
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  set protocol(String value) => _blink.BlinkURL.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkURL.instance.protocol_Setter_(this, value);
   
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.BlinkURL.instance.search_Getter_(unwrap_jso(this));
+  String get search => _blink.BlinkURL.instance.search_Getter_(this);
   
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  set search(String value) => _blink.BlinkURL.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkURL.instance.search_Setter_(this, value);
   
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.BlinkURL.instance.username_Getter_(unwrap_jso(this));
+  String get username => _blink.BlinkURL.instance.username_Getter_(this);
   
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  set username(String value) => _blink.BlinkURL.instance.username_Setter_(unwrap_jso(this), value);
+  set username(String value) => _blink.BlinkURL.instance.username_Setter_(this, value);
   
   @DomName('URL.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.BlinkURL.instance.toString_Callback_0_(unwrap_jso(this));
+  String toString() => _blink.BlinkURL.instance.toString_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40744,35 +38049,27 @@
   // To suppress missing implicit constructor warnings.
   factory VRDevice._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VRDevice internalCreateVRDevice() {
-    return new VRDevice._internalWrap();
-  }
 
-  factory VRDevice._internalWrap() {
-    return new VRDevice.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VRDevice.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VRDevice.deviceId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get deviceId => _blink.BlinkVRDevice.instance.deviceId_Getter_(unwrap_jso(this));
+  String get deviceId => _blink.BlinkVRDevice.instance.deviceId_Getter_(this);
   
   @DomName('VRDevice.deviceName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get deviceName => _blink.BlinkVRDevice.instance.deviceName_Getter_(unwrap_jso(this));
+  String get deviceName => _blink.BlinkVRDevice.instance.deviceName_Getter_(this);
   
   @DomName('VRDevice.hardwareUnitId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hardwareUnitId => _blink.BlinkVRDevice.instance.hardwareUnitId_Getter_(unwrap_jso(this));
+  String get hardwareUnitId => _blink.BlinkVRDevice.instance.hardwareUnitId_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40789,50 +38086,42 @@
   // To suppress missing implicit constructor warnings.
   factory VREyeParameters._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VREyeParameters internalCreateVREyeParameters() {
-    return new VREyeParameters._internalWrap();
-  }
 
-  factory VREyeParameters._internalWrap() {
-    return new VREyeParameters.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VREyeParameters.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VREyeParameters.currentFieldOfView')
   @DocsEditable()
   @Experimental() // untriaged
-  VRFieldOfView get currentFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.currentFieldOfView_Getter_(unwrap_jso(this)));
+  VRFieldOfView get currentFieldOfView => _blink.BlinkVREyeParameters.instance.currentFieldOfView_Getter_(this);
   
   @DomName('VREyeParameters.eyeTranslation')
   @DocsEditable()
   @Experimental() // untriaged
-  DomPoint get eyeTranslation => wrap_jso(_blink.BlinkVREyeParameters.instance.eyeTranslation_Getter_(unwrap_jso(this)));
+  DomPoint get eyeTranslation => _blink.BlinkVREyeParameters.instance.eyeTranslation_Getter_(this);
   
   @DomName('VREyeParameters.maximumFieldOfView')
   @DocsEditable()
   @Experimental() // untriaged
-  VRFieldOfView get maximumFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.maximumFieldOfView_Getter_(unwrap_jso(this)));
+  VRFieldOfView get maximumFieldOfView => _blink.BlinkVREyeParameters.instance.maximumFieldOfView_Getter_(this);
   
   @DomName('VREyeParameters.minimumFieldOfView')
   @DocsEditable()
   @Experimental() // untriaged
-  VRFieldOfView get minimumFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.minimumFieldOfView_Getter_(unwrap_jso(this)));
+  VRFieldOfView get minimumFieldOfView => _blink.BlinkVREyeParameters.instance.minimumFieldOfView_Getter_(this);
   
   @DomName('VREyeParameters.recommendedFieldOfView')
   @DocsEditable()
   @Experimental() // untriaged
-  VRFieldOfView get recommendedFieldOfView => wrap_jso(_blink.BlinkVREyeParameters.instance.recommendedFieldOfView_Getter_(unwrap_jso(this)));
+  VRFieldOfView get recommendedFieldOfView => _blink.BlinkVREyeParameters.instance.recommendedFieldOfView_Getter_(this);
   
   @DomName('VREyeParameters.renderRect')
   @DocsEditable()
   @Experimental() // untriaged
-  _DomRect get renderRect => wrap_jso(_blink.BlinkVREyeParameters.instance.renderRect_Getter_(unwrap_jso(this)));
+  _DomRect get renderRect => _blink.BlinkVREyeParameters.instance.renderRect_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40854,65 +38143,57 @@
   factory VRFieldOfView([Map fov]) {
     if (fov != null) {
       var fov_1 = convertDartToNative_Dictionary(fov);
-      return wrap_jso(_blink.BlinkVRFieldOfView.instance.constructorCallback_1_(fov_1));
+      return _blink.BlinkVRFieldOfView.instance.constructorCallback_1_(fov_1);
     }
-    return wrap_jso(_blink.BlinkVRFieldOfView.instance.constructorCallback_0_());
+    return _blink.BlinkVRFieldOfView.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static VRFieldOfView internalCreateVRFieldOfView() {
-    return new VRFieldOfView._internalWrap();
-  }
-
-  factory VRFieldOfView._internalWrap() {
-    return new VRFieldOfView.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VRFieldOfView.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VRFieldOfView.downDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  num get downDegrees => _blink.BlinkVRFieldOfView.instance.downDegrees_Getter_(unwrap_jso(this));
+  num get downDegrees => _blink.BlinkVRFieldOfView.instance.downDegrees_Getter_(this);
   
   @DomName('VRFieldOfView.downDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  set downDegrees(num value) => _blink.BlinkVRFieldOfView.instance.downDegrees_Setter_(unwrap_jso(this), value);
+  set downDegrees(num value) => _blink.BlinkVRFieldOfView.instance.downDegrees_Setter_(this, value);
   
   @DomName('VRFieldOfView.leftDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  num get leftDegrees => _blink.BlinkVRFieldOfView.instance.leftDegrees_Getter_(unwrap_jso(this));
+  num get leftDegrees => _blink.BlinkVRFieldOfView.instance.leftDegrees_Getter_(this);
   
   @DomName('VRFieldOfView.leftDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  set leftDegrees(num value) => _blink.BlinkVRFieldOfView.instance.leftDegrees_Setter_(unwrap_jso(this), value);
+  set leftDegrees(num value) => _blink.BlinkVRFieldOfView.instance.leftDegrees_Setter_(this, value);
   
   @DomName('VRFieldOfView.rightDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  num get rightDegrees => _blink.BlinkVRFieldOfView.instance.rightDegrees_Getter_(unwrap_jso(this));
+  num get rightDegrees => _blink.BlinkVRFieldOfView.instance.rightDegrees_Getter_(this);
   
   @DomName('VRFieldOfView.rightDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  set rightDegrees(num value) => _blink.BlinkVRFieldOfView.instance.rightDegrees_Setter_(unwrap_jso(this), value);
+  set rightDegrees(num value) => _blink.BlinkVRFieldOfView.instance.rightDegrees_Setter_(this, value);
   
   @DomName('VRFieldOfView.upDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  num get upDegrees => _blink.BlinkVRFieldOfView.instance.upDegrees_Getter_(unwrap_jso(this));
+  num get upDegrees => _blink.BlinkVRFieldOfView.instance.upDegrees_Getter_(this);
   
   @DomName('VRFieldOfView.upDegrees')
   @DocsEditable()
   @Experimental() // untriaged
-  set upDegrees(num value) => _blink.BlinkVRFieldOfView.instance.upDegrees_Setter_(unwrap_jso(this), value);
+  set upDegrees(num value) => _blink.BlinkVRFieldOfView.instance.upDegrees_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40929,55 +38210,47 @@
   // To suppress missing implicit constructor warnings.
   factory VRPositionState._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VRPositionState internalCreateVRPositionState() {
-    return new VRPositionState._internalWrap();
-  }
 
-  factory VRPositionState._internalWrap() {
-    return new VRPositionState.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VRPositionState.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VRPositionState.angularAcceleration')
   @DocsEditable()
   @Experimental() // untriaged
-  DomPoint get angularAcceleration => wrap_jso(_blink.BlinkVRPositionState.instance.angularAcceleration_Getter_(unwrap_jso(this)));
+  DomPoint get angularAcceleration => _blink.BlinkVRPositionState.instance.angularAcceleration_Getter_(this);
   
   @DomName('VRPositionState.angularVelocity')
   @DocsEditable()
   @Experimental() // untriaged
-  DomPoint get angularVelocity => wrap_jso(_blink.BlinkVRPositionState.instance.angularVelocity_Getter_(unwrap_jso(this)));
+  DomPoint get angularVelocity => _blink.BlinkVRPositionState.instance.angularVelocity_Getter_(this);
   
   @DomName('VRPositionState.linearAcceleration')
   @DocsEditable()
   @Experimental() // untriaged
-  DomPoint get linearAcceleration => wrap_jso(_blink.BlinkVRPositionState.instance.linearAcceleration_Getter_(unwrap_jso(this)));
+  DomPoint get linearAcceleration => _blink.BlinkVRPositionState.instance.linearAcceleration_Getter_(this);
   
   @DomName('VRPositionState.linearVelocity')
   @DocsEditable()
   @Experimental() // untriaged
-  DomPoint get linearVelocity => wrap_jso(_blink.BlinkVRPositionState.instance.linearVelocity_Getter_(unwrap_jso(this)));
+  DomPoint get linearVelocity => _blink.BlinkVRPositionState.instance.linearVelocity_Getter_(this);
   
   @DomName('VRPositionState.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  DomPoint get orientation => wrap_jso(_blink.BlinkVRPositionState.instance.orientation_Getter_(unwrap_jso(this)));
+  DomPoint get orientation => _blink.BlinkVRPositionState.instance.orientation_Getter_(this);
   
   @DomName('VRPositionState.position')
   @DocsEditable()
   @Experimental() // untriaged
-  DomPoint get position => wrap_jso(_blink.BlinkVRPositionState.instance.position_Getter_(unwrap_jso(this)));
+  DomPoint get position => _blink.BlinkVRPositionState.instance.position_Getter_(this);
   
   @DomName('VRPositionState.timeStamp')
   @DocsEditable()
   @Experimental() // untriaged
-  num get timeStamp => _blink.BlinkVRPositionState.instance.timeStamp_Getter_(unwrap_jso(this));
+  num get timeStamp => _blink.BlinkVRPositionState.instance.timeStamp_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -40993,65 +38266,57 @@
   // To suppress missing implicit constructor warnings.
   factory ValidityState._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ValidityState internalCreateValidityState() {
-    return new ValidityState._internalWrap();
-  }
 
-  factory ValidityState._internalWrap() {
-    return new ValidityState.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ValidityState.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ValidityState.badInput')
   @DocsEditable()
-  bool get badInput => _blink.BlinkValidityState.instance.badInput_Getter_(unwrap_jso(this));
+  bool get badInput => _blink.BlinkValidityState.instance.badInput_Getter_(this);
   
   @DomName('ValidityState.customError')
   @DocsEditable()
-  bool get customError => _blink.BlinkValidityState.instance.customError_Getter_(unwrap_jso(this));
+  bool get customError => _blink.BlinkValidityState.instance.customError_Getter_(this);
   
   @DomName('ValidityState.patternMismatch')
   @DocsEditable()
-  bool get patternMismatch => _blink.BlinkValidityState.instance.patternMismatch_Getter_(unwrap_jso(this));
+  bool get patternMismatch => _blink.BlinkValidityState.instance.patternMismatch_Getter_(this);
   
   @DomName('ValidityState.rangeOverflow')
   @DocsEditable()
-  bool get rangeOverflow => _blink.BlinkValidityState.instance.rangeOverflow_Getter_(unwrap_jso(this));
+  bool get rangeOverflow => _blink.BlinkValidityState.instance.rangeOverflow_Getter_(this);
   
   @DomName('ValidityState.rangeUnderflow')
   @DocsEditable()
-  bool get rangeUnderflow => _blink.BlinkValidityState.instance.rangeUnderflow_Getter_(unwrap_jso(this));
+  bool get rangeUnderflow => _blink.BlinkValidityState.instance.rangeUnderflow_Getter_(this);
   
   @DomName('ValidityState.stepMismatch')
   @DocsEditable()
-  bool get stepMismatch => _blink.BlinkValidityState.instance.stepMismatch_Getter_(unwrap_jso(this));
+  bool get stepMismatch => _blink.BlinkValidityState.instance.stepMismatch_Getter_(this);
   
   @DomName('ValidityState.tooLong')
   @DocsEditable()
-  bool get tooLong => _blink.BlinkValidityState.instance.tooLong_Getter_(unwrap_jso(this));
+  bool get tooLong => _blink.BlinkValidityState.instance.tooLong_Getter_(this);
   
   @DomName('ValidityState.tooShort')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get tooShort => _blink.BlinkValidityState.instance.tooShort_Getter_(unwrap_jso(this));
+  bool get tooShort => _blink.BlinkValidityState.instance.tooShort_Getter_(this);
   
   @DomName('ValidityState.typeMismatch')
   @DocsEditable()
-  bool get typeMismatch => _blink.BlinkValidityState.instance.typeMismatch_Getter_(unwrap_jso(this));
+  bool get typeMismatch => _blink.BlinkValidityState.instance.typeMismatch_Getter_(this);
   
   @DomName('ValidityState.valid')
   @DocsEditable()
-  bool get valid => _blink.BlinkValidityState.instance.valid_Getter_(unwrap_jso(this));
+  bool get valid => _blink.BlinkValidityState.instance.valid_Getter_(this);
   
   @DomName('ValidityState.valueMissing')
   @DocsEditable()
-  bool get valueMissing => _blink.BlinkValidityState.instance.valueMissing_Getter_(unwrap_jso(this));
+  bool get valueMissing => _blink.BlinkValidityState.instance.valueMissing_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41070,11 +38335,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static VideoElement internalCreateVideoElement() {
-    return new VideoElement._internalWrap();
-  }
-
-  external factory VideoElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VideoElement.internal_() : super.internal_();
@@ -41088,54 +38349,54 @@
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLVideoElement.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkHTMLVideoElement.instance.height_Getter_(this);
   
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  set height(int value) => _blink.BlinkHTMLVideoElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLVideoElement.instance.height_Setter_(this, value);
   
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  String get poster => _blink.BlinkHTMLVideoElement.instance.poster_Getter_(unwrap_jso(this));
+  String get poster => _blink.BlinkHTMLVideoElement.instance.poster_Getter_(this);
   
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  set poster(String value) => _blink.BlinkHTMLVideoElement.instance.poster_Setter_(unwrap_jso(this), value);
+  set poster(String value) => _blink.BlinkHTMLVideoElement.instance.poster_Setter_(this, value);
   
   @DomName('HTMLVideoElement.videoHeight')
   @DocsEditable()
-  int get videoHeight => _blink.BlinkHTMLVideoElement.instance.videoHeight_Getter_(unwrap_jso(this));
+  int get videoHeight => _blink.BlinkHTMLVideoElement.instance.videoHeight_Getter_(this);
   
   @DomName('HTMLVideoElement.videoWidth')
   @DocsEditable()
-  int get videoWidth => _blink.BlinkHTMLVideoElement.instance.videoWidth_Getter_(unwrap_jso(this));
+  int get videoWidth => _blink.BlinkHTMLVideoElement.instance.videoWidth_Getter_(this);
   
   @DomName('HTMLVideoElement.webkitDecodedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get decodedFrameCount => _blink.BlinkHTMLVideoElement.instance.webkitDecodedFrameCount_Getter_(unwrap_jso(this));
+  int get decodedFrameCount => _blink.BlinkHTMLVideoElement.instance.webkitDecodedFrameCount_Getter_(this);
   
   @DomName('HTMLVideoElement.webkitDroppedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get droppedFrameCount => _blink.BlinkHTMLVideoElement.instance.webkitDroppedFrameCount_Getter_(unwrap_jso(this));
+  int get droppedFrameCount => _blink.BlinkHTMLVideoElement.instance.webkitDroppedFrameCount_Getter_(this);
   
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLVideoElement.instance.width_Getter_(unwrap_jso(this));
+  int get width => _blink.BlinkHTMLVideoElement.instance.width_Getter_(this);
   
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  set width(int value) => _blink.BlinkHTMLVideoElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLVideoElement.instance.width_Setter_(this, value);
   
   @DomName('HTMLVideoElement.getVideoPlaybackQuality')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoPlaybackQuality getVideoPlaybackQuality() => wrap_jso(_blink.BlinkHTMLVideoElement.instance.getVideoPlaybackQuality_Callback_0_(unwrap_jso(this)));
+  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.BlinkHTMLVideoElement.instance.getVideoPlaybackQuality_Callback_0_(this);
   
   @DomName('HTMLVideoElement.webkitEnterFullscreen')
   @DocsEditable()
@@ -41143,7 +38404,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  void enterFullscreen() => _blink.BlinkHTMLVideoElement.instance.webkitEnterFullscreen_Callback_0_(unwrap_jso(this));
+  void enterFullscreen() => _blink.BlinkHTMLVideoElement.instance.webkitEnterFullscreen_Callback_0_(this);
   
   @DomName('HTMLVideoElement.webkitExitFullscreen')
   @DocsEditable()
@@ -41151,7 +38412,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void exitFullscreen() => _blink.BlinkHTMLVideoElement.instance.webkitExitFullscreen_Callback_0_(unwrap_jso(this));
+  void exitFullscreen() => _blink.BlinkHTMLVideoElement.instance.webkitExitFullscreen_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41168,40 +38429,32 @@
   // To suppress missing implicit constructor warnings.
   factory VideoPlaybackQuality._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VideoPlaybackQuality internalCreateVideoPlaybackQuality() {
-    return new VideoPlaybackQuality._internalWrap();
-  }
 
-  factory VideoPlaybackQuality._internalWrap() {
-    return new VideoPlaybackQuality.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VideoPlaybackQuality.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VideoPlaybackQuality.corruptedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get corruptedVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.corruptedVideoFrames_Getter_(unwrap_jso(this));
+  int get corruptedVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.corruptedVideoFrames_Getter_(this);
   
   @DomName('VideoPlaybackQuality.creationTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get creationTime => _blink.BlinkVideoPlaybackQuality.instance.creationTime_Getter_(unwrap_jso(this));
+  num get creationTime => _blink.BlinkVideoPlaybackQuality.instance.creationTime_Getter_(this);
   
   @DomName('VideoPlaybackQuality.droppedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get droppedVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.droppedVideoFrames_Getter_(unwrap_jso(this));
+  int get droppedVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.droppedVideoFrames_Getter_(this);
   
   @DomName('VideoPlaybackQuality.totalVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get totalVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.totalVideoFrames_Getter_(unwrap_jso(this));
+  int get totalVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.totalVideoFrames_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41218,50 +38471,42 @@
   // To suppress missing implicit constructor warnings.
   factory VideoTrack._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VideoTrack internalCreateVideoTrack() {
-    return new VideoTrack._internalWrap();
-  }
 
-  factory VideoTrack._internalWrap() {
-    return new VideoTrack.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VideoTrack.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VideoTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkVideoTrack.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkVideoTrack.instance.id_Getter_(this);
   
   @DomName('VideoTrack.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkVideoTrack.instance.kind_Getter_(unwrap_jso(this));
+  String get kind => _blink.BlinkVideoTrack.instance.kind_Getter_(this);
   
   @DomName('VideoTrack.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkVideoTrack.instance.label_Getter_(unwrap_jso(this));
+  String get label => _blink.BlinkVideoTrack.instance.label_Getter_(this);
   
   @DomName('VideoTrack.language')
   @DocsEditable()
   @Experimental() // untriaged
-  String get language => _blink.BlinkVideoTrack.instance.language_Getter_(unwrap_jso(this));
+  String get language => _blink.BlinkVideoTrack.instance.language_Getter_(this);
   
   @DomName('VideoTrack.selected')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get selected => _blink.BlinkVideoTrack.instance.selected_Getter_(unwrap_jso(this));
+  bool get selected => _blink.BlinkVideoTrack.instance.selected_Getter_(this);
   
   @DomName('VideoTrack.selected')
   @DocsEditable()
   @Experimental() // untriaged
-  set selected(bool value) => _blink.BlinkVideoTrack.instance.selected_Setter_(unwrap_jso(this), value);
+  set selected(bool value) => _blink.BlinkVideoTrack.instance.selected_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41285,11 +38530,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static VideoTrackList internalCreateVideoTrackList() {
-    return new VideoTrackList._internalWrap();
-  }
-
-  external factory VideoTrackList._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VideoTrackList.internal_() : super.internal_();
@@ -41298,22 +38539,22 @@
   @DomName('VideoTrackList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkVideoTrackList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkVideoTrackList.instance.length_Getter_(this);
   
   @DomName('VideoTrackList.selectedIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  int get selectedIndex => _blink.BlinkVideoTrackList.instance.selectedIndex_Getter_(unwrap_jso(this));
+  int get selectedIndex => _blink.BlinkVideoTrackList.instance.selectedIndex_Getter_(this);
   
   @DomName('VideoTrackList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrack __getter__(int index) => wrap_jso(_blink.BlinkVideoTrackList.instance.$__getter___Callback_1_(unwrap_jso(this), index));
+  VideoTrack __getter__(int index) => _blink.BlinkVideoTrackList.instance.$__getter___Callback_1_(this, index);
   
   @DomName('VideoTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrack getTrackById(String id) => wrap_jso(_blink.BlinkVideoTrackList.instance.getTrackById_Callback_1_(unwrap_jso(this), id));
+  VideoTrack getTrackById(String id) => _blink.BlinkVideoTrackList.instance.getTrackById_Callback_1_(this, id);
   
   @DomName('VideoTrackList.onchange')
   @DocsEditable()
@@ -41349,16 +38590,12 @@
   @DomName('VTTCue.VTTCue')
   @DocsEditable()
   factory VttCue(num startTime, num endTime, String text) {
-    return wrap_jso(_blink.BlinkVTTCue.instance.constructorCallback_3_(startTime, endTime, text));
+    return _blink.BlinkVTTCue.instance.constructorCallback_3_(startTime, endTime, text);
   }
 
 
   @Deprecated("Internal Use Only")
-  static VttCue internalCreateVttCue() {
-    return new VttCue._internalWrap();
-  }
-
-  external factory VttCue._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VttCue.internal_() : super.internal_();
@@ -41367,87 +38604,87 @@
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  String get align => _blink.BlinkVTTCue.instance.align_Getter_(unwrap_jso(this));
+  String get align => _blink.BlinkVTTCue.instance.align_Getter_(this);
   
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  set align(String value) => _blink.BlinkVTTCue.instance.align_Setter_(unwrap_jso(this), value);
+  set align(String value) => _blink.BlinkVTTCue.instance.align_Setter_(this, value);
   
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get line => wrap_jso(_blink.BlinkVTTCue.instance.line_Getter_(unwrap_jso(this)));
+  Object get line => (_blink.BlinkVTTCue.instance.line_Getter_(this));
   
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  set line(Object value) => _blink.BlinkVTTCue.instance.line_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set line(Object value) => _blink.BlinkVTTCue.instance.line_Setter_(this, value);
   
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get position => wrap_jso(_blink.BlinkVTTCue.instance.position_Getter_(unwrap_jso(this)));
+  Object get position => (_blink.BlinkVTTCue.instance.position_Getter_(this));
   
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  set position(Object value) => _blink.BlinkVTTCue.instance.position_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set position(Object value) => _blink.BlinkVTTCue.instance.position_Setter_(this, value);
   
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get regionId => _blink.BlinkVTTCue.instance.regionId_Getter_(unwrap_jso(this));
+  String get regionId => _blink.BlinkVTTCue.instance.regionId_Getter_(this);
   
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  set regionId(String value) => _blink.BlinkVTTCue.instance.regionId_Setter_(unwrap_jso(this), value);
+  set regionId(String value) => _blink.BlinkVTTCue.instance.regionId_Setter_(this, value);
   
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  num get size => _blink.BlinkVTTCue.instance.size_Getter_(unwrap_jso(this));
+  num get size => _blink.BlinkVTTCue.instance.size_Getter_(this);
   
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  set size(num value) => _blink.BlinkVTTCue.instance.size_Setter_(unwrap_jso(this), value);
+  set size(num value) => _blink.BlinkVTTCue.instance.size_Setter_(this, value);
   
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get snapToLines => _blink.BlinkVTTCue.instance.snapToLines_Getter_(unwrap_jso(this));
+  bool get snapToLines => _blink.BlinkVTTCue.instance.snapToLines_Getter_(this);
   
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  set snapToLines(bool value) => _blink.BlinkVTTCue.instance.snapToLines_Setter_(unwrap_jso(this), value);
+  set snapToLines(bool value) => _blink.BlinkVTTCue.instance.snapToLines_Setter_(this, value);
   
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  String get text => _blink.BlinkVTTCue.instance.text_Getter_(unwrap_jso(this));
+  String get text => _blink.BlinkVTTCue.instance.text_Getter_(this);
   
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  set text(String value) => _blink.BlinkVTTCue.instance.text_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkVTTCue.instance.text_Setter_(this, value);
   
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  String get vertical => _blink.BlinkVTTCue.instance.vertical_Getter_(unwrap_jso(this));
+  String get vertical => _blink.BlinkVTTCue.instance.vertical_Getter_(this);
   
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  set vertical(String value) => _blink.BlinkVTTCue.instance.vertical_Setter_(unwrap_jso(this), value);
+  set vertical(String value) => _blink.BlinkVTTCue.instance.vertical_Setter_(this, value);
   
   @DomName('VTTCue.getCueAsHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  DocumentFragment getCueAsHtml() => wrap_jso(_blink.BlinkVTTCue.instance.getCueAsHTML_Callback_0_(unwrap_jso(this)));
+  DocumentFragment getCueAsHtml() => _blink.BlinkVTTCue.instance.getCueAsHTML_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41467,108 +38704,100 @@
   @DomName('VTTRegion.VTTRegion')
   @DocsEditable()
   factory VttRegion() {
-    return wrap_jso(_blink.BlinkVTTRegion.instance.constructorCallback_0_());
+    return _blink.BlinkVTTRegion.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static VttRegion internalCreateVttRegion() {
-    return new VttRegion._internalWrap();
-  }
-
-  factory VttRegion._internalWrap() {
-    return new VttRegion.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VttRegion.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.BlinkVTTRegion.instance.height_Getter_(unwrap_jso(this));
+  int get height => _blink.BlinkVTTRegion.instance.height_Getter_(this);
   
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  set height(int value) => _blink.BlinkVTTRegion.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkVTTRegion.instance.height_Setter_(this, value);
   
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkVTTRegion.instance.id_Getter_(unwrap_jso(this));
+  String get id => _blink.BlinkVTTRegion.instance.id_Getter_(this);
   
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  set id(String value) => _blink.BlinkVTTRegion.instance.id_Setter_(unwrap_jso(this), value);
+  set id(String value) => _blink.BlinkVTTRegion.instance.id_Setter_(this, value);
   
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorX => _blink.BlinkVTTRegion.instance.regionAnchorX_Getter_(unwrap_jso(this));
+  num get regionAnchorX => _blink.BlinkVTTRegion.instance.regionAnchorX_Getter_(this);
   
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  set regionAnchorX(num value) => _blink.BlinkVTTRegion.instance.regionAnchorX_Setter_(unwrap_jso(this), value);
+  set regionAnchorX(num value) => _blink.BlinkVTTRegion.instance.regionAnchorX_Setter_(this, value);
   
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorY => _blink.BlinkVTTRegion.instance.regionAnchorY_Getter_(unwrap_jso(this));
+  num get regionAnchorY => _blink.BlinkVTTRegion.instance.regionAnchorY_Getter_(this);
   
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  set regionAnchorY(num value) => _blink.BlinkVTTRegion.instance.regionAnchorY_Setter_(unwrap_jso(this), value);
+  set regionAnchorY(num value) => _blink.BlinkVTTRegion.instance.regionAnchorY_Setter_(this, value);
   
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scroll => _blink.BlinkVTTRegion.instance.scroll_Getter_(unwrap_jso(this));
+  String get scroll => _blink.BlinkVTTRegion.instance.scroll_Getter_(this);
   
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  set scroll(String value) => _blink.BlinkVTTRegion.instance.scroll_Setter_(unwrap_jso(this), value);
+  set scroll(String value) => _blink.BlinkVTTRegion.instance.scroll_Setter_(this, value);
   
   @DomName('VTTRegion.track')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack get track => wrap_jso(_blink.BlinkVTTRegion.instance.track_Getter_(unwrap_jso(this)));
+  TextTrack get track => _blink.BlinkVTTRegion.instance.track_Getter_(this);
   
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorX => _blink.BlinkVTTRegion.instance.viewportAnchorX_Getter_(unwrap_jso(this));
+  num get viewportAnchorX => _blink.BlinkVTTRegion.instance.viewportAnchorX_Getter_(this);
   
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  set viewportAnchorX(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorX_Setter_(unwrap_jso(this), value);
+  set viewportAnchorX(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorX_Setter_(this, value);
   
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorY => _blink.BlinkVTTRegion.instance.viewportAnchorY_Getter_(unwrap_jso(this));
+  num get viewportAnchorY => _blink.BlinkVTTRegion.instance.viewportAnchorY_Getter_(this);
   
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  set viewportAnchorY(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorY_Setter_(unwrap_jso(this), value);
+  set viewportAnchorY(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorY_Setter_(this, value);
   
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.BlinkVTTRegion.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkVTTRegion.instance.width_Getter_(this);
   
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  set width(num value) => _blink.BlinkVTTRegion.instance.width_Setter_(unwrap_jso(this), value);
+  set width(num value) => _blink.BlinkVTTRegion.instance.width_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41585,35 +38814,27 @@
   // To suppress missing implicit constructor warnings.
   factory VttRegionList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VttRegionList internalCreateVttRegionList() {
-    return new VttRegionList._internalWrap();
-  }
 
-  factory VttRegionList._internalWrap() {
-    return new VttRegionList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VttRegionList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('VTTRegionList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkVTTRegionList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkVTTRegionList.instance.length_Getter_(this);
   
   @DomName('VTTRegionList.getRegionById')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion getRegionById(String id) => wrap_jso(_blink.BlinkVTTRegionList.instance.getRegionById_Callback_1_(unwrap_jso(this), id));
+  VttRegion getRegionById(String id) => _blink.BlinkVTTRegionList.instance.getRegionById_Callback_1_(this, id);
   
   @DomName('VTTRegionList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion item(int index) => wrap_jso(_blink.BlinkVTTRegionList.instance.item_Callback_1_(unwrap_jso(this), index));
+  VttRegion item(int index) => _blink.BlinkVTTRegionList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -41712,18 +38933,14 @@
   @DocsEditable()
   factory WebSocket(String url, [Object protocols]) {
     if (protocols != null) {
-      return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocols));
+      return _blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocols);
     }
-    return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_1_(url));
+    return _blink.BlinkWebSocket.instance.constructorCallback_1_(url);
   }
 
 
   @Deprecated("Internal Use Only")
-  static WebSocket internalCreateWebSocket() {
-    return new WebSocket._internalWrap();
-  }
-
-  external factory WebSocket._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   WebSocket.internal_() : super.internal_();
@@ -41750,60 +38967,60 @@
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.BlinkWebSocket.instance.binaryType_Getter_(unwrap_jso(this));
+  String get binaryType => _blink.BlinkWebSocket.instance.binaryType_Getter_(this);
   
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  set binaryType(String value) => _blink.BlinkWebSocket.instance.binaryType_Setter_(unwrap_jso(this), value);
+  set binaryType(String value) => _blink.BlinkWebSocket.instance.binaryType_Setter_(this, value);
   
   @DomName('WebSocket.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.BlinkWebSocket.instance.bufferedAmount_Getter_(unwrap_jso(this));
+  int get bufferedAmount => _blink.BlinkWebSocket.instance.bufferedAmount_Getter_(this);
   
   @DomName('WebSocket.extensions')
   @DocsEditable()
-  String get extensions => _blink.BlinkWebSocket.instance.extensions_Getter_(unwrap_jso(this));
+  String get extensions => _blink.BlinkWebSocket.instance.extensions_Getter_(this);
   
   @DomName('WebSocket.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkWebSocket.instance.protocol_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkWebSocket.instance.protocol_Getter_(this);
   
   @DomName('WebSocket.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkWebSocket.instance.readyState_Getter_(unwrap_jso(this));
+  int get readyState => _blink.BlinkWebSocket.instance.readyState_Getter_(this);
   
   @DomName('WebSocket.url')
   @DocsEditable()
-  String get url => _blink.BlinkWebSocket.instance.url_Getter_(unwrap_jso(this));
+  String get url => _blink.BlinkWebSocket.instance.url_Getter_(this);
   
   void close([int code, String reason]) {
     if (reason != null) {
-      _blink.BlinkWebSocket.instance.close_Callback_2_(unwrap_jso(this), code, reason);
+      _blink.BlinkWebSocket.instance.close_Callback_2_(this, code, reason);
       return;
     }
     if (code != null) {
-      _blink.BlinkWebSocket.instance.close_Callback_1_(unwrap_jso(this), code);
+      _blink.BlinkWebSocket.instance.close_Callback_1_(this, code);
       return;
     }
-    _blink.BlinkWebSocket.instance.close_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWebSocket.instance.close_Callback_0_(this);
     return;
   }
 
   void send(data) {
     if ((data is String)) {
-      _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is Blob)) {
-      _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is TypedData)) {
-      _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is ByteBuffer)) {
-      _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -41811,19 +39028,19 @@
 
   @DomName('WebSocket.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void sendBlob(Blob data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
   
   @DomName('WebSocket.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
   
   @DomName('WebSocket.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), data);
+  void sendString(String data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
   
   @DomName('WebSocket.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.BlinkWebSocket.instance.send_Callback_1_(unwrap_jso(this), unwrap_jso(data));
+  void sendTypedData(TypedData data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
   
   /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
@@ -41883,7 +39100,7 @@
       'relatedTarget': relatedTarget,
     };
 
-    return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_2_(type, convertDartToNative_Dictionary(options)));
+    return _blink.BlinkWheelEvent.instance.constructorCallback_2_(type, convertDartToNative_Dictionary(options));
   }
 
 
@@ -41892,18 +39109,14 @@
   factory WheelEvent._(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkWheelEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkWheelEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static WheelEvent internalCreateWheelEvent() {
-    return new WheelEvent._internalWrap();
-  }
-
-  external factory WheelEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   WheelEvent.internal_() : super.internal_();
@@ -41923,19 +39136,19 @@
 
   @DomName('WheelEvent.deltaMode')
   @DocsEditable()
-  int get deltaMode => _blink.BlinkWheelEvent.instance.deltaMode_Getter_(unwrap_jso(this));
+  int get deltaMode => _blink.BlinkWheelEvent.instance.deltaMode_Getter_(this);
   
   @DomName('WheelEvent.deltaX')
   @DocsEditable()
-  num get _deltaX => _blink.BlinkWheelEvent.instance.deltaX_Getter_(unwrap_jso(this));
+  num get _deltaX => _blink.BlinkWheelEvent.instance.deltaX_Getter_(this);
   
   @DomName('WheelEvent.deltaY')
   @DocsEditable()
-  num get _deltaY => _blink.BlinkWheelEvent.instance.deltaY_Getter_(unwrap_jso(this));
+  num get _deltaY => _blink.BlinkWheelEvent.instance.deltaY_Getter_(this);
   
   @DomName('WheelEvent.deltaZ')
   @DocsEditable()
-  num get deltaZ => _blink.BlinkWheelEvent.instance.deltaZ_Getter_(unwrap_jso(this));
+  num get deltaZ => _blink.BlinkWheelEvent.instance.deltaZ_Getter_(this);
   
 
   /**
@@ -42239,11 +39452,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Window internalCreateWindow() {
-    return new Window._internalWrap();
-  }
-
-  external factory Window._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Window.internal_() : super.internal_();
@@ -42297,20 +39506,20 @@
    */
   @DomName('Window.applicationCache')
   @DocsEditable()
-  ApplicationCache get applicationCache => wrap_jso(_blink.BlinkWindow.instance.applicationCache_Getter_(unwrap_jso(this)));
+  ApplicationCache get applicationCache => _blink.BlinkWindow.instance.applicationCache_Getter_(this);
   
   @DomName('Window.caches')
   @DocsEditable()
   @Experimental() // untriaged
-  CacheStorage get caches => wrap_jso(_blink.BlinkWindow.instance.caches_Getter_(unwrap_jso(this)));
+  CacheStorage get caches => _blink.BlinkWindow.instance.caches_Getter_(this);
   
   @DomName('Window.closed')
   @DocsEditable()
-  bool get closed => _blink.BlinkWindow.instance.closed_Getter_(unwrap_jso(this));
+  bool get closed => _blink.BlinkWindow.instance.closed_Getter_(this);
   
   @DomName('Window.console')
   @DocsEditable()
-  Console get console => wrap_jso(_blink.BlinkWindow.instance.console_Getter_(unwrap_jso(this)));
+  Console get console => _blink.BlinkWindow.instance.console_Getter_(this);
   
   /**
    * Entrypoint for the browser's cryptographic functions.
@@ -42323,31 +39532,31 @@
   @DocsEditable()
   // http://www.w3.org/TR/WebCryptoAPI/
   @Experimental()
-  Crypto get crypto => wrap_jso(_blink.BlinkWindow.instance.crypto_Getter_(unwrap_jso(this)));
+  Crypto get crypto => _blink.BlinkWindow.instance.crypto_Getter_(this);
   
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultStatus => _blink.BlinkWindow.instance.defaultStatus_Getter_(unwrap_jso(this));
+  String get defaultStatus => _blink.BlinkWindow.instance.defaultStatus_Getter_(this);
   
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  set defaultStatus(String value) => _blink.BlinkWindow.instance.defaultStatus_Setter_(unwrap_jso(this), value);
+  set defaultStatus(String value) => _blink.BlinkWindow.instance.defaultStatus_Setter_(this, value);
   
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultstatus => _blink.BlinkWindow.instance.defaultstatus_Getter_(unwrap_jso(this));
+  String get defaultstatus => _blink.BlinkWindow.instance.defaultstatus_Getter_(this);
   
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  set defaultstatus(String value) => _blink.BlinkWindow.instance.defaultstatus_Setter_(unwrap_jso(this), value);
+  set defaultstatus(String value) => _blink.BlinkWindow.instance.defaultstatus_Setter_(this, value);
   
   /**
    * The ratio between physical pixels and logical CSS pixels.
@@ -42363,11 +39572,11 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  num get devicePixelRatio => _blink.BlinkWindow.instance.devicePixelRatio_Getter_(unwrap_jso(this));
+  num get devicePixelRatio => _blink.BlinkWindow.instance.devicePixelRatio_Getter_(this);
   
   @DomName('Window.document')
   @DocsEditable()
-  Document get document => wrap_jso(_blink.BlinkWindow.instance.document_Getter_(unwrap_jso(this)));
+  Document get document => _blink.BlinkWindow.instance.document_Getter_(this);
   
   /**
    * The current session history for this window's newest document.
@@ -42379,7 +39588,7 @@
    */
   @DomName('Window.history')
   @DocsEditable()
-  History get history => wrap_jso(_blink.BlinkWindow.instance.history_Getter_(unwrap_jso(this)));
+  History get history => _blink.BlinkWindow.instance.history_Getter_(this);
   
   @DomName('Window.indexedDB')
   @DocsEditable()
@@ -42387,7 +39596,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
-  IdbFactory get indexedDB => wrap_jso(_blink.BlinkWindow.instance.indexedDB_Getter_(unwrap_jso(this)));
+  IdbFactory get indexedDB => _blink.BlinkWindow.instance.indexedDB_Getter_(this);
   
   /**
    * The height of the viewport including scrollbars.
@@ -42399,7 +39608,7 @@
    */
   @DomName('Window.innerHeight')
   @DocsEditable()
-  int get innerHeight => _blink.BlinkWindow.instance.innerHeight_Getter_(unwrap_jso(this));
+  int get innerHeight => _blink.BlinkWindow.instance.innerHeight_Getter_(this);
   
   /**
    * The width of the viewport including scrollbars.
@@ -42411,7 +39620,7 @@
    */
   @DomName('Window.innerWidth')
   @DocsEditable()
-  int get innerWidth => _blink.BlinkWindow.instance.innerWidth_Getter_(unwrap_jso(this));
+  int get innerWidth => _blink.BlinkWindow.instance.innerWidth_Getter_(this);
   
   /**
    * Storage for this window that persists across sessions.
@@ -42427,11 +39636,11 @@
    */
   @DomName('Window.localStorage')
   @DocsEditable()
-  Storage get localStorage => wrap_jso(_blink.BlinkWindow.instance.localStorage_Getter_(unwrap_jso(this)));
+  Storage get localStorage => _blink.BlinkWindow.instance.localStorage_Getter_(this);
   
   @DomName('Window.location')
   @DocsEditable()
-  Location get location => wrap_jso(_blink.BlinkWindow.instance.location_Getter_(unwrap_jso(this)));
+  Location get location => _blink.BlinkWindow.instance.location_Getter_(this);
   
   /**
    * This window's location bar, which displays the URL.
@@ -42444,7 +39653,7 @@
    */
   @DomName('Window.locationbar')
   @DocsEditable()
-  BarProp get locationbar => wrap_jso(_blink.BlinkWindow.instance.locationbar_Getter_(unwrap_jso(this)));
+  BarProp get locationbar => _blink.BlinkWindow.instance.locationbar_Getter_(this);
   
   /**
    * This window's menu bar, which displays menu commands.
@@ -42457,7 +39666,7 @@
    */
   @DomName('Window.menubar')
   @DocsEditable()
-  BarProp get menubar => wrap_jso(_blink.BlinkWindow.instance.menubar_Getter_(unwrap_jso(this)));
+  BarProp get menubar => _blink.BlinkWindow.instance.menubar_Getter_(this);
   
   /**
    * The name of this window.
@@ -42469,7 +39678,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  String get name => _blink.BlinkWindow.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkWindow.instance.name_Getter_(this);
   
   /**
    * The name of this window.
@@ -42481,7 +39690,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  set name(String value) => _blink.BlinkWindow.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkWindow.instance.name_Setter_(this, value);
   
   /**
    * The user agent accessing this window.
@@ -42494,7 +39703,7 @@
    */
   @DomName('Window.navigator')
   @DocsEditable()
-  Navigator get navigator => wrap_jso(_blink.BlinkWindow.instance.navigator_Getter_(unwrap_jso(this)));
+  Navigator get navigator => _blink.BlinkWindow.instance.navigator_Getter_(this);
   
   /**
    * Whether objects are drawn offscreen before being displayed.
@@ -42507,20 +39716,20 @@
   @DomName('Window.offscreenBuffering')
   @DocsEditable()
   @Experimental() // non-standard
-  bool get offscreenBuffering => _blink.BlinkWindow.instance.offscreenBuffering_Getter_(unwrap_jso(this));
+  bool get offscreenBuffering => _blink.BlinkWindow.instance.offscreenBuffering_Getter_(this);
   
   @DomName('Window.opener')
   @DocsEditable()
-  WindowBase get opener => wrap_jso(_blink.BlinkWindow.instance.opener_Getter_(unwrap_jso(this)));
+  WindowBase get opener => _blink.BlinkWindow.instance.opener_Getter_(this);
   
   @DomName('Window.opener')
   @DocsEditable()
-  set opener(Window value) => _blink.BlinkWindow.instance.opener_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set opener(Window value) => _blink.BlinkWindow.instance.opener_Setter_(this, value);
   
   @DomName('Window.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  int get orientation => _blink.BlinkWindow.instance.orientation_Getter_(unwrap_jso(this));
+  int get orientation => _blink.BlinkWindow.instance.orientation_Getter_(this);
   
   /**
    * The height of this window including all user interface elements.
@@ -42532,7 +39741,7 @@
    */
   @DomName('Window.outerHeight')
   @DocsEditable()
-  int get outerHeight => _blink.BlinkWindow.instance.outerHeight_Getter_(unwrap_jso(this));
+  int get outerHeight => _blink.BlinkWindow.instance.outerHeight_Getter_(this);
   
   /**
    * The width of the window including all user interface elements.
@@ -42544,7 +39753,7 @@
    */
   @DomName('Window.outerWidth')
   @DocsEditable()
-  int get outerWidth => _blink.BlinkWindow.instance.outerWidth_Getter_(unwrap_jso(this));
+  int get outerWidth => _blink.BlinkWindow.instance.outerWidth_Getter_(this);
   
   /**
    * The distance this window has been scrolled horizontally.
@@ -42561,7 +39770,7 @@
    */
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  num get _pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(unwrap_jso(this));
+  num get _pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(this);
   
   /**
    * The distance this window has been scrolled vertically.
@@ -42578,11 +39787,11 @@
    */
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  num get _pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(unwrap_jso(this));
+  num get _pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(this);
   
   @DomName('Window.parent')
   @DocsEditable()
-  WindowBase get parent => wrap_jso(_blink.BlinkWindow.instance.parent_Getter_(unwrap_jso(this)));
+  WindowBase get parent => _blink.BlinkWindow.instance.parent_Getter_(this);
   
   /**
    * Timing and navigation data for this window.
@@ -42600,7 +39809,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE)
-  Performance get performance => wrap_jso(_blink.BlinkWindow.instance.performance_Getter_(unwrap_jso(this)));
+  Performance get performance => _blink.BlinkWindow.instance.performance_Getter_(this);
   
   /**
    * Information about the screen displaying this window.
@@ -42612,7 +39821,7 @@
    */
   @DomName('Window.screen')
   @DocsEditable()
-  Screen get screen => wrap_jso(_blink.BlinkWindow.instance.screen_Getter_(unwrap_jso(this)));
+  Screen get screen => _blink.BlinkWindow.instance.screen_Getter_(this);
   
   /**
    * The distance from the left side of the screen to the left side of this
@@ -42625,7 +39834,7 @@
    */
   @DomName('Window.screenLeft')
   @DocsEditable()
-  int get screenLeft => _blink.BlinkWindow.instance.screenLeft_Getter_(unwrap_jso(this));
+  int get screenLeft => _blink.BlinkWindow.instance.screenLeft_Getter_(this);
   
   /**
    * The distance from the top of the screen to the top of this window.
@@ -42637,7 +39846,7 @@
    */
   @DomName('Window.screenTop')
   @DocsEditable()
-  int get screenTop => _blink.BlinkWindow.instance.screenTop_Getter_(unwrap_jso(this));
+  int get screenTop => _blink.BlinkWindow.instance.screenTop_Getter_(this);
   
   /**
    * The distance from the left side of the screen to the mouse pointer.
@@ -42649,7 +39858,7 @@
    */
   @DomName('Window.screenX')
   @DocsEditable()
-  int get screenX => _blink.BlinkWindow.instance.screenX_Getter_(unwrap_jso(this));
+  int get screenX => _blink.BlinkWindow.instance.screenX_Getter_(this);
   
   /**
    * The distance from the top of the screen to the mouse pointer.
@@ -42661,15 +39870,15 @@
    */
   @DomName('Window.screenY')
   @DocsEditable()
-  int get screenY => _blink.BlinkWindow.instance.screenY_Getter_(unwrap_jso(this));
+  int get screenY => _blink.BlinkWindow.instance.screenY_Getter_(this);
   
   @DomName('Window.scrollX')
   @DocsEditable()
-  num get _scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(unwrap_jso(this));
+  num get _scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(this);
   
   @DomName('Window.scrollY')
   @DocsEditable()
-  num get _scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(unwrap_jso(this));
+  num get _scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(this);
   
   /**
    * This window's scroll bars.
@@ -42682,7 +39891,7 @@
    */
   @DomName('Window.scrollbars')
   @DocsEditable()
-  BarProp get scrollbars => wrap_jso(_blink.BlinkWindow.instance.scrollbars_Getter_(unwrap_jso(this)));
+  BarProp get scrollbars => _blink.BlinkWindow.instance.scrollbars_Getter_(this);
   
   /**
    * The current window.
@@ -42694,7 +39903,7 @@
    */
   @DomName('Window.self')
   @DocsEditable()
-  WindowBase get self => wrap_jso(_blink.BlinkWindow.instance.self_Getter_(unwrap_jso(this)));
+  WindowBase get self => _blink.BlinkWindow.instance.self_Getter_(this);
   
   /**
    * Storage for this window that is cleared when this session ends.
@@ -42711,7 +39920,7 @@
    */
   @DomName('Window.sessionStorage')
   @DocsEditable()
-  Storage get sessionStorage => wrap_jso(_blink.BlinkWindow.instance.sessionStorage_Getter_(unwrap_jso(this)));
+  Storage get sessionStorage => _blink.BlinkWindow.instance.sessionStorage_Getter_(this);
   
   /**
    * Access to speech synthesis in the browser.
@@ -42726,17 +39935,17 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
   @Experimental()
-  SpeechSynthesis get speechSynthesis => wrap_jso(_blink.BlinkWindow.instance.speechSynthesis_Getter_(unwrap_jso(this)));
+  SpeechSynthesis get speechSynthesis => _blink.BlinkWindow.instance.speechSynthesis_Getter_(this);
   
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  String get status => _blink.BlinkWindow.instance.status_Getter_(unwrap_jso(this));
+  String get status => _blink.BlinkWindow.instance.status_Getter_(this);
   
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  set status(String value) => _blink.BlinkWindow.instance.status_Setter_(unwrap_jso(this), value);
+  set status(String value) => _blink.BlinkWindow.instance.status_Setter_(this, value);
   
   /**
    * This window's status bar.
@@ -42749,7 +39958,7 @@
    */
   @DomName('Window.statusbar')
   @DocsEditable()
-  BarProp get statusbar => wrap_jso(_blink.BlinkWindow.instance.statusbar_Getter_(unwrap_jso(this)));
+  BarProp get statusbar => _blink.BlinkWindow.instance.statusbar_Getter_(this);
   
   /**
    * Access to CSS media queries.
@@ -42764,7 +39973,7 @@
   @DocsEditable()
   // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
   @Experimental() // nonstandard
-  StyleMedia get styleMedia => wrap_jso(_blink.BlinkWindow.instance.styleMedia_Getter_(unwrap_jso(this)));
+  StyleMedia get styleMedia => _blink.BlinkWindow.instance.styleMedia_Getter_(this);
   
   /**
    * This window's tool bar.
@@ -42777,11 +39986,11 @@
    */
   @DomName('Window.toolbar')
   @DocsEditable()
-  BarProp get toolbar => wrap_jso(_blink.BlinkWindow.instance.toolbar_Getter_(unwrap_jso(this)));
+  BarProp get toolbar => _blink.BlinkWindow.instance.toolbar_Getter_(this);
   
   @DomName('Window.top')
   @DocsEditable()
-  WindowBase get top => wrap_jso(_blink.BlinkWindow.instance.top_Getter_(unwrap_jso(this)));
+  WindowBase get top => _blink.BlinkWindow.instance.top_Getter_(this);
   
   /**
    * The current window.
@@ -42793,47 +40002,47 @@
    */
   @DomName('Window.window')
   @DocsEditable()
-  WindowBase get window => wrap_jso(_blink.BlinkWindow.instance.window_Getter_(unwrap_jso(this)));
+  WindowBase get window => _blink.BlinkWindow.instance.window_Getter_(this);
   
   WindowBase __getter__(index_OR_name) {
     if ((index_OR_name is int)) {
-      return wrap_jso(_blink.BlinkWindow.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
+      return _blink.BlinkWindow.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String)) {
-      return wrap_jso(_blink.BlinkWindow.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
+      return _blink.BlinkWindow.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   void alert([String message]) {
     if (message != null) {
-      _blink.BlinkWindow.instance.alert_Callback_1_(unwrap_jso(this), message);
+      _blink.BlinkWindow.instance.alert_Callback_1_(this, message);
       return;
     }
-    _blink.BlinkWindow.instance.alert_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWindow.instance.alert_Callback_0_(this);
     return;
   }
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
-  void cancelAnimationFrame(int handle) => _blink.BlinkWindow.instance.cancelAnimationFrame_Callback_1_(unwrap_jso(this), handle);
+  void cancelAnimationFrame(int handle) => _blink.BlinkWindow.instance.cancelAnimationFrame_Callback_1_(this, handle);
   
   @DomName('Window.close')
   @DocsEditable()
-  void close() => _blink.BlinkWindow.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkWindow.instance.close_Callback_0_(this);
   
   bool confirm([String message]) {
     if (message != null) {
-      return _blink.BlinkWindow.instance.confirm_Callback_1_(unwrap_jso(this), message);
+      return _blink.BlinkWindow.instance.confirm_Callback_1_(this, message);
     }
-    return _blink.BlinkWindow.instance.confirm_Callback_0_(unwrap_jso(this));
+    return _blink.BlinkWindow.instance.confirm_Callback_0_(this);
   }
 
   Future fetch(/*RequestInfo*/ input, [Map init]) {
     if (init != null) {
-      return wrap_jso(_blink.BlinkWindow.instance.fetch_Callback_2_(unwrap_jso(this), input, convertDartToNative_Dictionary(init)));
+      return _blink.BlinkWindow.instance.fetch_Callback_2_(this, input, convertDartToNative_Dictionary(init));
     }
-    return wrap_jso(_blink.BlinkWindow.instance.fetch_Callback_1_(unwrap_jso(this), input));
+    return _blink.BlinkWindow.instance.fetch_Callback_1_(this, input);
   }
 
   /**
@@ -42847,11 +40056,11 @@
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.BlinkWindow.instance.find_Callback_7_(unwrap_jso(this), string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
+  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.BlinkWindow.instance.find_Callback_7_(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
   
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element elt, String pseudoElt) => wrap_jso(_blink.BlinkWindow.instance.getComputedStyle_Callback_2_(unwrap_jso(this), unwrap_jso(elt), pseudoElt));
+  CssStyleDeclaration _getComputedStyle(Element elt, String pseudoElt) => _blink.BlinkWindow.instance.getComputedStyle_Callback_2_(this, elt, pseudoElt);
   
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
@@ -42859,7 +40068,7 @@
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => wrap_jso(_blink.BlinkWindow.instance.getMatchedCSSRules_Callback_2_(unwrap_jso(this), unwrap_jso(element), pseudoElement));
+  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.BlinkWindow.instance.getMatchedCSSRules_Callback_2_(this, element, pseudoElement);
   
   /**
    * Returns the currently selected text.
@@ -42871,7 +40080,7 @@
    */
   @DomName('Window.getSelection')
   @DocsEditable()
-  Selection getSelection() => wrap_jso(_blink.BlinkWindow.instance.getSelection_Callback_0_(unwrap_jso(this)));
+  Selection getSelection() => _blink.BlinkWindow.instance.getSelection_Callback_0_(this);
   
   /**
    * Returns a list of media queries for the given query string.
@@ -42886,7 +40095,7 @@
    */
   @DomName('Window.matchMedia')
   @DocsEditable()
-  MediaQueryList matchMedia(String query) => wrap_jso(_blink.BlinkWindow.instance.matchMedia_Callback_1_(unwrap_jso(this), query));
+  MediaQueryList matchMedia(String query) => _blink.BlinkWindow.instance.matchMedia_Callback_1_(this, query);
   
   /**
    * Moves this window.
@@ -42901,26 +40110,26 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(int x, int y) => _blink.BlinkWindow.instance.moveBy_Callback_2_(unwrap_jso(this), x, y);
+  void moveBy(int x, int y) => _blink.BlinkWindow.instance.moveBy_Callback_2_(this, x, y);
   
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(int x, int y) => _blink.BlinkWindow.instance.moveTo_Callback_2_(unwrap_jso(this), x, y);
+  void _moveTo(int x, int y) => _blink.BlinkWindow.instance.moveTo_Callback_2_(this, x, y);
   
   @DomName('Window.open')
   @DocsEditable()
-  WindowBase open(String url, String target, [String features]) => wrap_jso(_blink.BlinkWindow.instance.open_Callback_3_(unwrap_jso(this), url, target, features));
+  WindowBase open(String url, String target, [String features]) => _blink.BlinkWindow.instance.open_Callback_3_(this, url, target, features);
   
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) {
     if (creationCallback != null) {
-      return wrap_jso(_blink.BlinkWindow.instance.openDatabase_Callback_5_(unwrap_jso(this), name, version, displayName, estimatedSize, unwrap_jso((database) => creationCallback(wrap_jso(database)))));
+      return _blink.BlinkWindow.instance.openDatabase_Callback_5_(this, name, version, displayName, estimatedSize, creationCallback);
     }
-    return wrap_jso(_blink.BlinkWindow.instance.openDatabase_Callback_4_(unwrap_jso(this), name, version, displayName, estimatedSize));
+    return _blink.BlinkWindow.instance.openDatabase_Callback_4_(this, name, version, displayName, estimatedSize);
   }
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(Object message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), targetOrigin, transfer);
+  void postMessage(Object message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(this, convertDartToNative_SerializedScriptValue(message), targetOrigin, transfer);
   
   /**
    * Opens the print dialog for this window.
@@ -42932,11 +40141,11 @@
    */
   @DomName('Window.print')
   @DocsEditable()
-  void print() => _blink.BlinkWindow.instance.print_Callback_0_(unwrap_jso(this));
+  void print() => _blink.BlinkWindow.instance.print_Callback_0_(this);
   
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
-  int _requestAnimationFrame(FrameRequestCallback callback) => _blink.BlinkWindow.instance.requestAnimationFrame_Callback_1_(unwrap_jso(this), unwrap_jso((highResTime) => callback(highResTime)));
+  int _requestAnimationFrame(FrameRequestCallback callback) => _blink.BlinkWindow.instance.requestAnimationFrame_Callback_1_(this, callback);
   
   /**
    * Resizes this window by an offset.
@@ -42948,7 +40157,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(int x, int y) => _blink.BlinkWindow.instance.resizeBy_Callback_2_(unwrap_jso(this), x, y);
+  void resizeBy(int x, int y) => _blink.BlinkWindow.instance.resizeBy_Callback_2_(this, x, y);
   
   /**
    * Resizes this window to a specific width and height.
@@ -42960,27 +40169,27 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(int x, int y) => _blink.BlinkWindow.instance.resizeTo_Callback_2_(unwrap_jso(this), x, y);
+  void resizeTo(int x, int y) => _blink.BlinkWindow.instance.resizeTo_Callback_2_(this, x, y);
   
   void scroll([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scroll_Callback_0_(unwrap_jso(this));
+      _blink.BlinkWindow.instance.scroll_Callback_0_(this);
       return;
     }
     if ((options_OR_x is Map) && y == null && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scroll_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      _blink.BlinkWindow.instance.scroll_Callback_1_(this, options_OR_x);
       return;
     }
     if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      _blink.BlinkWindow.instance.scroll_Callback_2_(this, options_OR_x, y);
       return;
     }
     if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scroll_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      _blink.BlinkWindow.instance.scroll_Callback_2_(this, options_OR_x, y);
       return;
     }
     if ((scrollOptions is Map) && (y is int) && (options_OR_x is int)) {
-      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+      _blink.BlinkWindow.instance.scroll_Callback_3_(this, options_OR_x, y, convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -42988,23 +40197,23 @@
 
   void scrollBy([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_0_(unwrap_jso(this));
+      _blink.BlinkWindow.instance.scrollBy_Callback_0_(this);
       return;
     }
     if ((options_OR_x is Map) && y == null && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      _blink.BlinkWindow.instance.scrollBy_Callback_1_(this, options_OR_x);
       return;
     }
     if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      _blink.BlinkWindow.instance.scrollBy_Callback_2_(this, options_OR_x, y);
       return;
     }
     if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      _blink.BlinkWindow.instance.scrollBy_Callback_2_(this, options_OR_x, y);
       return;
     }
     if ((scrollOptions is Map) && (y is int) && (options_OR_x is int)) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+      _blink.BlinkWindow.instance.scrollBy_Callback_3_(this, options_OR_x, y, convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -43012,23 +40221,23 @@
 
   void scrollTo([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_0_(unwrap_jso(this));
+      _blink.BlinkWindow.instance.scrollTo_Callback_0_(this);
       return;
     }
     if ((options_OR_x is Map) && y == null && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_1_(unwrap_jso(this), unwrap_jso(options_OR_x));
+      _blink.BlinkWindow.instance.scrollTo_Callback_1_(this, options_OR_x);
       return;
     }
     if ((y is num) && (options_OR_x is num) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      _blink.BlinkWindow.instance.scrollTo_Callback_2_(this, options_OR_x, y);
       return;
     }
     if ((y is int) && (options_OR_x is int) && scrollOptions == null) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_2_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y));
+      _blink.BlinkWindow.instance.scrollTo_Callback_2_(this, options_OR_x, y);
       return;
     }
     if ((scrollOptions is Map) && (y is int) && (options_OR_x is int)) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(options_OR_x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
+      _blink.BlinkWindow.instance.scrollTo_Callback_3_(this, options_OR_x, y, convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -43045,14 +40254,14 @@
    */
   @DomName('Window.stop')
   @DocsEditable()
-  void stop() => _blink.BlinkWindow.instance.stop_Callback_0_(unwrap_jso(this));
+  void stop() => _blink.BlinkWindow.instance.stop_Callback_0_(this);
   
   void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_4_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_4_(this, type, size, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_3_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))));
+    _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_3_(this, type, size, successCallback);
     return;
   }
 
@@ -43066,10 +40275,10 @@
 
   void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_3_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_3_(this, url, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_2_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
+    _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_2_(this, url, successCallback);
     return;
   }
 
@@ -43083,56 +40292,56 @@
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String atob) => _blink.BlinkWindow.instance.atob_Callback_1_(unwrap_jso(this), atob);
+  String atob(String atob) => _blink.BlinkWindow.instance.atob_Callback_1_(this, atob);
   
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String btoa) => _blink.BlinkWindow.instance.btoa_Callback_1_(unwrap_jso(this), btoa);
+  String btoa(String btoa) => _blink.BlinkWindow.instance.btoa_Callback_1_(this, btoa);
   
   int _setInterval_String(String handler, [int timeout, Object arguments]) {
     if (timeout != null) {
-      return _blink.BlinkWindow.instance.setInterval_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+      return _blink.BlinkWindow.instance.setInterval_Callback_3_(this, handler, timeout, arguments);
     }
-    return _blink.BlinkWindow.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindow.instance.setInterval_Callback_1_(this, handler);
   }
 
   int _setTimeout_String(String handler, [int timeout, Object arguments]) {
     if (timeout != null) {
-      return _blink.BlinkWindow.instance.setTimeout_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+      return _blink.BlinkWindow.instance.setTimeout_Callback_3_(this, handler, timeout, arguments);
     }
-    return _blink.BlinkWindow.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindow.instance.setTimeout_Callback_1_(this, handler);
   }
 
   void _clearInterval([int handle]) {
     if (handle != null) {
-      _blink.BlinkWindow.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
+      _blink.BlinkWindow.instance.clearInterval_Callback_1_(this, handle);
       return;
     }
-    _blink.BlinkWindow.instance.clearInterval_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWindow.instance.clearInterval_Callback_0_(this);
     return;
   }
 
   void _clearTimeout([int handle]) {
     if (handle != null) {
-      _blink.BlinkWindow.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
+      _blink.BlinkWindow.instance.clearTimeout_Callback_1_(this, handle);
       return;
     }
-    _blink.BlinkWindow.instance.clearTimeout_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWindow.instance.clearTimeout_Callback_0_(this);
     return;
   }
 
   int _setInterval(Object handler, [int timeout]) {
     if (timeout != null) {
-      return _blink.BlinkWindow.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
+      return _blink.BlinkWindow.instance.setInterval_Callback_2_(this, handler, timeout);
     }
-    return _blink.BlinkWindow.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindow.instance.setInterval_Callback_1_(this, handler);
   }
 
   int _setTimeout(Object handler, [int timeout]) {
     if (timeout != null) {
-      return _blink.BlinkWindow.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
+      return _blink.BlinkWindow.instance.setTimeout_Callback_2_(this, handler, timeout);
     }
-    return _blink.BlinkWindow.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindow.instance.setTimeout_Callback_1_(this, handler);
   }
 
   /// Stream of `contentloaded` events handled by this [Window].
@@ -43542,19 +40751,19 @@
 
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  int get pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(unwrap_jso(this)).round();
+  int get pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(this).round();
 
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  int get pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(unwrap_jso(this)).round();
+  int get pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(this).round();
 
   @DomName('Window.scrollX')
   @DocsEditable()
-  int get scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(unwrap_jso(this)).round();
+  int get scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(this).round();
 
   @DomName('Window.scrollY')
   @DocsEditable()
-  int get scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(unwrap_jso(this)).round();
+  int get scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(this).round();
 }
 
 
@@ -43623,11 +40832,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static WindowClient internalCreateWindowClient() {
-    return new WindowClient._internalWrap();
-  }
-
-  external factory WindowClient._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   WindowClient.internal_() : super.internal_();
@@ -43636,17 +40841,17 @@
   @DomName('WindowClient.focused')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get focused => _blink.BlinkWindowClient.instance.focused_Getter_(unwrap_jso(this));
+  bool get focused => _blink.BlinkWindowClient.instance.focused_Getter_(this);
   
   @DomName('WindowClient.visibilityState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get visibilityState => _blink.BlinkWindowClient.instance.visibilityState_Getter_(unwrap_jso(this));
+  String get visibilityState => _blink.BlinkWindowClient.instance.visibilityState_Getter_(this);
   
   @DomName('WindowClient.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  Future focus() => wrap_jso(_blink.BlinkWindowClient.instance.focus_Callback_0_(unwrap_jso(this)));
+  Future focus() => convertNativePromiseToDartFuture(_blink.BlinkWindowClient.instance.focus_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -43774,16 +40979,12 @@
   @DomName('Worker.Worker')
   @DocsEditable()
   factory Worker(String scriptUrl) {
-    return wrap_jso(_blink.BlinkWorker.instance.constructorCallback_1_(scriptUrl));
+    return _blink.BlinkWorker.instance.constructorCallback_1_(scriptUrl);
   }
 
 
   @Deprecated("Internal Use Only")
-  static Worker internalCreateWorker() {
-    return new Worker._internalWrap();
-  }
-
-  external factory Worker._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Worker.internal_() : super.internal_();
@@ -43794,16 +40995,16 @@
 
   void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) {
     if (transfer != null) {
-      _blink.BlinkWorker.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
+      _blink.BlinkWorker.instance.postMessage_Callback_2_(this, convertDartToNative_SerializedScriptValue(message), transfer);
       return;
     }
-    _blink.BlinkWorker.instance.postMessage_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message));
+    _blink.BlinkWorker.instance.postMessage_Callback_1_(this, convertDartToNative_SerializedScriptValue(message));
     return;
   }
 
   @DomName('Worker.terminate')
   @DocsEditable()
-  void terminate() => _blink.BlinkWorker.instance.terminate_Callback_0_(unwrap_jso(this));
+  void terminate() => _blink.BlinkWorker.instance.terminate_Callback_0_(this);
   
   /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
@@ -43833,11 +41034,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static WorkerConsole internalCreateWorkerConsole() {
-    return new WorkerConsole._internalWrap();
-  }
-
-  external factory WorkerConsole._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   WorkerConsole.internal_() : super.internal_();
@@ -43871,11 +41068,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static WorkerGlobalScope internalCreateWorkerGlobalScope() {
-    return new WorkerGlobalScope._internalWrap();
-  }
-
-  external factory WorkerGlobalScope._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   WorkerGlobalScope.internal_() : super.internal_();
@@ -43894,70 +41087,70 @@
   @DomName('WorkerGlobalScope.caches')
   @DocsEditable()
   @Experimental() // untriaged
-  CacheStorage get caches => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.caches_Getter_(unwrap_jso(this)));
+  CacheStorage get caches => _blink.BlinkWorkerGlobalScope.instance.caches_Getter_(this);
   
   @DomName('WorkerGlobalScope.console')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerConsole get console => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.console_Getter_(unwrap_jso(this)));
+  WorkerConsole get console => _blink.BlinkWorkerGlobalScope.instance.console_Getter_(this);
   
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
-  Crypto get crypto => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.crypto_Getter_(unwrap_jso(this)));
+  Crypto get crypto => _blink.BlinkWorkerGlobalScope.instance.crypto_Getter_(this);
   
   @DomName('WorkerGlobalScope.indexedDB')
   @DocsEditable()
   @Experimental() // untriaged
-  IdbFactory get indexedDB => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.indexedDB_Getter_(unwrap_jso(this)));
+  IdbFactory get indexedDB => _blink.BlinkWorkerGlobalScope.instance.indexedDB_Getter_(this);
   
   @DomName('WorkerGlobalScope.location')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerLocation get location => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.location_Getter_(unwrap_jso(this)));
+  _WorkerLocation get location => _blink.BlinkWorkerGlobalScope.instance.location_Getter_(this);
   
   @DomName('WorkerGlobalScope.navigator')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerNavigator get navigator => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.navigator_Getter_(unwrap_jso(this)));
+  _WorkerNavigator get navigator => _blink.BlinkWorkerGlobalScope.instance.navigator_Getter_(this);
   
   @DomName('WorkerGlobalScope.performance')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerPerformance get performance => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.performance_Getter_(unwrap_jso(this)));
+  WorkerPerformance get performance => _blink.BlinkWorkerGlobalScope.instance.performance_Getter_(this);
   
   @DomName('WorkerGlobalScope.self')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerGlobalScope get self => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.self_Getter_(unwrap_jso(this)));
+  WorkerGlobalScope get self => _blink.BlinkWorkerGlobalScope.instance.self_Getter_(this);
   
   @DomName('WorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.BlinkWorkerGlobalScope.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkWorkerGlobalScope.instance.close_Callback_0_(this);
   
   Future fetch(/*RequestInfo*/ input, [Map init]) {
     if (init != null) {
-      return wrap_jso(_blink.BlinkWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), input, convertDartToNative_Dictionary(init)));
+      return _blink.BlinkWorkerGlobalScope.instance.fetch_Callback_2_(this, input, convertDartToNative_Dictionary(init));
     }
-    return wrap_jso(_blink.BlinkWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), input));
+    return _blink.BlinkWorkerGlobalScope.instance.fetch_Callback_1_(this, input);
   }
 
   @DomName('WorkerGlobalScope.importScripts')
   @DocsEditable()
   @Experimental() // untriaged
-  void importScripts(String urls) => _blink.BlinkWorkerGlobalScope.instance.importScripts_Callback_1_(unwrap_jso(this), urls);
+  void importScripts(String urls) => _blink.BlinkWorkerGlobalScope.instance.importScripts_Callback_1_(this, urls);
   
   void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_4_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_4_(this, type, size, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_3_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))));
+      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_3_(this, type, size, successCallback);
       return;
     }
-    _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_2_(unwrap_jso(this), type, size);
+    _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_2_(this, type, size);
     return;
   }
 
@@ -43975,7 +41168,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _DOMFileSystemSync requestFileSystemSync(int type, int size) => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystemSync_Callback_2_(unwrap_jso(this), type, size));
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystemSync_Callback_2_(this, type, size);
   
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
   @DocsEditable()
@@ -43983,14 +41176,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _EntrySync resolveLocalFileSystemSyncUrl(String url) => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemSyncURL_Callback_1_(unwrap_jso(this), url));
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemSyncURL_Callback_1_(this, url);
   
   void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_3_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_3_(this, url, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_2_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
+    _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_2_(this, url, successCallback);
     return;
   }
 
@@ -44005,57 +41198,57 @@
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String atob) => _blink.BlinkWorkerGlobalScope.instance.atob_Callback_1_(unwrap_jso(this), atob);
+  String atob(String atob) => _blink.BlinkWorkerGlobalScope.instance.atob_Callback_1_(this, atob);
   
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String btoa) => _blink.BlinkWorkerGlobalScope.instance.btoa_Callback_1_(unwrap_jso(this), btoa);
+  String btoa(String btoa) => _blink.BlinkWorkerGlobalScope.instance.btoa_Callback_1_(this, btoa);
   
   int _setInterval_String(String handler, [int timeout, Object arguments]) {
     if (timeout != null) {
-      return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+      return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_3_(this, handler, timeout, arguments);
     }
-    return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_1_(this, handler);
   }
 
   int _setTimeout_String(String handler, [int timeout, Object arguments]) {
     if (timeout != null) {
-      return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+      return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_3_(this, handler, timeout, arguments);
     }
-    return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_1_(this, handler);
   }
 
   void _clearInterval([int handle]) {
     if (handle != null) {
-      _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
+      _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_1_(this, handle);
       return;
     }
-    _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_0_(this);
     return;
   }
 
   void _clearTimeout([int handle]) {
     if (handle != null) {
-      _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
+      _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_1_(this, handle);
       return;
     }
-    _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_0_(this);
     return;
   }
 
   int _setInterval(Object handler, [int timeout]) {
     if (timeout != null) {
-      return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
+      return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_2_(this, handler, timeout);
     }
-    return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_1_(this, handler);
   }
 
   int _setTimeout(Object handler, [int timeout]) {
     if (timeout != null) {
-      return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
+      return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_2_(this, handler, timeout);
     }
-    return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_1_(this, handler);
   }
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
@@ -44081,11 +41274,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static WorkerPerformance internalCreateWorkerPerformance() {
-    return new WorkerPerformance._internalWrap();
-  }
-
-  external factory WorkerPerformance._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   WorkerPerformance.internal_() : super.internal_();
@@ -44094,47 +41283,47 @@
   @DomName('WorkerPerformance.memory')
   @DocsEditable()
   @Experimental() // untriaged
-  MemoryInfo get memory => wrap_jso(_blink.BlinkWorkerPerformance.instance.memory_Getter_(unwrap_jso(this)));
+  MemoryInfo get memory => _blink.BlinkWorkerPerformance.instance.memory_Getter_(this);
   
   @DomName('WorkerPerformance.clearMarks')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearMarks(String markName) => _blink.BlinkWorkerPerformance.instance.clearMarks_Callback_1_(unwrap_jso(this), markName);
+  void clearMarks(String markName) => _blink.BlinkWorkerPerformance.instance.clearMarks_Callback_1_(this, markName);
   
   @DomName('WorkerPerformance.clearMeasures')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearMeasures(String measureName) => _blink.BlinkWorkerPerformance.instance.clearMeasures_Callback_1_(unwrap_jso(this), measureName);
+  void clearMeasures(String measureName) => _blink.BlinkWorkerPerformance.instance.clearMeasures_Callback_1_(this, measureName);
   
   @DomName('WorkerPerformance.getEntries')
   @DocsEditable()
   @Experimental() // untriaged
-  List<PerformanceEntry> getEntries() => wrap_jso(_blink.BlinkWorkerPerformance.instance.getEntries_Callback_0_(unwrap_jso(this)));
+  List<PerformanceEntry> getEntries() => (_blink.BlinkWorkerPerformance.instance.getEntries_Callback_0_(this));
   
   @DomName('WorkerPerformance.getEntriesByName')
   @DocsEditable()
   @Experimental() // untriaged
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) => wrap_jso(_blink.BlinkWorkerPerformance.instance.getEntriesByName_Callback_2_(unwrap_jso(this), name, entryType));
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => (_blink.BlinkWorkerPerformance.instance.getEntriesByName_Callback_2_(this, name, entryType));
   
   @DomName('WorkerPerformance.getEntriesByType')
   @DocsEditable()
   @Experimental() // untriaged
-  List<PerformanceEntry> getEntriesByType(String entryType) => wrap_jso(_blink.BlinkWorkerPerformance.instance.getEntriesByType_Callback_1_(unwrap_jso(this), entryType));
+  List<PerformanceEntry> getEntriesByType(String entryType) => (_blink.BlinkWorkerPerformance.instance.getEntriesByType_Callback_1_(this, entryType));
   
   @DomName('WorkerPerformance.mark')
   @DocsEditable()
   @Experimental() // untriaged
-  void mark(String markName) => _blink.BlinkWorkerPerformance.instance.mark_Callback_1_(unwrap_jso(this), markName);
+  void mark(String markName) => _blink.BlinkWorkerPerformance.instance.mark_Callback_1_(this, markName);
   
   @DomName('WorkerPerformance.measure')
   @DocsEditable()
   @Experimental() // untriaged
-  void measure(String measureName, String startMark, String endMark) => _blink.BlinkWorkerPerformance.instance.measure_Callback_3_(unwrap_jso(this), measureName, startMark, endMark);
+  void measure(String measureName, String startMark, String endMark) => _blink.BlinkWorkerPerformance.instance.measure_Callback_3_(this, measureName, startMark, endMark);
   
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  num now() => _blink.BlinkWorkerPerformance.instance.now_Callback_0_(unwrap_jso(this));
+  num now() => _blink.BlinkWorkerPerformance.instance.now_Callback_0_(this);
   
   @DomName('WorkerPerformance.webkitClearResourceTimings')
   @DocsEditable()
@@ -44142,7 +41331,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  void clearResourceTimings() => _blink.BlinkWorkerPerformance.instance.webkitClearResourceTimings_Callback_0_(unwrap_jso(this));
+  void clearResourceTimings() => _blink.BlinkWorkerPerformance.instance.webkitClearResourceTimings_Callback_0_(this);
   
   @DomName('WorkerPerformance.webkitSetResourceTimingBufferSize')
   @DocsEditable()
@@ -44150,7 +41339,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkWorkerPerformance.instance.webkitSetResourceTimingBufferSize_Callback_1_(unwrap_jso(this), maxSize);
+  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkWorkerPerformance.instance.webkitSetResourceTimingBufferSize_Callback_1_(this, maxSize);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44171,37 +41360,29 @@
   @DomName('XPathEvaluator.XPathEvaluator')
   @DocsEditable()
   factory XPathEvaluator() {
-    return wrap_jso(_blink.BlinkXPathEvaluator.instance.constructorCallback_0_());
+    return _blink.BlinkXPathEvaluator.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static XPathEvaluator internalCreateXPathEvaluator() {
-    return new XPathEvaluator._internalWrap();
-  }
-
-  factory XPathEvaluator._internalWrap() {
-    return new XPathEvaluator.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   XPathEvaluator.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
-  XPathExpression createExpression(String expression, XPathNSResolver resolver) => wrap_jso(_blink.BlinkXPathEvaluator.instance.createExpression_Callback_2_(unwrap_jso(this), expression, unwrap_jso(resolver)));
+  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.BlinkXPathEvaluator.instance.createExpression_Callback_2_(this, expression, resolver);
   
   @DomName('XPathEvaluator.createNSResolver')
   @DocsEditable()
-  XPathNSResolver createNSResolver(Node nodeResolver) => wrap_jso(_blink.BlinkXPathEvaluator.instance.createNSResolver_Callback_1_(unwrap_jso(this), unwrap_jso(nodeResolver)));
+  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.BlinkXPathEvaluator.instance.createNSResolver_Callback_1_(this, nodeResolver);
   
   XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, [int type, Object inResult]) {
     if (type != null) {
-      return wrap_jso(_blink.BlinkXPathEvaluator.instance.evaluate_Callback_5_(unwrap_jso(this), expression, unwrap_jso(contextNode), unwrap_jso(resolver), type, inResult));
+      return _blink.BlinkXPathEvaluator.instance.evaluate_Callback_5_(this, expression, contextNode, resolver, type, inResult);
     }
-    return wrap_jso(_blink.BlinkXPathEvaluator.instance.evaluate_Callback_3_(unwrap_jso(this), expression, unwrap_jso(contextNode), unwrap_jso(resolver)));
+    return _blink.BlinkXPathEvaluator.instance.evaluate_Callback_3_(this, expression, contextNode, resolver);
   }
 
 }
@@ -44220,26 +41401,18 @@
   // To suppress missing implicit constructor warnings.
   factory XPathExpression._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static XPathExpression internalCreateXPathExpression() {
-    return new XPathExpression._internalWrap();
-  }
 
-  factory XPathExpression._internalWrap() {
-    return new XPathExpression.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   XPathExpression.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   XPathResult evaluate(Node contextNode, [int type, Object inResult]) {
     if (type != null) {
-      return wrap_jso(_blink.BlinkXPathExpression.instance.evaluate_Callback_3_(unwrap_jso(this), unwrap_jso(contextNode), type, inResult));
+      return _blink.BlinkXPathExpression.instance.evaluate_Callback_3_(this, contextNode, type, inResult);
     }
-    return wrap_jso(_blink.BlinkXPathExpression.instance.evaluate_Callback_1_(unwrap_jso(this), unwrap_jso(contextNode)));
+    return _blink.BlinkXPathExpression.instance.evaluate_Callback_1_(this, contextNode);
   }
 
 }
@@ -44258,24 +41431,16 @@
   // To suppress missing implicit constructor warnings.
   factory XPathNSResolver._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static XPathNSResolver internalCreateXPathNSResolver() {
-    return new XPathNSResolver._internalWrap();
-  }
 
-  factory XPathNSResolver._internalWrap() {
-    return new XPathNSResolver.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   XPathNSResolver.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('XPathNSResolver.lookupNamespaceURI')
   @DocsEditable()
-  String lookupNamespaceUri(String prefix) => _blink.BlinkXPathNSResolver.instance.lookupNamespaceURI_Callback_1_(unwrap_jso(this), prefix);
+  String lookupNamespaceUri(String prefix) => _blink.BlinkXPathNSResolver.instance.lookupNamespaceURI_Callback_1_(this, prefix);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44293,21 +41458,13 @@
   // To suppress missing implicit constructor warnings.
   factory XPathResult._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static XPathResult internalCreateXPathResult() {
-    return new XPathResult._internalWrap();
-  }
 
-  factory XPathResult._internalWrap() {
-    return new XPathResult.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   XPathResult.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('XPathResult.ANY_TYPE')
   @DocsEditable()
   static const int ANY_TYPE = 0;
@@ -44350,39 +41507,39 @@
 
   @DomName('XPathResult.booleanValue')
   @DocsEditable()
-  bool get booleanValue => _blink.BlinkXPathResult.instance.booleanValue_Getter_(unwrap_jso(this));
+  bool get booleanValue => _blink.BlinkXPathResult.instance.booleanValue_Getter_(this);
   
   @DomName('XPathResult.invalidIteratorState')
   @DocsEditable()
-  bool get invalidIteratorState => _blink.BlinkXPathResult.instance.invalidIteratorState_Getter_(unwrap_jso(this));
+  bool get invalidIteratorState => _blink.BlinkXPathResult.instance.invalidIteratorState_Getter_(this);
   
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  num get numberValue => _blink.BlinkXPathResult.instance.numberValue_Getter_(unwrap_jso(this));
+  num get numberValue => _blink.BlinkXPathResult.instance.numberValue_Getter_(this);
   
   @DomName('XPathResult.resultType')
   @DocsEditable()
-  int get resultType => _blink.BlinkXPathResult.instance.resultType_Getter_(unwrap_jso(this));
+  int get resultType => _blink.BlinkXPathResult.instance.resultType_Getter_(this);
   
   @DomName('XPathResult.singleNodeValue')
   @DocsEditable()
-  Node get singleNodeValue => wrap_jso(_blink.BlinkXPathResult.instance.singleNodeValue_Getter_(unwrap_jso(this)));
+  Node get singleNodeValue => _blink.BlinkXPathResult.instance.singleNodeValue_Getter_(this);
   
   @DomName('XPathResult.snapshotLength')
   @DocsEditable()
-  int get snapshotLength => _blink.BlinkXPathResult.instance.snapshotLength_Getter_(unwrap_jso(this));
+  int get snapshotLength => _blink.BlinkXPathResult.instance.snapshotLength_Getter_(this);
   
   @DomName('XPathResult.stringValue')
   @DocsEditable()
-  String get stringValue => _blink.BlinkXPathResult.instance.stringValue_Getter_(unwrap_jso(this));
+  String get stringValue => _blink.BlinkXPathResult.instance.stringValue_Getter_(this);
   
   @DomName('XPathResult.iterateNext')
   @DocsEditable()
-  Node iterateNext() => wrap_jso(_blink.BlinkXPathResult.instance.iterateNext_Callback_0_(unwrap_jso(this)));
+  Node iterateNext() => _blink.BlinkXPathResult.instance.iterateNext_Callback_0_(this);
   
   @DomName('XPathResult.snapshotItem')
   @DocsEditable()
-  Node snapshotItem(int index) => wrap_jso(_blink.BlinkXPathResult.instance.snapshotItem_Callback_1_(unwrap_jso(this), index));
+  Node snapshotItem(int index) => _blink.BlinkXPathResult.instance.snapshotItem_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44401,11 +41558,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static XmlDocument internalCreateXmlDocument() {
-    return new XmlDocument._internalWrap();
-  }
-
-  external factory XmlDocument._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   XmlDocument.internal_() : super.internal_();
@@ -44430,27 +41583,19 @@
   @DomName('XMLSerializer.XMLSerializer')
   @DocsEditable()
   factory XmlSerializer() {
-    return wrap_jso(_blink.BlinkXMLSerializer.instance.constructorCallback_0_());
+    return _blink.BlinkXMLSerializer.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static XmlSerializer internalCreateXmlSerializer() {
-    return new XmlSerializer._internalWrap();
-  }
-
-  factory XmlSerializer._internalWrap() {
-    return new XmlSerializer.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   XmlSerializer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node root) => _blink.BlinkXMLSerializer.instance.serializeToString_Callback_1_(unwrap_jso(this), unwrap_jso(root));
+  String serializeToString(Node root) => _blink.BlinkXMLSerializer.instance.serializeToString_Callback_1_(this, root);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44473,58 +41618,50 @@
   @DomName('XSLTProcessor.XSLTProcessor')
   @DocsEditable()
   factory XsltProcessor() {
-    return wrap_jso(_blink.BlinkXSLTProcessor.instance.constructorCallback_0_());
+    return _blink.BlinkXSLTProcessor.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static XsltProcessor internalCreateXsltProcessor() {
-    return new XsltProcessor._internalWrap();
-  }
-
-  factory XsltProcessor._internalWrap() {
-    return new XsltProcessor.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   XsltProcessor.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('XSLTProcessor.clearParameters')
   @DocsEditable()
-  void clearParameters() => _blink.BlinkXSLTProcessor.instance.clearParameters_Callback_0_(unwrap_jso(this));
+  void clearParameters() => _blink.BlinkXSLTProcessor.instance.clearParameters_Callback_0_(this);
   
   @DomName('XSLTProcessor.getParameter')
   @DocsEditable()
-  String getParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.instance.getParameter_Callback_2_(unwrap_jso(this), namespaceURI, localName);
+  String getParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.instance.getParameter_Callback_2_(this, namespaceURI, localName);
   
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node style) => _blink.BlinkXSLTProcessor.instance.importStylesheet_Callback_1_(unwrap_jso(this), unwrap_jso(style));
+  void importStylesheet(Node style) => _blink.BlinkXSLTProcessor.instance.importStylesheet_Callback_1_(this, style);
   
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
-  void removeParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.instance.removeParameter_Callback_2_(unwrap_jso(this), namespaceURI, localName);
+  void removeParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.instance.removeParameter_Callback_2_(this, namespaceURI, localName);
   
   @DomName('XSLTProcessor.reset')
   @DocsEditable()
-  void reset() => _blink.BlinkXSLTProcessor.instance.reset_Callback_0_(unwrap_jso(this));
+  void reset() => _blink.BlinkXSLTProcessor.instance.reset_Callback_0_(this);
   
   @DomName('XSLTProcessor.setParameter')
   @DocsEditable()
-  void setParameter(String namespaceURI, String localName, String value) => _blink.BlinkXSLTProcessor.instance.setParameter_Callback_3_(unwrap_jso(this), namespaceURI, localName, value);
+  void setParameter(String namespaceURI, String localName, String value) => _blink.BlinkXSLTProcessor.instance.setParameter_Callback_3_(this, namespaceURI, localName, value);
   
   @DomName('XSLTProcessor.transformToDocument')
   @DocsEditable()
-  Document transformToDocument(Node source) => wrap_jso(_blink.BlinkXSLTProcessor.instance.transformToDocument_Callback_1_(unwrap_jso(this), unwrap_jso(source)));
+  Document transformToDocument(Node source) => _blink.BlinkXSLTProcessor.instance.transformToDocument_Callback_1_(this, source);
   
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document output) => wrap_jso(_blink.BlinkXSLTProcessor.instance.transformToFragment_Callback_2_(unwrap_jso(this), unwrap_jso(source), unwrap_jso(output)));
+  DocumentFragment transformToFragment(Node source, Document output) => _blink.BlinkXSLTProcessor.instance.transformToFragment_Callback_2_(this, source, output);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44542,11 +41679,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _Attr internalCreate_Attr() {
-    return new _Attr._internalWrap();
-  }
-
-  external factory _Attr._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _Attr.internal_() : super.internal_();
@@ -44555,39 +41688,39 @@
   @DomName('Attr.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.BlinkAttr.instance.localName_Getter_(unwrap_jso(this));
+  String get _localName => _blink.BlinkAttr.instance.localName_Getter_(this);
   
   @DomName('Attr.name')
   @DocsEditable()
-  String get name => _blink.BlinkAttr.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkAttr.instance.name_Getter_(this);
   
   @DomName('Attr.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.BlinkAttr.instance.namespaceURI_Getter_(unwrap_jso(this));
+  String get _namespaceUri => _blink.BlinkAttr.instance.namespaceURI_Getter_(this);
   
   @DomName('Attr.nodeValue')
   @DocsEditable()
   @Experimental() // untriaged
-  String get nodeValue => _blink.BlinkAttr.instance.nodeValue_Getter_(unwrap_jso(this));
+  String get nodeValue => _blink.BlinkAttr.instance.nodeValue_Getter_(this);
   
   @DomName('Attr.textContent')
   @DocsEditable()
   @Experimental() // untriaged
-  String get text => _blink.BlinkAttr.instance.textContent_Getter_(unwrap_jso(this));
+  String get text => _blink.BlinkAttr.instance.textContent_Getter_(this);
   
   @DomName('Attr.textContent')
   @DocsEditable()
   @Experimental() // untriaged
-  set text(String value) => _blink.BlinkAttr.instance.textContent_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkAttr.instance.textContent_Setter_(this, value);
   
   @DomName('Attr.value')
   @DocsEditable()
-  String get value => _blink.BlinkAttr.instance.value_Getter_(unwrap_jso(this));
+  String get value => _blink.BlinkAttr.instance.value_Getter_(this);
   
   @DomName('Attr.value')
   @DocsEditable()
-  set value(String value) => _blink.BlinkAttr.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkAttr.instance.value_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44604,21 +41737,13 @@
   // To suppress missing implicit constructor warnings.
   factory _Cache._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _Cache internalCreate_Cache() {
-    return new _Cache._internalWrap();
-  }
 
-  factory _Cache._internalWrap() {
-    return new _Cache.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _Cache.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -44736,42 +41861,36 @@
     // To suppress missing implicit constructor warnings.
   factory _ClientRect._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _ClientRect internalCreate_ClientRect() {
-    return new _ClientRect._internalWrap();
-  }
 
-  factory _ClientRect._internalWrap() {
-    return new _ClientRect.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _ClientRect.internal_() { }
 
-
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  num get bottom => _blink.BlinkClientRect.instance.bottom_Getter_(unwrap_jso(this));
+  num get bottom => _blink.BlinkClientRect.instance.bottom_Getter_(this);
   
   @DomName('ClientRect.height')
   @DocsEditable()
-  num get height => _blink.BlinkClientRect.instance.height_Getter_(unwrap_jso(this));
+  num get height => _blink.BlinkClientRect.instance.height_Getter_(this);
   
   @DomName('ClientRect.left')
   @DocsEditable()
-  num get left => _blink.BlinkClientRect.instance.left_Getter_(unwrap_jso(this));
+  num get left => _blink.BlinkClientRect.instance.left_Getter_(this);
   
   @DomName('ClientRect.right')
   @DocsEditable()
-  num get right => _blink.BlinkClientRect.instance.right_Getter_(unwrap_jso(this));
+  num get right => _blink.BlinkClientRect.instance.right_Getter_(this);
   
   @DomName('ClientRect.top')
   @DocsEditable()
-  num get top => _blink.BlinkClientRect.instance.top_Getter_(unwrap_jso(this));
+  num get top => _blink.BlinkClientRect.instance.top_Getter_(this);
   
   @DomName('ClientRect.width')
   @DocsEditable()
-  num get width => _blink.BlinkClientRect.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkClientRect.instance.width_Getter_(this);
   }
 
 /**
@@ -44823,32 +41942,24 @@
   // To suppress missing implicit constructor warnings.
   factory _ClientRectList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _ClientRectList internalCreate_ClientRectList() {
-    return new _ClientRectList._internalWrap();
-  }
 
-  factory _ClientRectList._internalWrap() {
-    return new _ClientRectList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _ClientRectList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ClientRectList.length')
   @DocsEditable()
-  int get length => _blink.BlinkClientRectList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkClientRectList.instance.length_Getter_(this);
   
   Rectangle operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkClientRectList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Rectangle _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkClientRectList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Rectangle _nativeIndexedGetter(int index) => (_blink.BlinkClientRectList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -44891,11 +42002,11 @@
   @DomName('ClientRectList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  Rectangle __getter__(int index) => make_dart_rectangle(_blink.BlinkClientRectList.instance.$__getter___Callback_1_(unwrap_jso(this), index));
+  Rectangle __getter__(int index) => make_dart_rectangle(_blink.BlinkClientRectList.instance.$__getter___Callback_1_(this, index));
   
   @DomName('ClientRectList.item')
   @DocsEditable()
-  Rectangle item(int index) => make_dart_rectangle(_blink.BlinkClientRectList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Rectangle item(int index) => make_dart_rectangle(_blink.BlinkClientRectList.instance.item_Callback_1_(this, index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44911,32 +42022,24 @@
   // To suppress missing implicit constructor warnings.
   factory _CssRuleList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _CssRuleList internalCreate_CssRuleList() {
-    return new _CssRuleList._internalWrap();
-  }
 
-  factory _CssRuleList._internalWrap() {
-    return new _CssRuleList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _CssRuleList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CSSRuleList.length')
   @DocsEditable()
-  int get length => _blink.BlinkCSSRuleList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkCSSRuleList.instance.length_Getter_(this);
   
   CssRule operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkCSSRuleList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  CssRule _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkCSSRuleList.instance.item_Callback_1_(unwrap_jso(this), index));
+  CssRule _nativeIndexedGetter(int index) => (_blink.BlinkCSSRuleList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, CssRule value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -44978,7 +42081,7 @@
 
   @DomName('CSSRuleList.item')
   @DocsEditable()
-  CssRule item(int index) => wrap_jso(_blink.BlinkCSSRuleList.instance.item_Callback_1_(unwrap_jso(this), index));
+  CssRule item(int index) => _blink.BlinkCSSRuleList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -44997,21 +42100,13 @@
   // To suppress missing implicit constructor warnings.
   factory _DOMFileSystemSync._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _DOMFileSystemSync internalCreate_DOMFileSystemSync() {
-    return new _DOMFileSystemSync._internalWrap();
-  }
 
-  factory _DOMFileSystemSync._internalWrap() {
-    return new _DOMFileSystemSync.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _DOMFileSystemSync.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -45030,11 +42125,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _DirectoryEntrySync internalCreate_DirectoryEntrySync() {
-    return new _DirectoryEntrySync._internalWrap();
-  }
-
-  external factory _DirectoryEntrySync._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _DirectoryEntrySync.internal_() : super.internal_();
@@ -45056,21 +42147,13 @@
   // To suppress missing implicit constructor warnings.
   factory _DirectoryReaderSync._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _DirectoryReaderSync internalCreate_DirectoryReaderSync() {
-    return new _DirectoryReaderSync._internalWrap();
-  }
 
-  factory _DirectoryReaderSync._internalWrap() {
-    return new _DirectoryReaderSync.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _DirectoryReaderSync.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -45087,19 +42170,15 @@
 
 
   @Deprecated("Internal Use Only")
-  static _DocumentType internalCreate_DocumentType() {
-    return new _DocumentType._internalWrap();
-  }
-
-  external factory _DocumentType._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _DocumentType.internal_() : super.internal_();
 
 
   // Override this methods for Dartium _DocumentType can't be abstract.
-  Element get nextElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.nextElementSibling_Getter_(unwrap_jso(this)));
-  Element get previousElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.previousElementSibling_Getter_(unwrap_jso(this)));
+  Element get nextElementSibling => _blink.BlinkDocumentType.instance.nextElementSibling_Getter_(this);
+  Element get previousElementSibling => _blink.BlinkDocumentType.instance.previousElementSibling_Getter_(this);
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -45120,27 +42199,23 @@
   @DocsEditable()
   factory _DomRect([num x, num y, num width, num height]) {
     if (height != null) {
-      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_4_(x, y, width, height));
+      return _blink.BlinkDOMRect.instance.constructorCallback_4_(x, y, width, height);
     }
     if (width != null) {
-      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_3_(x, y, width));
+      return _blink.BlinkDOMRect.instance.constructorCallback_3_(x, y, width);
     }
     if (y != null) {
-      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_2_(x, y));
+      return _blink.BlinkDOMRect.instance.constructorCallback_2_(x, y);
     }
     if (x != null) {
-      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_1_(x));
+      return _blink.BlinkDOMRect.instance.constructorCallback_1_(x);
     }
-    return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_0_());
+    return _blink.BlinkDOMRect.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static _DomRect internalCreate_DomRect() {
-    return new _DomRect._internalWrap();
-  }
-
-  external factory _DomRect._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _DomRect.internal_() : super.internal_();
@@ -45149,42 +42224,42 @@
   @DomName('DOMRect.height')
   @DocsEditable()
   @Experimental() // untriaged
-  num get height => _blink.BlinkDOMRect.instance.height_Getter_(unwrap_jso(this));
+  num get height => _blink.BlinkDOMRect.instance.height_Getter_(this);
   
   @DomName('DOMRect.height')
   @DocsEditable()
   @Experimental() // untriaged
-  set height(num value) => _blink.BlinkDOMRect.instance.height_Setter_(unwrap_jso(this), value);
+  set height(num value) => _blink.BlinkDOMRect.instance.height_Setter_(this, value);
   
   @DomName('DOMRect.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.BlinkDOMRect.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkDOMRect.instance.width_Getter_(this);
   
   @DomName('DOMRect.width')
   @DocsEditable()
   @Experimental() // untriaged
-  set width(num value) => _blink.BlinkDOMRect.instance.width_Setter_(unwrap_jso(this), value);
+  set width(num value) => _blink.BlinkDOMRect.instance.width_Setter_(this, value);
   
   @DomName('DOMRect.x')
   @DocsEditable()
   @Experimental() // untriaged
-  num get x => _blink.BlinkDOMRect.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDOMRect.instance.x_Getter_(this);
   
   @DomName('DOMRect.x')
   @DocsEditable()
   @Experimental() // untriaged
-  set x(num value) => _blink.BlinkDOMRect.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkDOMRect.instance.x_Setter_(this, value);
   
   @DomName('DOMRect.y')
   @DocsEditable()
   @Experimental() // untriaged
-  num get y => _blink.BlinkDOMRect.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDOMRect.instance.y_Getter_(this);
   
   @DomName('DOMRect.y')
   @DocsEditable()
   @Experimental() // untriaged
-  set y(num value) => _blink.BlinkDOMRect.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkDOMRect.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -45202,21 +42277,13 @@
   // To suppress missing implicit constructor warnings.
   factory _EntrySync._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _EntrySync internalCreate_EntrySync() {
-    return new _EntrySync._internalWrap();
-  }
 
-  factory _EntrySync._internalWrap() {
-    return new _EntrySync.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _EntrySync.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -45235,11 +42302,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _FileEntrySync internalCreate_FileEntrySync() {
-    return new _FileEntrySync._internalWrap();
-  }
-
-  external factory _FileEntrySync._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _FileEntrySync.internal_() : super.internal_();
@@ -45264,24 +42327,16 @@
   @DomName('FileReaderSync.FileReaderSync')
   @DocsEditable()
   factory _FileReaderSync() {
-    return wrap_jso(_blink.BlinkFileReaderSync.instance.constructorCallback_0_());
+    return _blink.BlinkFileReaderSync.instance.constructorCallback_0_();
   }
 
+
   @Deprecated("Internal Use Only")
-  static _FileReaderSync internalCreate_FileReaderSync() {
-    return new _FileReaderSync._internalWrap();
-  }
-
-  factory _FileReaderSync._internalWrap() {
-    return new _FileReaderSync.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _FileReaderSync.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -45298,21 +42353,13 @@
   // To suppress missing implicit constructor warnings.
   factory _FileWriterSync._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _FileWriterSync internalCreate_FileWriterSync() {
-    return new _FileWriterSync._internalWrap();
-  }
 
-  factory _FileWriterSync._internalWrap() {
-    return new _FileWriterSync.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _FileWriterSync.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -45329,32 +42376,24 @@
   // To suppress missing implicit constructor warnings.
   factory _GamepadList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _GamepadList internalCreate_GamepadList() {
-    return new _GamepadList._internalWrap();
-  }
 
-  factory _GamepadList._internalWrap() {
-    return new _GamepadList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _GamepadList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('GamepadList.length')
   @DocsEditable()
-  int get length => _blink.BlinkGamepadList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkGamepadList.instance.length_Getter_(this);
   
   Gamepad operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkGamepadList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Gamepad _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkGamepadList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Gamepad _nativeIndexedGetter(int index) => (_blink.BlinkGamepadList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Gamepad value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -45396,7 +42435,7 @@
 
   @DomName('GamepadList.item')
   @DocsEditable()
-  Gamepad item(int index) => wrap_jso(_blink.BlinkGamepadList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Gamepad item(int index) => _blink.BlinkGamepadList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -45414,27 +42453,19 @@
   // To suppress missing implicit constructor warnings.
   factory _HTMLAllCollection._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _HTMLAllCollection internalCreate_HTMLAllCollection() {
-    return new _HTMLAllCollection._internalWrap();
-  }
 
-  factory _HTMLAllCollection._internalWrap() {
-    return new _HTMLAllCollection.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _HTMLAllCollection.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   Element _item(int index) {
     if ((index is int || index == null)) {
-      return wrap_jso(_blink.BlinkHTMLAllCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+      return _blink.BlinkHTMLAllCollection.instance.item_Callback_1_(this, index);
     }
     if ((index is int || index == null)) {
-      return wrap_jso(_blink.BlinkHTMLAllCollection.instance.item_Callback_1_(unwrap_jso(this), index));
+      return _blink.BlinkHTMLAllCollection.instance.item_Callback_1_(this, index);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -45457,11 +42488,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _HTMLAppletElement internalCreate_HTMLAppletElement() {
-    return new _HTMLAppletElement._internalWrap();
-  }
-
-  external factory _HTMLAppletElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _HTMLAppletElement.internal_() : super.internal_();
@@ -45491,11 +42518,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _HTMLDirectoryElement internalCreate_HTMLDirectoryElement() {
-    return new _HTMLDirectoryElement._internalWrap();
-  }
-
-  external factory _HTMLDirectoryElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _HTMLDirectoryElement.internal_() : super.internal_();
@@ -45525,11 +42548,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _HTMLFontElement internalCreate_HTMLFontElement() {
-    return new _HTMLFontElement._internalWrap();
-  }
-
-  external factory _HTMLFontElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _HTMLFontElement.internal_() : super.internal_();
@@ -45559,11 +42578,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _HTMLFrameElement internalCreate_HTMLFrameElement() {
-    return new _HTMLFrameElement._internalWrap();
-  }
-
-  external factory _HTMLFrameElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _HTMLFrameElement.internal_() : super.internal_();
@@ -45591,11 +42606,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _HTMLFrameSetElement internalCreate_HTMLFrameSetElement() {
-    return new _HTMLFrameSetElement._internalWrap();
-  }
-
-  external factory _HTMLFrameSetElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _HTMLFrameSetElement.internal_() : super.internal_();
@@ -45634,11 +42645,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _HTMLMarqueeElement internalCreate_HTMLMarqueeElement() {
-    return new _HTMLMarqueeElement._internalWrap();
-  }
-
-  external factory _HTMLMarqueeElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _HTMLMarqueeElement.internal_() : super.internal_();
@@ -45674,11 +42681,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _MutationEvent internalCreate_MutationEvent() {
-    return new _MutationEvent._internalWrap();
-  }
-
-  external factory _MutationEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _MutationEvent.internal_() : super.internal_();
@@ -45700,32 +42703,24 @@
   // To suppress missing implicit constructor warnings.
   factory _NamedNodeMap._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _NamedNodeMap internalCreate_NamedNodeMap() {
-    return new _NamedNodeMap._internalWrap();
-  }
 
-  factory _NamedNodeMap._internalWrap() {
-    return new _NamedNodeMap.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _NamedNodeMap.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('NamedNodeMap.length')
   @DocsEditable()
-  int get length => _blink.BlinkNamedNodeMap.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkNamedNodeMap.instance.length_Getter_(this);
   
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkNamedNodeMap.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Node _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkNamedNodeMap.instance.item_Callback_1_(unwrap_jso(this), index));
+  Node _nativeIndexedGetter(int index) => (_blink.BlinkNamedNodeMap.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -45767,37 +42762,37 @@
 
   _Attr getNamedItem(String name) {
     if ((name is String)) {
-      return wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(this, name);
     }
     if ((name is String)) {
-      return wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(unwrap_jso(this), name));
+      return _blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(this, name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  _Attr getNamedItemNS(String namespaceURI, String localName) => wrap_jso(_blink.BlinkNamedNodeMap.instance.getNamedItemNS_Callback_2_(unwrap_jso(this), namespaceURI, localName));
+  _Attr getNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.instance.getNamedItemNS_Callback_2_(this, namespaceURI, localName);
   
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  _Attr item(int index) => wrap_jso(_blink.BlinkNamedNodeMap.instance.item_Callback_1_(unwrap_jso(this), index));
+  _Attr item(int index) => _blink.BlinkNamedNodeMap.instance.item_Callback_1_(this, index);
   
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  _Attr removeNamedItem(String name) => wrap_jso(_blink.BlinkNamedNodeMap.instance.removeNamedItem_Callback_1_(unwrap_jso(this), name));
+  _Attr removeNamedItem(String name) => _blink.BlinkNamedNodeMap.instance.removeNamedItem_Callback_1_(this, name);
   
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  _Attr removeNamedItemNS(String namespaceURI, String localName) => wrap_jso(_blink.BlinkNamedNodeMap.instance.removeNamedItemNS_Callback_2_(unwrap_jso(this), namespaceURI, localName));
+  _Attr removeNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.instance.removeNamedItemNS_Callback_2_(this, namespaceURI, localName);
   
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  _Attr setNamedItem(_Attr attr) => wrap_jso(_blink.BlinkNamedNodeMap.instance.setNamedItem_Callback_1_(unwrap_jso(this), unwrap_jso(attr)));
+  _Attr setNamedItem(_Attr attr) => _blink.BlinkNamedNodeMap.instance.setNamedItem_Callback_1_(this, attr);
   
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  _Attr setNamedItemNS(_Attr attr) => wrap_jso(_blink.BlinkNamedNodeMap.instance.setNamedItemNS_Callback_1_(unwrap_jso(this), unwrap_jso(attr)));
+  _Attr setNamedItemNS(_Attr attr) => _blink.BlinkNamedNodeMap.instance.setNamedItemNS_Callback_1_(this, attr);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -45814,21 +42809,13 @@
   // To suppress missing implicit constructor warnings.
   factory _PagePopupController._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _PagePopupController internalCreate_PagePopupController() {
-    return new _PagePopupController._internalWrap();
-  }
 
-  factory _PagePopupController._internalWrap() {
-    return new _PagePopupController.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _PagePopupController.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -45842,11 +42829,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _RadioNodeList internalCreate_RadioNodeList() {
-    return new _RadioNodeList._internalWrap();
-  }
-
-  external factory _RadioNodeList._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _RadioNodeList.internal_() : super.internal_();
@@ -45855,7 +42838,7 @@
   @DomName('RadioNodeList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  Node _item(int index) => wrap_jso(_blink.BlinkRadioNodeList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Node _item(int index) => _blink.BlinkRadioNodeList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -45877,18 +42860,14 @@
   factory _Request(Object input, [Map requestInitDict]) {
     if (requestInitDict != null) {
       var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
-      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict_1));
+      return _blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict_1);
     }
-    return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_1_(input));
+    return _blink.BlinkRequest.instance.constructorCallback_1_(input);
   }
 
 
   @Deprecated("Internal Use Only")
-  static _Request internalCreate_Request() {
-    return new _Request._internalWrap();
-  }
-
-  external factory _Request._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _Request.internal_() : super.internal_();
@@ -45897,37 +42876,37 @@
   @DomName('Request.context')
   @DocsEditable()
   @Experimental() // untriaged
-  String get context => _blink.BlinkRequest.instance.context_Getter_(unwrap_jso(this));
+  String get context => _blink.BlinkRequest.instance.context_Getter_(this);
   
   @DomName('Request.credentials')
   @DocsEditable()
   @Experimental() // untriaged
-  String get credentials => _blink.BlinkRequest.instance.credentials_Getter_(unwrap_jso(this));
+  String get credentials => _blink.BlinkRequest.instance.credentials_Getter_(this);
   
   @DomName('Request.headers')
   @DocsEditable()
   @Experimental() // untriaged
-  Headers get headers => wrap_jso(_blink.BlinkRequest.instance.headers_Getter_(unwrap_jso(this)));
+  Headers get headers => _blink.BlinkRequest.instance.headers_Getter_(this);
   
   @DomName('Request.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mode => _blink.BlinkRequest.instance.mode_Getter_(unwrap_jso(this));
+  String get mode => _blink.BlinkRequest.instance.mode_Getter_(this);
   
   @DomName('Request.referrer')
   @DocsEditable()
   @Experimental() // untriaged
-  String get referrer => _blink.BlinkRequest.instance.referrer_Getter_(unwrap_jso(this));
+  String get referrer => _blink.BlinkRequest.instance.referrer_Getter_(this);
   
   @DomName('Request.url')
   @DocsEditable()
   @Experimental() // untriaged
-  String get url => _blink.BlinkRequest.instance.url_Getter_(unwrap_jso(this));
+  String get url => _blink.BlinkRequest.instance.url_Getter_(this);
   
   @DomName('Request.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  _Request clone() => wrap_jso(_blink.BlinkRequest.instance.clone_Callback_0_(unwrap_jso(this)));
+  _Request clone() => _blink.BlinkRequest.instance.clone_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -45949,21 +42928,17 @@
   factory _Response([Object body, Map responseInitDict]) {
     if (responseInitDict != null) {
       var responseInitDict_1 = convertDartToNative_Dictionary(responseInitDict);
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body, responseInitDict_1));
+      return _blink.BlinkResponse.instance.constructorCallback_2_(body, responseInitDict_1);
     }
     if (body != null) {
-      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body));
+      return _blink.BlinkResponse.instance.constructorCallback_1_(body);
     }
-    return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_0_());
+    return _blink.BlinkResponse.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static _Response internalCreate_Response() {
-    return new _Response._internalWrap();
-  }
-
-  external factory _Response._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _Response.internal_() : super.internal_();
@@ -45984,11 +42959,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _ServiceWorker internalCreate_ServiceWorker() {
-    return new _ServiceWorker._internalWrap();
-  }
-
-  external factory _ServiceWorker._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _ServiceWorker.internal_() : super.internal_();
@@ -46013,32 +42984,24 @@
   // To suppress missing implicit constructor warnings.
   factory _SpeechRecognitionResultList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _SpeechRecognitionResultList internalCreate_SpeechRecognitionResultList() {
-    return new _SpeechRecognitionResultList._internalWrap();
-  }
 
-  factory _SpeechRecognitionResultList._internalWrap() {
-    return new _SpeechRecognitionResultList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _SpeechRecognitionResultList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SpeechRecognitionResultList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSpeechRecognitionResultList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSpeechRecognitionResultList.instance.length_Getter_(this);
   
   SpeechRecognitionResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  SpeechRecognitionResult _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(unwrap_jso(this), index));
+  SpeechRecognitionResult _nativeIndexedGetter(int index) => (_blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, SpeechRecognitionResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -46080,7 +43043,7 @@
 
   @DomName('SpeechRecognitionResultList.item')
   @DocsEditable()
-  SpeechRecognitionResult item(int index) => wrap_jso(_blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(unwrap_jso(this), index));
+  SpeechRecognitionResult item(int index) => _blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -46096,32 +43059,24 @@
   // To suppress missing implicit constructor warnings.
   factory _StyleSheetList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _StyleSheetList internalCreate_StyleSheetList() {
-    return new _StyleSheetList._internalWrap();
-  }
 
-  factory _StyleSheetList._internalWrap() {
-    return new _StyleSheetList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _StyleSheetList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('StyleSheetList.length')
   @DocsEditable()
-  int get length => _blink.BlinkStyleSheetList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkStyleSheetList.instance.length_Getter_(this);
   
   StyleSheet operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkStyleSheetList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  StyleSheet _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkStyleSheetList.instance.item_Callback_1_(unwrap_jso(this), index));
+  StyleSheet _nativeIndexedGetter(int index) => (_blink.BlinkStyleSheetList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, StyleSheet value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -46163,11 +43118,11 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable()
-  CssStyleSheet __getter__(String name) => wrap_jso(_blink.BlinkStyleSheetList.instance.$__getter___Callback_1_(unwrap_jso(this), name));
+  CssStyleSheet __getter__(String name) => _blink.BlinkStyleSheetList.instance.$__getter___Callback_1_(this, name);
   
   @DomName('StyleSheetList.item')
   @DocsEditable()
-  StyleSheet item(int index) => wrap_jso(_blink.BlinkStyleSheetList.instance.item_Callback_1_(unwrap_jso(this), index));
+  StyleSheet item(int index) => _blink.BlinkStyleSheetList.instance.item_Callback_1_(this, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -46184,21 +43139,13 @@
   // To suppress missing implicit constructor warnings.
   factory _SubtleCrypto._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _SubtleCrypto internalCreate_SubtleCrypto() {
-    return new _SubtleCrypto._internalWrap();
-  }
 
-  factory _SubtleCrypto._internalWrap() {
-    return new _SubtleCrypto.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _SubtleCrypto.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -46221,24 +43168,16 @@
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable()
   factory _WebKitCSSMatrix([String cssValue]) {
-    return wrap_jso(_blink.BlinkWebKitCSSMatrix.instance.constructorCallback_1_(cssValue));
+    return _blink.BlinkWebKitCSSMatrix.instance.constructorCallback_1_(cssValue);
   }
 
+
   @Deprecated("Internal Use Only")
-  static _WebKitCSSMatrix internalCreate_WebKitCSSMatrix() {
-    return new _WebKitCSSMatrix._internalWrap();
-  }
-
-  factory _WebKitCSSMatrix._internalWrap() {
-    return new _WebKitCSSMatrix.internal_();
-  }
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _WebKitCSSMatrix.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -46256,48 +43195,48 @@
 
   int _setInterval_String(String handler, [int timeout, Object arguments]) {
     if (timeout != null) {
-      return _blink.BlinkWindowTimers.instance.setInterval_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+      return _blink.BlinkWindowTimers.instance.setInterval_Callback_3_(this, handler, timeout, arguments);
     }
-    return _blink.BlinkWindowTimers.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindowTimers.instance.setInterval_Callback_1_(this, handler);
   }
 
   int _setTimeout_String(String handler, [int timeout, Object arguments]) {
     if (timeout != null) {
-      return _blink.BlinkWindowTimers.instance.setTimeout_Callback_3_(unwrap_jso(this), handler, timeout, arguments);
+      return _blink.BlinkWindowTimers.instance.setTimeout_Callback_3_(this, handler, timeout, arguments);
     }
-    return _blink.BlinkWindowTimers.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindowTimers.instance.setTimeout_Callback_1_(this, handler);
   }
 
   void _clearInterval([int handle]) {
     if (handle != null) {
-      _blink.BlinkWindowTimers.instance.clearInterval_Callback_1_(unwrap_jso(this), handle);
+      _blink.BlinkWindowTimers.instance.clearInterval_Callback_1_(this, handle);
       return;
     }
-    _blink.BlinkWindowTimers.instance.clearInterval_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWindowTimers.instance.clearInterval_Callback_0_(this);
     return;
   }
 
   void _clearTimeout([int handle]) {
     if (handle != null) {
-      _blink.BlinkWindowTimers.instance.clearTimeout_Callback_1_(unwrap_jso(this), handle);
+      _blink.BlinkWindowTimers.instance.clearTimeout_Callback_1_(this, handle);
       return;
     }
-    _blink.BlinkWindowTimers.instance.clearTimeout_Callback_0_(unwrap_jso(this));
+    _blink.BlinkWindowTimers.instance.clearTimeout_Callback_0_(this);
     return;
   }
 
   int _setInterval(Object handler, [int timeout]) {
     if (timeout != null) {
-      return _blink.BlinkWindowTimers.instance.setInterval_Callback_2_(unwrap_jso(this), handler, timeout);
+      return _blink.BlinkWindowTimers.instance.setInterval_Callback_2_(this, handler, timeout);
     }
-    return _blink.BlinkWindowTimers.instance.setInterval_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindowTimers.instance.setInterval_Callback_1_(this, handler);
   }
 
   int _setTimeout(Object handler, [int timeout]) {
     if (timeout != null) {
-      return _blink.BlinkWindowTimers.instance.setTimeout_Callback_2_(unwrap_jso(this), handler, timeout);
+      return _blink.BlinkWindowTimers.instance.setTimeout_Callback_2_(this, handler, timeout);
     }
-    return _blink.BlinkWindowTimers.instance.setTimeout_Callback_1_(unwrap_jso(this), handler);
+    return _blink.BlinkWindowTimers.instance.setTimeout_Callback_1_(this, handler);
   }
 
 }
@@ -46314,31 +43253,23 @@
   // To suppress missing implicit constructor warnings.
   factory _WorkerLocation._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _WorkerLocation internalCreate_WorkerLocation() {
-    return new _WorkerLocation._internalWrap();
-  }
 
-  factory _WorkerLocation._internalWrap() {
-    return new _WorkerLocation.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _WorkerLocation.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   // Override these methods for Dartium _WorkerLocation can't be abstract.
-  String get hash => _blink.BlinkWorkerLocation.instance.hash_Getter_(unwrap_jso(this));
-  String get host => _blink.BlinkWorkerLocation.instance.host_Getter_(unwrap_jso(this));
-  String get hostname => _blink.BlinkWorkerLocation.instance.hostname_Getter_(unwrap_jso(this));
-  String get href => _blink.BlinkWorkerLocation.instance.href_Getter_(unwrap_jso(this));
-  String get origin => _blink.BlinkWorkerLocation.instance.origin_Getter_(unwrap_jso(this));
-  String get pathname => _blink.BlinkWorkerLocation.instance.pathname_Getter_(unwrap_jso(this));
-  String get port => _blink.BlinkWorkerLocation.instance.port_Getter_(unwrap_jso(this));
-  String get protocol => _blink.BlinkWorkerLocation.instance.protocol_Getter_(unwrap_jso(this));
-  String get search => _blink.BlinkWorkerLocation.instance.search_Getter_(unwrap_jso(this));
+  String get hash => _blink.BlinkWorkerLocation.instance.hash_Getter_(this);
+  String get host => _blink.BlinkWorkerLocation.instance.host_Getter_(this);
+  String get hostname => _blink.BlinkWorkerLocation.instance.hostname_Getter_(this);
+  String get href => _blink.BlinkWorkerLocation.instance.href_Getter_(this);
+  String get origin => _blink.BlinkWorkerLocation.instance.origin_Getter_(this);
+  String get pathname => _blink.BlinkWorkerLocation.instance.pathname_Getter_(this);
+  String get port => _blink.BlinkWorkerLocation.instance.port_Getter_(this);
+  String get protocol => _blink.BlinkWorkerLocation.instance.protocol_Getter_(this);
+  String get search => _blink.BlinkWorkerLocation.instance.search_Getter_(this);
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -46354,31 +43285,23 @@
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _WorkerNavigator internalCreate_WorkerNavigator() {
-    return new _WorkerNavigator._internalWrap();
-  }
 
-  factory _WorkerNavigator._internalWrap() {
-    return new _WorkerNavigator.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _WorkerNavigator.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   // Override these methods for Dartium _WorkerNavigator can't be abstract.
-  String get appCodeName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
-  String get appName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
-  String get appVersion => _blink.BlinkWorkerNavigator.instance.appVersion_Getter_(unwrap_jso(this));
-  bool get dartEnabled => _blink.BlinkWorkerNavigator.instance.dartEnabled_Getter_(unwrap_jso(this));
-  String get platform => _blink.BlinkWorkerNavigator.instance.platform_Getter_(unwrap_jso(this));
-  String get product => _blink.BlinkWorkerNavigator.instance.product_Getter_(unwrap_jso(this));
-  String get userAgent => _blink.BlinkWorkerNavigator.instance.userAgent_Getter_(unwrap_jso(this));
-  int get hardwareConcurrency => _blink.BlinkWorkerNavigator.instance.hardwareConcurrency_Getter_(unwrap_jso(this));
-  bool get onLine => _blink.BlinkWorkerNavigator.instance.onLine_Getter_(unwrap_jso(this));
+  String get appCodeName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(this);
+  String get appName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(this);
+  String get appVersion => _blink.BlinkWorkerNavigator.instance.appVersion_Getter_(this);
+  bool get dartEnabled => _blink.BlinkWorkerNavigator.instance.dartEnabled_Getter_(this);
+  String get platform => _blink.BlinkWorkerNavigator.instance.platform_Getter_(this);
+  String get product => _blink.BlinkWorkerNavigator.instance.product_Getter_(this);
+  String get userAgent => _blink.BlinkWorkerNavigator.instance.userAgent_Getter_(this);
+  int get hardwareConcurrency => _blink.BlinkWorkerNavigator.instance.hardwareConcurrency_Getter_(this);
+  bool get onLine => _blink.BlinkWorkerNavigator.instance.onLine_Getter_(this);
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -46397,11 +43320,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _XMLHttpRequestProgressEvent internalCreate_XMLHttpRequestProgressEvent() {
-    return new _XMLHttpRequestProgressEvent._internalWrap();
-  }
-
-  external factory _XMLHttpRequestProgressEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _XMLHttpRequestProgressEvent.internal_() : super.internal_();
@@ -50569,40 +47488,11 @@
   }
 
   Element upgrade(element) {
-    var jsObject;
-    var tag;
-    var isNativeElementExtension = false;
-
-    try {
-      tag = _getCustomElementName(element);
-    } catch (e) {
-      isNativeElementExtension = element.localName == _extendsTag;
+    // Only exact type matches are supported- cannot be a subclass.
+    if (element.runtimeType != _nativeType) {
+      throw new ArgumentError('element is not subclass of $_nativeType');
     }
-
-    if (element.runtimeType == HtmlElement || element.runtimeType == TemplateElement) {
-      if (tag != _extendsTag) {
-        throw new UnsupportedError('$tag is not registered.');
-      }
-      jsObject = unwrap_jso(element);
-    } else if (element.runtimeType == js.JsObject) {
-      // It's a Polymer core element (written in JS).
-      jsObject = element;
-    } else if (isNativeElementExtension) {
-      // Extending a native element.
-      jsObject = element.blink_jsObject;
-
-      // Element to extend is the real tag.
-      tag = element.localName;
-    } else if (tag != null && element.localName != tag) {
-      throw new UnsupportedError('Element is incorrect type. Got ${element.runtimeType}, expected native Html or Svg element to extend.');
-    } else if (tag == null) {
-      throw new UnsupportedError('Element is incorrect type. Got ${element.runtimeType}, expected HtmlElement/JsObject.');
-    }
-
-    // Remember Dart class to tagName for any upgrading done in wrap_jso.
-    addCustomElementType(tag, _type, _extendsTag);
-
-    return _createCustomUpgrader(_type, jsObject);
+    return _createCustomUpgrader(_type, element);
   }
 }
 
@@ -50694,13 +47584,7 @@
 @Experimental()
 class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** Needed because KeyboardEvent is implements.
-   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
-   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
-   *               functions that delegate to a public wrap/unwrap_jso.
    */
-  @Deprecated("Internal Use Only")
-  js.JsObject blink_jsObject;
-
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
@@ -50844,15 +47728,14 @@
 
 /**
  * Helper class to implement custom events which wrap DOM events.
+ * TODO(jacobr): consider using dart JsNative.$setInstanceInterceptor
+ * instead of using wrappers as that would allow passing these wrappers
+ * back through dispatchEvent unlike the current implementation.
+ * See https://github.com/dart-lang/sdk/issues/16869
  */
 class _WrappedEvent implements Event {
   /** Needed because KeyboardEvent is implements.
-   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
-   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
-   *               functions that delegate to a public wrap/unwrap_jso.
    */
-  js.JsObject blink_jsObject;
-
   final Event wrapped;
 
   /** The CSS selector involved with event delegation. */
@@ -51130,8 +48013,6 @@
     }
   }
 
-  static maybeUnwrapJso(obj) => unwrap_jso(obj);
-
   static List convertToList(List list) {
     // FIXME: [possible optimization]: do not copy the array if Dart_IsArray is fine w/ it.
     final length = list.length;
@@ -51195,15 +48076,14 @@
     return element;
   }
 
-  static window() => wrap_jso(js.context['window']);
-
   static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   static void spawnDomHelper(Function f, int replyTo) =>
       _blink.Blink_Utils.spawnDomHelper(f, replyTo);
 
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) => wrap_jso(_blink.Blink_Utils.spawnDomUri(uri));
+  // TODO(jacobr): IS THIS RIGHT? I worry we have broken conversion from Promise to Future.
+  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -51780,13 +48660,13 @@
     return [
         "inspect",
         (o) {
-          host.callMethod("_inspect", [unwrap_jso(o)]);
+          js.JsNative.callMethod(host, "_inspect", [o]);
           return o;
         },
         "dir",
-        window().console.dir,
+        window.console.dir,
         "dirxml",
-        window().console.dirxml
+        window.console.dirxml
         // FIXME: add copy method.
         ];
   }
@@ -51810,38 +48690,34 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-    String extendsTagName) => _blink.Blink_Utils.register(unwrap_jso(document), tag, customType, extendsTagName);
+    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
 
   static Element createElement(Document document, String tagName) =>
-      wrap_jso(_blink.Blink_Utils.createElement(unwrap_jso(document), tagName));
-
-  static Element changeElementWrapper(HtmlElement element, Type type) =>
-      wrap_jso(_blink.Blink_Utils.changeElementWrapper(unwrap_jso(element), type));
+      _blink.Blink_Utils.createElement(document, tagName);
 }
 
+// TODO(jacobr): this seems busted. I believe we are actually
+// giving users real windows for opener, parent, top, etc.
+// Or worse, we are probaly returning a raw JSObject.
 class _DOMWindowCrossFrame extends DartHtmlDomObject implements
     WindowBase {
-  /** Needed because KeyboardEvent is implements.
-   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
-   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
-   *               functions that delegate to a public wrap/unwrap_jso.
-   */
-  js.JsObject blink_jsObject;
 
   _DOMWindowCrossFrame.internal();
+  
+  static _createSafe(win) => _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame);
 
   // Fields.
-  HistoryBase get history => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_history(unwrap_jso(this)));
-  LocationBase get location => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_location(unwrap_jso(this)));
-  bool get closed => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_closed(unwrap_jso(this)));
-  WindowBase get opener => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_opener(unwrap_jso(this)));
-  WindowBase get parent => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_parent(unwrap_jso(this)));
-  WindowBase get top => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_top(unwrap_jso(this)));
+  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
+  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
+  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
+  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
+  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
+  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
 
   // Methods.
-  void close() => _blink.Blink_DOMWindowCrossFrame.close(unwrap_jso(this));
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-      _blink.Blink_DOMWindowCrossFrame.postMessage(unwrap_jso(this),
+      _blink.Blink_DOMWindowCrossFrame.postMessage(this,
          convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
 
   // Implementation support.
@@ -51875,9 +48751,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() => _blink.Blink_HistoryCrossFrame.back(unwrap_jso(this));
-  void forward() => _blink.Blink_HistoryCrossFrame.forward(unwrap_jso(this));
-  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(unwrap_jso(this), distance);
+  void back() => _blink.Blink_HistoryCrossFrame.back(this);
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -51887,7 +48763,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(unwrap_jso(this), h);
+  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
diff --git a/sdk/lib/html/html_common/conversions_dart2js.dart b/sdk/lib/html/html_common/conversions_dart2js.dart
index b7f3d7c..b5a1064 100644
--- a/sdk/lib/html/html_common/conversions_dart2js.dart
+++ b/sdk/lib/html/html_common/conversions_dart2js.dart
@@ -91,9 +91,3 @@
   var newPromise = JS('', '#.then(#)["catch"](#)', promise, then, error);
   return completer.future;
 }
-
-/// Wrap a JS object with an instance of the matching dart:html class. Used only in Dartium.
-wrap_jso(jsObject) => jsObject;
-
-/// Find the underlying JS object for a dart:html Dart object.
-unwrap_jso(dartClass_instance) => dartClass_instance;
diff --git a/sdk/lib/html/html_common/conversions_dartium.dart b/sdk/lib/html/html_common/conversions_dartium.dart
index ad71852..ef02c00 100644
--- a/sdk/lib/html/html_common/conversions_dartium.dart
+++ b/sdk/lib/html/html_common/conversions_dartium.dart
@@ -7,74 +7,155 @@
     new _AcceptStructuredCloneDartium().convertNativeToDart_AcceptStructuredClone(object, mustCopy: mustCopy);
 
 class _StructuredCloneDartium extends _StructuredClone {
-  newJsMap() => new js.JsObject(js.context["Object"]);
-  putIntoMap(map, key, value) => map[key] = value;
-  // TODO(alanknight): Don't create two extra lists to get a fixed-length JS list.
-  newJsList(length) => new js.JsArray.from(new List(length));
-  cloneNotRequired(e) => e is js.JsObject;
+  newJsMap() => js.JsNative.newObject();
+  putIntoMap(map, key, value) => js.JsNative.setProperty(map, key, value);
+  newJsList(length) => js.JsNative.newArray()..length = length;
+  cloneNotRequired(e) =>
+      e is js.JSObject || e is TypedData || e is ByteBuffer;
 }
 
-class _AcceptStructuredCloneDartium extends _AcceptStructuredClone {
+/// A version of _AcceptStructuredClone, but using a different algorithm
+/// so we can take advantage of an identity HashMap on Dartium without
+/// the bad side-effect of modifying the JS source objects if we do the same in
+/// dart2js.
+///
+/// This no longer inherits anything from _AcceptStructuredClone
+/// and is never used polymorphically with it, so it doesn't inherit.
+class _AcceptStructuredCloneDartium {
   newDartList(length) => new List(length);
 
-  // JsObjects won't be identical, but will be equal only if the underlying
-  // Js entities are identical.
-  bool identicalInJs(a, b) =>
-      (a is js.JsObject) ? a == b : identical(a, b);
+  // As long as we stick to JSObject instead of intermingling legacy JsObject,
+  // we can simply use identical.
+  bool identicalInJs(a, b) => identical(a, b);
 
   void forEachJsField(jsObject, action) {
-    var keys = js.context["Object"].callMethod("keys", [jsObject]);
+    var keys = js.JsNative.callMethod(_object, "keys", [jsObject]);
     for (var key in keys) {
-      action(key, jsObject[key]);
+      action(key, js.JsNative.getProperty(jsObject, key));
     }
   }
+
+  // Keep track of the clones, keyed by the original object. If we're
+  // not copying, these may be the same.
+  var clones = new HashMap.identity();
+  bool mustCopy = false;
+
+  Object findSlot(value) {
+    return clones.putIfAbsent(value, () => null);
+  }
+
+  writeSlot(original, x) { clones[original] = x; }
+
+  walk(e) {
+    if (e == null) return e;
+    if (e is bool) return e;
+    if (e is num) return e;
+    if (e is String) return e;
+    if (e is DateTime) return e;
+
+    if (isJavaScriptRegExp(e)) {
+      // TODO(sra).
+      throw new UnimplementedError('structured clone of RegExp');
+    }
+
+    if (isJavaScriptPromise(e)) {
+      return convertNativePromiseToDartFuture(e);
+    }
+
+    if (isJavaScriptSimpleObject(e)) {
+      // TODO(sra): If mustCopy is false, swizzle the prototype for one of a Map
+      // implementation that uses the properies as storage.
+      var copy = findSlot(e);
+      if (copy != null) return copy;
+      copy = {};
+
+      writeSlot(e, copy);
+      forEachJsField(e, (key, value) => copy[key] = walk(value));
+      return copy;
+    }
+
+    if (isJavaScriptArray(e)) {
+      var copy = findSlot(e);
+      if (copy != null) return copy;
+
+      int length = e.length;
+      // Since a JavaScript Array is an instance of Dart List, we can modify it
+      // in-place unless we must copy.
+      copy = mustCopy ? newDartList(length) : e;
+      writeSlot(e, copy);
+
+      for (int i = 0; i < length; i++) {
+        copy[i] = walk(e[i]);
+      }
+      return copy;
+    }
+
+    // Assume anything else is already a valid Dart object, either by having
+    // already been processed, or e.g. a clonable native class.
+    return e;
+  }
+
+  convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) {
+    this.mustCopy = mustCopy;
+    var copy = walk(object);
+    return copy;
+  }
 }
 
-final _dateConstructor = js.context["Date"];
-final _regexConstructor = js.context["RegExp"];
+final _dateConstructor = js.JsNative.getProperty(window, "Date");
+final _regexConstructor = js.JsNative.getProperty(window, "RegExp");
 
-bool isJavaScriptDate(value) => value is js.JsObject && value.instanceof(_dateConstructor);
-bool isJavaScriptRegExp(value) => value is js.JsObject && value.instanceof(_regexConstructor);
-bool isJavaScriptArray(value) => value is js.JsArray;
+bool isJavaScriptDate(value) => value is js.JSObject && js.JsNative.instanceof(value, _dateConstructor);
+bool isJavaScriptRegExp(value) => value is js.JSObject && js.JsNative.instanceof(value, _regexConstructor);
+bool isJavaScriptArray(value) => value is js.JSArray;
 
-final _object = js.context["Object"];
-final _getPrototypeOf = _object["getPrototypeOf"];
+final _object = js.JsNative.getProperty(window, "Object");
+final _getPrototypeOf = js.JsNative.getProperty(_object, "getPrototypeOf");
 _getProto(object) {
-  return _getPrototypeOf.apply([object]);
+  return _getPrototypeOf(object);
 }
-final _objectProto = js.context["Object"]["prototype"];
+final _objectProto = js.JsNative.getProperty(_object, "prototype");
 
 bool isJavaScriptSimpleObject(value) {
-  if (value is! js.JsObject) return false;
+  if (value is! js.JSObject) return false;
   var proto = _getProto(value);
   return proto == _objectProto || proto == null;
 }
+
+// TODO(jacobr): this makes little sense unless we are doing something
+// ambitious to make Dartium and Dart2Js interop well with each other.
 bool isImmutableJavaScriptArray(value) =>
-    isJavaScriptArray(value) && value["immutable$list"] != null;
+    isJavaScriptArray(value) && js.JsNative.getProperty(value, "immutable$list") != null;
 
-final _promiseConstructor = js.context['Promise'];
-bool isJavaScriptPromise(value) => value is js.JsObject && value['constructor'] == _promiseConstructor;
+final _promiseConstructor = js.JsNative.getProperty(window, 'Promise');
+bool isJavaScriptPromise(value) => value is js.JSObject && identical(js.JsNative.getProperty(value, 'constructor'), _promiseConstructor);
 
-Future convertNativePromiseToDartFuture(js.JsObject promise) {
+Future convertNativePromiseToDartFuture(js.JSObject promise) {
   var completer = new Completer();
-  var newPromise = promise
-    .callMethod("then", [(result) => completer.complete(result)])
-    .callMethod("catch", [(result) => completer.completeError(result)]);
+  var newPromise = js.JsNative.callMethod(js.JsNative.callMethod(promise,
+    "then", [js.allowInterop((result) => completer.complete(result))]),
+    "catch", [js.allowInterop((result) => completer.completeError(result))]);
   return completer.future;
 }
 
 convertDartToNative_DateTime(DateTime date) {
-  return new js.JsObject(js.context["Date"], [date.millisecondsSinceEpoch]);
+  return date;
 }
 
 /// Creates a Dart Rectangle from a Javascript object with properties
-/// left, top, width and height. Used internally in Dartium.
-Rectangle make_dart_rectangle(r) =>
-    r == null ? null : new Rectangle(
-    js.JsNative.getProperty(r, 'left'),
-    js.JsNative.getProperty(r, 'top'),
-    js.JsNative.getProperty(r, 'width'),
-    js.JsNative.getProperty(r, 'height'));
+/// left, top, width and height or a 4 element array of integers. Used internally in Dartium.
+Rectangle make_dart_rectangle(r) {
+  if (r == null) return null;
+  if (r is List) {
+    return new Rectangle(r[0], r[1], r[2], r[3]);
+  }
+
+  return new Rectangle(
+      js.JsNative.getProperty(r, 'left'),
+      js.JsNative.getProperty(r, 'top'),
+      js.JsNative.getProperty(r, 'width'),
+      js.JsNative.getProperty(r, 'height'));
+}
 
 // Converts a flat Dart map into a JavaScript object with properties this is
 // is the Dartium only version it uses dart:js.
@@ -82,16 +163,16 @@
 // code in html_common and be more general.
 convertDartToNative_Dictionary(Map dict) {
   if (dict == null) return null;
-  var jsObject = new js.JsObject(js.JsNative.getProperty(js.context, 'Object'));
+  var jsObject = js.JsNative.newObject();
   dict.forEach((String key, value) {
     if (value is List) {
-      var jsArray = new js.JsArray();
+      var jsArray = js.JsNative.newArray();
       value.forEach((elem) {
         jsArray.add(elem is Map ? convertDartToNative_Dictionary(elem): elem);
       });
-      jsObject[key] = jsArray;
+      js.JsNative.setProperty(jsObject, key, jsArray);
     } else {
-      jsObject[key] = value;
+      js.JsNative.setProperty(jsObject, key, value);
     }
   });
   return jsObject;
@@ -120,8 +201,15 @@
 
 // Helper function to wrapped a returned dictionary from blink to a Dart looking
 // class.
-convertNativeDictionaryToDartDictionary(Map values) =>
-  values != null ? new _ReturnedDictionary(values) : null;
+convertNativeDictionaryToDartDictionary(values) {
+  if (values is! Map) {
+    // TODO(jacobr): wish wwe didn't have to do this.
+    values = convertNativeToDart_SerializedScriptValue(values);
+  }
+  return values != null ? new _ReturnedDictionary(values) : null;
+}
+
+convertNativeToDart_Dictionary(values) => convertNativeToDart_SerializedScriptValue(values);
 
 // Conversion function place holder (currently not used in dart2js or dartium).
 List convertDartToNative_StringArray(List<String> input) => input;
@@ -129,284 +217,59 @@
 // Converts a Dart list into a JsArray. For the Dartium version only.
 convertDartToNative_List(List input) => new js.JsArray()..addAll(input);
 
-/// Find the underlying JS object for a dart:html Dart object.
-unwrap_jso(dartClass_instance) => js.unwrap_jso(dartClass_instance);
-
-// Flag to disable JS interop asserts.  Setting to false will speed up the
-// wrap_jso calls.
-bool interop_checks = false;
-
-/// Wrap a JS object with an instance of the matching dart:html class. Used only in Dartium.
-wrap_jso(jsObject) {
+// Incredibly slow implementation to lookup the runtime type for an object.
+// Fortunately, performance doesn't matter much as the results are cached
+// as long as the object being looked up has a valid prototype.
+// TODO(jacobr): we should track the # of lookups to ensure that things aren't
+// going off the rails due to objects with null prototypes, etc.
+// Note: unlike all other methods in this class, here we intentionally use
+// the old JsObject types to bootstrap the new typed bindings.
+Type lookupType(js.JsObject jsObject, bool isElement) {
   try {
-    if (jsObject is! js.JsObject || jsObject == null) {
-      // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
-      // or it's a simple type.
-      return jsObject;
-    }
-
-    var wrapper = js.getDartHtmlWrapperFor(jsObject);
-    // if we have a wrapper return the Dart instance.
-    if (wrapper != null) {
-      return wrapper;
-    }
-
-    if (jsObject is js.JsArray) {
-      wrapper = new js.JSArray.create(jsObject);
-      js.setDartHtmlWrapperFor(jsObject, wrapper);
-      return wrapper;
-    }
-    if (jsObject is js.JsFunction) {
-      wrapper = new js.JSFunction.create(jsObject);
-      js.setDartHtmlWrapperFor(jsObject, wrapper);
-      return wrapper;
-    }
-
-    // Try the most general type conversions on it.
-    // TODO(alanknight): We may be able to do better. This maintains identity,
-    // which is useful, but expensive. And if we nest something that only
-    // this conversion handles, how does that work? e.g. a list of maps of elements.
-    var converted = convertNativeToDart_SerializedScriptValue(jsObject);
-    if (!identical(converted, jsObject)) {
-      return converted;
-    }
+  // TODO(jacobr): add static methods that return the runtime type of the patch
+  // class so that this code works as expected.
+  if (jsObject is js.JsArray) {
+    return js.JSArray.instanceRuntimeType;
+  }
+  if (jsObject is js.JsFunction) {
+    return js.JSFunction.instanceRuntimeType;
+  }
 
     var constructor = js.JsNative.getProperty(jsObject, 'constructor');
     if (constructor == null) {
       // Perfectly valid case for JavaScript objects where __proto__ has
       // intentionally been set to null.
-      js.setDartHtmlWrapperFor(jsObject, new js.JSObject.create(jsObject));
-      return jsObject;
+      // We should track and warn about this case as peformance will be poor.
+      return js.JSObject.instanceRuntimeType;
     }
     var jsTypeName = js.JsNative.getProperty(constructor, 'name');
     if (jsTypeName is! String || jsTypeName.length == 0) {
       // Not an html type.
-      wrapper = new js.JSObject.create(jsObject);
-      js.setDartHtmlWrapperFor(jsObject, wrapper);
-      return wrapper;
+      return js.JSObject.instanceRuntimeType;
     }
 
     var dartClass_instance;
     var customElementClass = null;
-    var extendsTag = "";
-    var custom = getCustomElementEntry(jsObject);
-    if (custom != null) {
-      customElementClass = custom['type'];
-      extendsTag = custom['extends'];
-    }
+    var extendsTag = "";    
 
-    // Only allow custom elements to be created in the html or svg default
-    // namespace.
-    var func;
-    var defaultNS = jsObject['namespaceURI'] == 'http://www.w3.org/1999/xhtml' ||
-        jsObject['namespaceURI'] ==  'http://www.w3.org/2000/svg';
-    if (customElementClass != null && extendsTag == "" && defaultNS) {
-      // The customElementClass is known but we can't create the real class so
-      // create the HtmlElement and it will get upgraded when registerElement's
-      // createdCallback is called.
-      func = getHtmlCreateFunction('HTMLElement');
-    } else {
-      func = getHtmlCreateFunction(jsTypeName);
-      if (func == null) {
-        // Start walking the prototype chain looking for a JS class.
-        var prototype = jsObject['__proto__'];
-        var keepWalking = true;
-        while (keepWalking && prototype.hasProperty('__proto__')) {
-          prototype = prototype['__proto__'];
-          if (prototype != null && prototype is Element &&
-              prototype.blink_jsObject != null) {
-            // We're a Dart class that's pointing to a JS class.
-            var blinkJso = prototype.blink_jsObject;
-            jsTypeName = blinkJso['constructor']['name'];
-            func = getHtmlCreateFunction(jsTypeName);
-            keepWalking = func == null;
-          }
-        }
+    Type type = getHtmlCreateType(jsTypeName);
+    if (type != null) return type;
+
+    // Start walking the prototype chain looking for a JS class.
+    var prototype = js.JsNative.getProperty(jsObject, '__proto__');
+    while (prototype != null) {
+      // We're a Dart class that's pointing to a JS class.
+      var constructor = js.JsNative.getProperty(prototype, 'constructor');
+      if (constructor != null) {          
+        jsTypeName = js.JsNative.getProperty(constructor, 'name');
+        type = getHtmlCreateType(jsTypeName);
+        if (type != null) return type;
       }
+      prototype = js.JsNative.getProperty(prototype, '__proto__');
     }
-
-    // Can we construct a Dart class?
-    if (func != null) {
-      dartClass_instance = func();
-
-      // Wrap our Dart instance in both directions.
-      dartClass_instance.blink_jsObject = jsObject;
-      js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
-    }
-
-    // TODO(jacobr): cache that this is not a dart:html JS class.
-    return dartClass_instance;
   } catch (e, stacktrace) {
-    if (interop_checks) {
-      if (e is DebugAssertException) window.console
-          .log("${e.message}\n ${stacktrace}");
-      else window.console.log("${stacktrace}");
-    }
+    if (e is DebugAssertException) print("${e.message}\n ${stacktrace}");
+    else print("${stacktrace}");
   }
-
-  return null;
-}
-
-/**
- * Create Dart class that maps to the JS Type, add the JsObject as an expando
- * on the Dart class and return the created Dart class.
- */
-wrap_jso_no_SerializedScriptvalue(jsObject) {
-  try {
-    if (jsObject is! js.JsObject || jsObject == null) {
-      // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
-      // or it's a simple type.
-      return jsObject;
-    }
-
-    // TODO(alanknight): With upgraded custom elements this causes a failure because
-    // we need a new wrapper after the type changes. We could possibly invalidate this
-    // if the constructor name didn't match?
-    var wrapper = js.getDartHtmlWrapperFor(jsObject);
-    if (wrapper != null) {
-      return wrapper;
-    }
-
-    if (jsObject is js.JsArray) {
-      wrapper = new js.JSArray.create(jsObject);
-      js.setDartHtmlWrapperFor(jsObject, wrapper);
-      return wrapper;
-    }
-    if (jsObject is js.JsFunction) {
-      wrapper = new js.JSFunction.create(jsObject);
-      js.setDartHtmlWrapperFor(jsObject, wrapper);
-      return wrapper;
-    }
-
-    var constructor = js.JsNative.getProperty(jsObject, 'constructor');
-    if (constructor == null) {
-      // Perfectly valid case for JavaScript objects where __proto__ has
-      // intentionally been set to null.
-      js.setDartHtmlWrapperFor(jsObject, new js.JSObject.create(jsObject));
-      return jsObject;
-    }
-    var jsTypeName = js.JsNative.getProperty(constructor, 'name');
-    if (jsTypeName is! String || jsTypeName.length == 0) {
-      // Not an html type.
-      wrapper = new js.JSObject.create(jsObject);
-      js.setDartHtmlWrapperFor(jsObject, wrapper);
-      return wrapper;
-    }
-
-    var func = getHtmlCreateFunction(jsTypeName);
-    if (func != null) {
-      var dartClass_instance = func();
-      dartClass_instance.blink_jsObject = jsObject;
-      js.setDartHtmlWrapperFor(jsObject, dartClass_instance);
-      return dartClass_instance;
-    }
-    wrapper = new js.JSObject.create(jsObject);
-    js.setDartHtmlWrapperFor(jsObject, wrapper);
-    return wrapper;
-  } catch (e, stacktrace) {
-    if (interop_checks) {
-      if (e is DebugAssertException) window.console
-          .log("${e.message}\n ${stacktrace}");
-      else window.console.log("${stacktrace}");
-    }
-  }
-
-  return null;
-}
-
-/**
- * Create Dart class that maps to the JS Type that is the JS type being
- * extended using JS interop createCallback (we need the base type of the
- * custom element) not the Dart created constructor.
- */
-wrap_jso_custom_element(jsObject) {
-  try {
-    if (jsObject is! js.JsObject) {
-      // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
-      return jsObject;
-    }
-
-    // Find out what object we're extending.
-    var objectName = jsObject.toString();
-    // Expect to see something like '[object HTMLElement]'.
-    if (!objectName.startsWith('[object ')) {
-      return jsObject;
-    }
-
-    var extendsClass = objectName.substring(8, objectName.length - 1);
-    var func = getHtmlCreateFunction(extendsClass);
-    if (interop_checks)
-      debug_or_assert("func != null name = ${extendsClass}", func != null);
-    var dartClass_instance = func();
-    dartClass_instance.blink_jsObject = jsObject;
-    return dartClass_instance;
-  } catch(e, stacktrace){
-    if (interop_checks) {
-      if (e is DebugAssertException)
-        window.console.log("${e.message}\n ${stacktrace}");
-      else
-        window.console.log("${stacktrace}");
-    }
-
-    // Problem?
-    return null;
-  }
-}
-
-getCustomElementEntry(element) {
-  var hasAttribute = false;
-
-  var jsObject;
-  var tag = "";
-  var runtimeType = element.runtimeType;
-  if (runtimeType == HtmlElement) {
-    tag = element.localName;
-  } else if (runtimeType == TemplateElement) {
-    // Data binding with a Dart class.
-    tag = element.attributes['is'];
-  } else if (runtimeType == js.JsObject) {
-    // It's a Polymer core element (written in JS).
-    // Make sure it's an element anything else we can ignore.
-    if (element.hasProperty('nodeType') && element['nodeType'] == 1) {
-      if (js.JsNative.callMethod(element, 'hasAttribute', ['is'])) {
-        hasAttribute = true;
-        // It's data binding use the is attribute.
-        tag = js.JsNative.callMethod(element, 'getAttribute', ['is']);
-      } else {
-        // It's a custom element we want the local name.
-        tag = element['localName'];
-      }
-    }
-  } else {
-    throw new UnsupportedError(
-        'Element is incorrect type. Got ${runtimeType}, expected HtmlElement/HtmlTemplate/JsObject.');
-  }
-
-  var entry = _knownCustomElements[tag];
-  if (entry != null) {
-    // If there's an 'is' attribute then check if the extends tag registered
-    // matches the tag if so then return the entry that's registered for this
-    // extendsTag or if there's no 'is' tag then return the entry found.
-    if ((hasAttribute && entry['extends'] == tag) || !hasAttribute) {
-      return entry;
-    }
-  }
-
-  return null;
-}
-
-// List of known tagName to DartClass for custom elements, used for upgrade.
-var _knownCustomElements = new Map<String, Map<Type, String>>();
-
-void addCustomElementType(String tagName, Type dartClass, [String extendTag]) {
-  _knownCustomElements[tagName] =
-      {'type': dartClass, 'extends': extendTag != null ? extendTag : "" };
-}
-
-Type getCustomElementType(object) {
-  var entry = getCustomElementEntry(object);
-  if (entry != null) {
-    return entry['type'];
-  }
-  return null;
+  return js.JSObject.instanceRuntimeType;
 }
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 02a914f..39c78ed 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -110,37 +110,83 @@
 // FIXME: Can we make this private?
 @Deprecated("Internal Use Only")
 final indexed_dbBlinkMap = {
-  'IDBCursor': () => Cursor,
-  'IDBCursorWithValue': () => CursorWithValue,
-  'IDBDatabase': () => Database,
-  'IDBFactory': () => IdbFactory,
-  'IDBIndex': () => Index,
-  'IDBKeyRange': () => KeyRange,
-  'IDBObjectStore': () => ObjectStore,
-  'IDBOpenDBRequest': () => OpenDBRequest,
-  'IDBRequest': () => Request,
-  'IDBTransaction': () => Transaction,
-  'IDBVersionChangeEvent': () => VersionChangeEvent,
+  'IDBCursor': () => Cursor.instanceRuntimeType,
+  'IDBCursorWithValue': () => CursorWithValue.instanceRuntimeType,
+  'IDBDatabase': () => Database.instanceRuntimeType,
+  'IDBFactory': () => IdbFactory.instanceRuntimeType,
+  'IDBIndex': () => Index.instanceRuntimeType,
+  'IDBKeyRange': () => KeyRange.instanceRuntimeType,
+  'IDBObjectStore': () => ObjectStore.instanceRuntimeType,
+  'IDBOpenDBRequest': () => OpenDBRequest.instanceRuntimeType,
+  'IDBRequest': () => Request.instanceRuntimeType,
+  'IDBTransaction': () => Transaction.instanceRuntimeType,
+  'IDBVersionChangeEvent': () => VersionChangeEvent.instanceRuntimeType,
 
 };
 
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final indexed_dbBlinkFunctionMap = {
-  'IDBCursor': () => Cursor.internalCreateCursor,
-  'IDBCursorWithValue': () => CursorWithValue.internalCreateCursorWithValue,
-  'IDBDatabase': () => Database.internalCreateDatabase,
-  'IDBFactory': () => IdbFactory.internalCreateIdbFactory,
-  'IDBIndex': () => Index.internalCreateIndex,
-  'IDBKeyRange': () => KeyRange.internalCreateKeyRange,
-  'IDBObjectStore': () => ObjectStore.internalCreateObjectStore,
-  'IDBOpenDBRequest': () => OpenDBRequest.internalCreateOpenDBRequest,
-  'IDBRequest': () => Request.internalCreateRequest,
-  'IDBTransaction': () => Transaction.internalCreateTransaction,
-  'IDBVersionChangeEvent': () => VersionChangeEvent.internalCreateVersionChangeEvent,
 
-};
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+//
+// Per http://www.w3.org/TR/IndexedDB/#key-construct
+//
+// "A value is said to be a valid key if it is one of the following types: Array
+// JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [ECMA-262] or float
+// [WEBIDL]. However Arrays are only valid keys if every item in the array is
+// defined and is a valid key (i.e. sparse arrays can not be valid keys) and if
+// the Array doesn't directly or indirectly contain itself. Any non-numeric
+// properties are ignored, and thus does not affect whether the Array is a valid
+// key. Additionally, if the value is of type float, it is only a valid key if
+// it is not NaN, and if the value is of type Date it is only a valid key if its
+// [[PrimitiveValue]] internal property, as defined by [ECMA-262], is not NaN."
+
+// What is required is to ensure that an Lists in the key are actually
+// JavaScript arrays, and any Dates are JavaScript Dates.
+
+
+/**
+ * Converts a native IDBKey into a Dart object.
+ *
+ * May return the original input.  May mutate the original input (but will be
+ * idempotent if mutation occurs).  It is assumed that this conversion happens
+ * on native IDBKeys on all paths that return IDBKeys from native DOM calls.
+ *
+ * If necessary, JavaScript Dates are converted into Dart Dates.
+ */
+_convertNativeToDart_IDBKey(nativeKey) {
+  containsDate(object) {
+    if (object is DateTime) return true;
+    if (object is List) {
+      for (int i = 0; i < object.length; i++) {
+        if (containsDate(object[i])) return true;
+      }
+    }
+    return false;  // number, string.
+  }
+  if (nativeKey is DateTime) {
+    throw new UnimplementedError('Key containing DateTime');
+  }
+  // TODO: Cache conversion somewhere?
+  return nativeKey;
+}
+
+/**
+ * Converts a Dart object into a valid IDBKey.
+ *
+ * May return the original input.  Does not mutate input.
+ *
+ * If necessary, [dartKey] may be copied to ensure all lists are converted into
+ * JavaScript Arrays and Dart Dates into JavaScript Dates.
+ */
+_convertDartToNative_IDBKey(dartKey) {
+  // TODO: Implement.
+  return dartKey;
+}
+
+
+
+/// May modify original.  If so, action is idempotent.
+_convertNativeToDart_IDBAny(object) {
+  return convertNativeToDart_AcceptStructuredClone(object, mustCopy: false);
+}// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -169,62 +215,54 @@
     // To suppress missing implicit constructor warnings.
   factory Cursor._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Cursor internalCreateCursor() {
-    return new Cursor._internalWrap();
-  }
 
-  factory Cursor._internalWrap() {
-    return new Cursor.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Cursor.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('IDBCursor.direction')
   @DocsEditable()
-  String get direction => _blink.BlinkIDBCursor.instance.direction_Getter_(unwrap_jso(this));
+  String get direction => _blink.BlinkIDBCursor.instance.direction_Getter_(this);
   
   @DomName('IDBCursor.key')
   @DocsEditable()
-  Object get key => wrap_jso(_blink.BlinkIDBCursor.instance.key_Getter_(unwrap_jso(this)));
+  Object get key => (_blink.BlinkIDBCursor.instance.key_Getter_(this));
   
   @DomName('IDBCursor.primaryKey')
   @DocsEditable()
-  Object get primaryKey => wrap_jso(_blink.BlinkIDBCursor.instance.primaryKey_Getter_(unwrap_jso(this)));
+  Object get primaryKey => (_blink.BlinkIDBCursor.instance.primaryKey_Getter_(this));
   
   @DomName('IDBCursor.source')
   @DocsEditable()
-  Object get source => wrap_jso(_blink.BlinkIDBCursor.instance.source_Getter_(unwrap_jso(this)));
+  Object get source => (_blink.BlinkIDBCursor.instance.source_Getter_(this));
   
   @DomName('IDBCursor.advance')
   @DocsEditable()
-  void advance(int count) => _blink.BlinkIDBCursor.instance.advance_Callback_1_(unwrap_jso(this), count);
+  void advance(int count) => _blink.BlinkIDBCursor.instance.advance_Callback_1_(this, count);
   
   @DomName('IDBCursor.continuePrimaryKey')
   @DocsEditable()
   @Experimental() // untriaged
-  void continuePrimaryKey(Object key, Object primaryKey) => _blink.BlinkIDBCursor.instance.continuePrimaryKey_Callback_2_(unwrap_jso(this), key, primaryKey);
+  void continuePrimaryKey(Object key, Object primaryKey) => _blink.BlinkIDBCursor.instance.continuePrimaryKey_Callback_2_(this, key, primaryKey);
   
   @DomName('IDBCursor.delete')
   @DocsEditable()
-  Request _delete() => wrap_jso(_blink.BlinkIDBCursor.instance.delete_Callback_0_(unwrap_jso(this)));
+  Request _delete() => _blink.BlinkIDBCursor.instance.delete_Callback_0_(this);
   
   void next([Object key]) {
     if (key != null) {
-      _blink.BlinkIDBCursor.instance.continue_Callback_1_(unwrap_jso(this), key);
+      _blink.BlinkIDBCursor.instance.continue_Callback_1_(this, key);
       return;
     }
-    _blink.BlinkIDBCursor.instance.continue_Callback_0_(unwrap_jso(this));
+    _blink.BlinkIDBCursor.instance.continue_Callback_0_(this);
     return;
   }
 
   @DomName('IDBCursor.update')
   @DocsEditable()
-  Request _update(Object value) => wrap_jso(_blink.BlinkIDBCursor.instance.update_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value)));
+  Request _update(Object value) => _blink.BlinkIDBCursor.instance.update_Callback_1_(this, convertDartToNative_SerializedScriptValue(value));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -243,11 +281,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CursorWithValue internalCreateCursorWithValue() {
-    return new CursorWithValue._internalWrap();
-  }
-
-  external factory CursorWithValue._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CursorWithValue.internal_() : super.internal_();
@@ -255,7 +289,7 @@
 
   @DomName('IDBCursorWithValue.value')
   @DocsEditable()
-  Object get value => wrap_jso(_blink.BlinkIDBCursorWithValue.instance.value_Getter_(unwrap_jso(this)));
+  Object get value => _convertNativeToDart_IDBAny(_blink.BlinkIDBCursorWithValue.instance.value_Getter_(this));
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -298,14 +332,14 @@
     if (storeName_OR_storeNames == null) {
       throw new ArgumentError("stores may not be null in transaction");
     } else if (storeName_OR_storeNames is String || storeName_OR_storeNames is DomStringList) {
-      names = unwrap_jso(storeName_OR_storeNames);
+      names = storeName_OR_storeNames;
     } else if (storeName_OR_storeNames is List<String>) {
       names = convertDartToNative_List(storeName_OR_storeNames);
     } else {
       throw new ArgumentError("Invalid store(s) $store_Name_OR_storeNames");
     }
 
-    return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), names, mode));
+    return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, names, mode);
   }
 
   Transaction transactionList(List<String> storeNames, String mode) => transaction(storeNames, mode);
@@ -359,11 +393,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Database internalCreateDatabase() {
-    return new Database._internalWrap();
-  }
-
-  external factory Database._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Database.internal_() : super.internal_();
@@ -371,30 +401,30 @@
 
   @DomName('IDBDatabase.name')
   @DocsEditable()
-  String get name => _blink.BlinkIDBDatabase.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkIDBDatabase.instance.name_Getter_(this);
   
   @DomName('IDBDatabase.objectStoreNames')
   @DocsEditable()
-  List<String> get objectStoreNames => wrap_jso(_blink.BlinkIDBDatabase.instance.objectStoreNames_Getter_(unwrap_jso(this)));
+  List<String> get objectStoreNames => _blink.BlinkIDBDatabase.instance.objectStoreNames_Getter_(this);
   
   @DomName('IDBDatabase.version')
   @DocsEditable()
-  Object get version => wrap_jso(_blink.BlinkIDBDatabase.instance.version_Getter_(unwrap_jso(this)));
+  Object get version => (_blink.BlinkIDBDatabase.instance.version_Getter_(this));
   
   @DomName('IDBDatabase.close')
   @DocsEditable()
-  void close() => _blink.BlinkIDBDatabase.instance.close_Callback_0_(unwrap_jso(this));
+  void close() => _blink.BlinkIDBDatabase.instance.close_Callback_0_(this);
   
   ObjectStore _createObjectStore(String name, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkIDBDatabase.instance.createObjectStore_Callback_2_(unwrap_jso(this), name, convertDartToNative_Dictionary(options)));
+      return _blink.BlinkIDBDatabase.instance.createObjectStore_Callback_2_(this, name, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkIDBDatabase.instance.createObjectStore_Callback_1_(unwrap_jso(this), name));
+    return _blink.BlinkIDBDatabase.instance.createObjectStore_Callback_1_(this, name);
   }
 
   @DomName('IDBDatabase.deleteObjectStore')
   @DocsEditable()
-  void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.instance.deleteObjectStore_Callback_1_(unwrap_jso(this), name);
+  void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.instance.deleteObjectStore_Callback_1_(this, name);
   
   /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
@@ -508,34 +538,26 @@
   // To suppress missing implicit constructor warnings.
   factory IdbFactory._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static IdbFactory internalCreateIdbFactory() {
-    return new IdbFactory._internalWrap();
-  }
 
-  factory IdbFactory._internalWrap() {
-    return new IdbFactory.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   IdbFactory.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('IDBFactory.cmp')
   @DocsEditable()
-  int cmp(Object first, Object second) => _blink.BlinkIDBFactory.instance.cmp_Callback_2_(unwrap_jso(this), first, second);
+  int cmp(Object first, Object second) => _blink.BlinkIDBFactory.instance.cmp_Callback_2_(this, first, second);
   
   @DomName('IDBFactory.deleteDatabase')
   @DocsEditable()
-  OpenDBRequest _deleteDatabase(String name) => wrap_jso(_blink.BlinkIDBFactory.instance.deleteDatabase_Callback_1_(unwrap_jso(this), name));
+  OpenDBRequest _deleteDatabase(String name) => _blink.BlinkIDBFactory.instance.deleteDatabase_Callback_1_(this, name);
   
   OpenDBRequest _open(String name, [int version]) {
     if (version != null) {
-      return wrap_jso(_blink.BlinkIDBFactory.instance.open_Callback_2_(unwrap_jso(this), name, version));
+      return _blink.BlinkIDBFactory.instance.open_Callback_2_(this, name, version);
     }
-    return wrap_jso(_blink.BlinkIDBFactory.instance.open_Callback_1_(unwrap_jso(this), name));
+    return _blink.BlinkIDBFactory.instance.open_Callback_1_(this, name);
   }
 
   @DomName('IDBFactory.webkitGetDatabaseNames')
@@ -543,7 +565,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Request _webkitGetDatabaseNames() => wrap_jso(_blink.BlinkIDBFactory.instance.webkitGetDatabaseNames_Callback_0_(unwrap_jso(this)));
+  Request _webkitGetDatabaseNames() => _blink.BlinkIDBFactory.instance.webkitGetDatabaseNames_Callback_0_(this);
   
 }
 
@@ -661,79 +683,71 @@
     // To suppress missing implicit constructor warnings.
   factory Index._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Index internalCreateIndex() {
-    return new Index._internalWrap();
-  }
 
-  factory Index._internalWrap() {
-    return new Index.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Index.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('IDBIndex.keyPath')
   @DocsEditable()
-  Object get keyPath => wrap_jso(_blink.BlinkIDBIndex.instance.keyPath_Getter_(unwrap_jso(this)));
+  Object get keyPath => (_blink.BlinkIDBIndex.instance.keyPath_Getter_(this));
   
   @DomName('IDBIndex.multiEntry')
   @DocsEditable()
-  bool get multiEntry => _blink.BlinkIDBIndex.instance.multiEntry_Getter_(unwrap_jso(this));
+  bool get multiEntry => _blink.BlinkIDBIndex.instance.multiEntry_Getter_(this);
   
   @DomName('IDBIndex.name')
   @DocsEditable()
-  String get name => _blink.BlinkIDBIndex.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkIDBIndex.instance.name_Getter_(this);
   
   @DomName('IDBIndex.objectStore')
   @DocsEditable()
-  ObjectStore get objectStore => wrap_jso(_blink.BlinkIDBIndex.instance.objectStore_Getter_(unwrap_jso(this)));
+  ObjectStore get objectStore => _blink.BlinkIDBIndex.instance.objectStore_Getter_(this);
   
   @DomName('IDBIndex.unique')
   @DocsEditable()
-  bool get unique => _blink.BlinkIDBIndex.instance.unique_Getter_(unwrap_jso(this));
+  bool get unique => _blink.BlinkIDBIndex.instance.unique_Getter_(this);
   
   @DomName('IDBIndex.count')
   @DocsEditable()
-  Request _count(Object key) => wrap_jso(_blink.BlinkIDBIndex.instance.count_Callback_1_(unwrap_jso(this), key));
+  Request _count(Object key) => _blink.BlinkIDBIndex.instance.count_Callback_1_(this, key);
   
   @DomName('IDBIndex.get')
   @DocsEditable()
-  Request _get(Object key) => wrap_jso(_blink.BlinkIDBIndex.instance.get_Callback_1_(unwrap_jso(this), key));
+  Request _get(Object key) => _blink.BlinkIDBIndex.instance.get_Callback_1_(this, key);
   
   Request getAll(Object range, [int maxCount]) {
     if (maxCount != null) {
-      return wrap_jso(_blink.BlinkIDBIndex.instance.getAll_Callback_2_(unwrap_jso(this), range, maxCount));
+      return _blink.BlinkIDBIndex.instance.getAll_Callback_2_(this, range, maxCount);
     }
-    return wrap_jso(_blink.BlinkIDBIndex.instance.getAll_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBIndex.instance.getAll_Callback_1_(this, range);
   }
 
   Request getAllKeys(Object range, [int maxCount]) {
     if (maxCount != null) {
-      return wrap_jso(_blink.BlinkIDBIndex.instance.getAllKeys_Callback_2_(unwrap_jso(this), range, maxCount));
+      return _blink.BlinkIDBIndex.instance.getAllKeys_Callback_2_(this, range, maxCount);
     }
-    return wrap_jso(_blink.BlinkIDBIndex.instance.getAllKeys_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBIndex.instance.getAllKeys_Callback_1_(this, range);
   }
 
   @DomName('IDBIndex.getKey')
   @DocsEditable()
-  Request _getKey(Object key) => wrap_jso(_blink.BlinkIDBIndex.instance.getKey_Callback_1_(unwrap_jso(this), key));
+  Request _getKey(Object key) => _blink.BlinkIDBIndex.instance.getKey_Callback_1_(this, key);
   
   Request _openCursor(Object range, [String direction]) {
     if (direction != null) {
-      return wrap_jso(_blink.BlinkIDBIndex.instance.openCursor_Callback_2_(unwrap_jso(this), range, direction));
+      return _blink.BlinkIDBIndex.instance.openCursor_Callback_2_(this, range, direction);
     }
-    return wrap_jso(_blink.BlinkIDBIndex.instance.openCursor_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBIndex.instance.openCursor_Callback_1_(this, range);
   }
 
   Request _openKeyCursor(Object range, [String direction]) {
     if (direction != null) {
-      return wrap_jso(_blink.BlinkIDBIndex.instance.openKeyCursor_Callback_2_(unwrap_jso(this), range, direction));
+      return _blink.BlinkIDBIndex.instance.openKeyCursor_Callback_2_(this, range, direction);
     }
-    return wrap_jso(_blink.BlinkIDBIndex.instance.openKeyCursor_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBIndex.instance.openKeyCursor_Callback_1_(this, range);
   }
 
 }
@@ -766,64 +780,56 @@
   // To suppress missing implicit constructor warnings.
   factory KeyRange._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static KeyRange internalCreateKeyRange() {
-    return new KeyRange._internalWrap();
-  }
 
-  factory KeyRange._internalWrap() {
-    return new KeyRange.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   KeyRange.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('IDBKeyRange.lower')
   @DocsEditable()
-  Object get lower => wrap_jso(_blink.BlinkIDBKeyRange.instance.lower_Getter_(unwrap_jso(this)));
+  Object get lower => (_blink.BlinkIDBKeyRange.instance.lower_Getter_(this));
   
   @DomName('IDBKeyRange.lowerOpen')
   @DocsEditable()
-  bool get lowerOpen => _blink.BlinkIDBKeyRange.instance.lowerOpen_Getter_(unwrap_jso(this));
+  bool get lowerOpen => _blink.BlinkIDBKeyRange.instance.lowerOpen_Getter_(this);
   
   @DomName('IDBKeyRange.upper')
   @DocsEditable()
-  Object get upper => wrap_jso(_blink.BlinkIDBKeyRange.instance.upper_Getter_(unwrap_jso(this)));
+  Object get upper => (_blink.BlinkIDBKeyRange.instance.upper_Getter_(this));
   
   @DomName('IDBKeyRange.upperOpen')
   @DocsEditable()
-  bool get upperOpen => _blink.BlinkIDBKeyRange.instance.upperOpen_Getter_(unwrap_jso(this));
+  bool get upperOpen => _blink.BlinkIDBKeyRange.instance.upperOpen_Getter_(this);
   
   static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) {
     if (upperOpen != null) {
-      return wrap_jso(_blink.BlinkIDBKeyRange.instance.bound_Callback_4_(lower, upper, lowerOpen, upperOpen));
+      return _blink.BlinkIDBKeyRange.instance.bound_Callback_4_(lower, upper, lowerOpen, upperOpen);
     }
     if (lowerOpen != null) {
-      return wrap_jso(_blink.BlinkIDBKeyRange.instance.bound_Callback_3_(lower, upper, lowerOpen));
+      return _blink.BlinkIDBKeyRange.instance.bound_Callback_3_(lower, upper, lowerOpen);
     }
-    return wrap_jso(_blink.BlinkIDBKeyRange.instance.bound_Callback_2_(lower, upper));
+    return _blink.BlinkIDBKeyRange.instance.bound_Callback_2_(lower, upper);
   }
 
   static KeyRange lowerBound_(Object bound, [bool open]) {
     if (open != null) {
-      return wrap_jso(_blink.BlinkIDBKeyRange.instance.lowerBound_Callback_2_(bound, open));
+      return _blink.BlinkIDBKeyRange.instance.lowerBound_Callback_2_(bound, open);
     }
-    return wrap_jso(_blink.BlinkIDBKeyRange.instance.lowerBound_Callback_1_(bound));
+    return _blink.BlinkIDBKeyRange.instance.lowerBound_Callback_1_(bound);
   }
 
   @DomName('IDBKeyRange.only_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange only_(Object value) => wrap_jso(_blink.BlinkIDBKeyRange.instance.only_Callback_1_(value));
+  static KeyRange only_(Object value) => _blink.BlinkIDBKeyRange.instance.only_Callback_1_(value);
   
   static KeyRange upperBound_(Object bound, [bool open]) {
     if (open != null) {
-      return wrap_jso(_blink.BlinkIDBKeyRange.instance.upperBound_Callback_2_(bound, open));
+      return _blink.BlinkIDBKeyRange.instance.upperBound_Callback_2_(bound, open);
     }
-    return wrap_jso(_blink.BlinkIDBKeyRange.instance.upperBound_Callback_1_(bound));
+    return _blink.BlinkIDBKeyRange.instance.upperBound_Callback_1_(bound);
   }
 
 }
@@ -965,112 +971,104 @@
   // To suppress missing implicit constructor warnings.
   factory ObjectStore._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ObjectStore internalCreateObjectStore() {
-    return new ObjectStore._internalWrap();
-  }
 
-  factory ObjectStore._internalWrap() {
-    return new ObjectStore.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ObjectStore.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('IDBObjectStore.autoIncrement')
   @DocsEditable()
-  bool get autoIncrement => _blink.BlinkIDBObjectStore.instance.autoIncrement_Getter_(unwrap_jso(this));
+  bool get autoIncrement => _blink.BlinkIDBObjectStore.instance.autoIncrement_Getter_(this);
   
   @DomName('IDBObjectStore.indexNames')
   @DocsEditable()
-  List<String> get indexNames => wrap_jso(_blink.BlinkIDBObjectStore.instance.indexNames_Getter_(unwrap_jso(this)));
+  List<String> get indexNames => _blink.BlinkIDBObjectStore.instance.indexNames_Getter_(this);
   
   @DomName('IDBObjectStore.keyPath')
   @DocsEditable()
-  Object get keyPath => wrap_jso(_blink.BlinkIDBObjectStore.instance.keyPath_Getter_(unwrap_jso(this)));
+  Object get keyPath => (_blink.BlinkIDBObjectStore.instance.keyPath_Getter_(this));
   
   @DomName('IDBObjectStore.name')
   @DocsEditable()
-  String get name => _blink.BlinkIDBObjectStore.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkIDBObjectStore.instance.name_Getter_(this);
   
   @DomName('IDBObjectStore.transaction')
   @DocsEditable()
-  Transaction get transaction => wrap_jso(_blink.BlinkIDBObjectStore.instance.transaction_Getter_(unwrap_jso(this)));
+  Transaction get transaction => _blink.BlinkIDBObjectStore.instance.transaction_Getter_(this);
   
   Request _add(Object value, [Object key]) {
     if (key != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.add_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value), convertDartToNative_SerializedScriptValue(key)));
+      return _blink.BlinkIDBObjectStore.instance.add_Callback_2_(this, convertDartToNative_SerializedScriptValue(value), convertDartToNative_SerializedScriptValue(key));
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.add_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value)));
+    return _blink.BlinkIDBObjectStore.instance.add_Callback_1_(this, convertDartToNative_SerializedScriptValue(value));
   }
 
   @DomName('IDBObjectStore.clear')
   @DocsEditable()
-  Request _clear() => wrap_jso(_blink.BlinkIDBObjectStore.instance.clear_Callback_0_(unwrap_jso(this)));
+  Request _clear() => _blink.BlinkIDBObjectStore.instance.clear_Callback_0_(this);
   
   @DomName('IDBObjectStore.count')
   @DocsEditable()
-  Request _count(Object key) => wrap_jso(_blink.BlinkIDBObjectStore.instance.count_Callback_1_(unwrap_jso(this), key));
+  Request _count(Object key) => _blink.BlinkIDBObjectStore.instance.count_Callback_1_(this, key);
   
   Index _createIndex(String name, Object keyPath, [Map options]) {
     if (options != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, keyPath, convertDartToNative_Dictionary(options)));
+      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(this, name, keyPath, convertDartToNative_Dictionary(options));
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, keyPath));
+    return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(this, name, keyPath);
   }
 
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
-  Request _delete(Object key) => wrap_jso(_blink.BlinkIDBObjectStore.instance.delete_Callback_1_(unwrap_jso(this), key));
+  Request _delete(Object key) => _blink.BlinkIDBObjectStore.instance.delete_Callback_1_(this, key);
   
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
-  void deleteIndex(String name) => _blink.BlinkIDBObjectStore.instance.deleteIndex_Callback_1_(unwrap_jso(this), name);
+  void deleteIndex(String name) => _blink.BlinkIDBObjectStore.instance.deleteIndex_Callback_1_(this, name);
   
   @DomName('IDBObjectStore.get')
   @DocsEditable()
-  Request _get(Object key) => wrap_jso(_blink.BlinkIDBObjectStore.instance.get_Callback_1_(unwrap_jso(this), key));
+  Request _get(Object key) => _blink.BlinkIDBObjectStore.instance.get_Callback_1_(this, key);
   
   Request getAll(Object range, [int maxCount]) {
     if (maxCount != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAll_Callback_2_(unwrap_jso(this), range, maxCount));
+      return _blink.BlinkIDBObjectStore.instance.getAll_Callback_2_(this, range, maxCount);
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAll_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBObjectStore.instance.getAll_Callback_1_(this, range);
   }
 
   Request getAllKeys(Object range, [int maxCount]) {
     if (maxCount != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAllKeys_Callback_2_(unwrap_jso(this), range, maxCount));
+      return _blink.BlinkIDBObjectStore.instance.getAllKeys_Callback_2_(this, range, maxCount);
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.getAllKeys_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBObjectStore.instance.getAllKeys_Callback_1_(this, range);
   }
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
-  Index index(String name) => wrap_jso(_blink.BlinkIDBObjectStore.instance.index_Callback_1_(unwrap_jso(this), name));
+  Index index(String name) => _blink.BlinkIDBObjectStore.instance.index_Callback_1_(this, name);
   
   Request _openCursor(Object range, [String direction]) {
     if (direction != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.openCursor_Callback_2_(unwrap_jso(this), range, direction));
+      return _blink.BlinkIDBObjectStore.instance.openCursor_Callback_2_(this, range, direction);
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.openCursor_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBObjectStore.instance.openCursor_Callback_1_(this, range);
   }
 
   Request openKeyCursor(Object range, [String direction]) {
     if (direction != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.openKeyCursor_Callback_2_(unwrap_jso(this), range, direction));
+      return _blink.BlinkIDBObjectStore.instance.openKeyCursor_Callback_2_(this, range, direction);
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.openKeyCursor_Callback_1_(unwrap_jso(this), range));
+    return _blink.BlinkIDBObjectStore.instance.openKeyCursor_Callback_1_(this, range);
   }
 
   Request _put(Object value, [Object key]) {
     if (key != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.put_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value), convertDartToNative_SerializedScriptValue(key)));
+      return _blink.BlinkIDBObjectStore.instance.put_Callback_2_(this, convertDartToNative_SerializedScriptValue(value), convertDartToNative_SerializedScriptValue(key));
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.put_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value)));
+    return _blink.BlinkIDBObjectStore.instance.put_Callback_1_(this, convertDartToNative_SerializedScriptValue(value));
   }
 
 
@@ -1137,11 +1135,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static OpenDBRequest internalCreateOpenDBRequest() {
-    return new OpenDBRequest._internalWrap();
-  }
-
-  external factory OpenDBRequest._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OpenDBRequest.internal_() : super.internal_();
@@ -1194,11 +1188,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Request internalCreateRequest() {
-    return new Request._internalWrap();
-  }
-
-  external factory Request._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Request.internal_() : super.internal_();
@@ -1206,23 +1196,23 @@
 
   @DomName('IDBRequest.error')
   @DocsEditable()
-  DomError get error => wrap_jso(_blink.BlinkIDBRequest.instance.error_Getter_(unwrap_jso(this)));
+  DomError get error => _blink.BlinkIDBRequest.instance.error_Getter_(this);
   
   @DomName('IDBRequest.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkIDBRequest.instance.readyState_Getter_(unwrap_jso(this));
+  String get readyState => _blink.BlinkIDBRequest.instance.readyState_Getter_(this);
   
   @DomName('IDBRequest.result')
   @DocsEditable()
-  Object get result => wrap_jso(_blink.BlinkIDBRequest.instance.result_Getter_(unwrap_jso(this)));
+  Object get result => _convertNativeToDart_IDBAny(_blink.BlinkIDBRequest.instance.result_Getter_(this));
   
   @DomName('IDBRequest.source')
   @DocsEditable()
-  Object get source => wrap_jso(_blink.BlinkIDBRequest.instance.source_Getter_(unwrap_jso(this)));
+  Object get source => (_blink.BlinkIDBRequest.instance.source_Getter_(this));
   
   @DomName('IDBRequest.transaction')
   @DocsEditable()
-  Transaction get transaction => wrap_jso(_blink.BlinkIDBRequest.instance.transaction_Getter_(unwrap_jso(this)));
+  Transaction get transaction => _blink.BlinkIDBRequest.instance.transaction_Getter_(this);
   
   /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
@@ -1307,11 +1297,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static Transaction internalCreateTransaction() {
-    return new Transaction._internalWrap();
-  }
-
-  external factory Transaction._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Transaction.internal_() : super.internal_();
@@ -1319,28 +1305,28 @@
 
   @DomName('IDBTransaction.db')
   @DocsEditable()
-  Database get db => wrap_jso(_blink.BlinkIDBTransaction.instance.db_Getter_(unwrap_jso(this)));
+  Database get db => _blink.BlinkIDBTransaction.instance.db_Getter_(this);
   
   @DomName('IDBTransaction.error')
   @DocsEditable()
-  DomError get error => wrap_jso(_blink.BlinkIDBTransaction.instance.error_Getter_(unwrap_jso(this)));
+  DomError get error => _blink.BlinkIDBTransaction.instance.error_Getter_(this);
   
   @DomName('IDBTransaction.mode')
   @DocsEditable()
-  String get mode => _blink.BlinkIDBTransaction.instance.mode_Getter_(unwrap_jso(this));
+  String get mode => _blink.BlinkIDBTransaction.instance.mode_Getter_(this);
   
   @DomName('IDBTransaction.objectStoreNames')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get objectStoreNames => wrap_jso(_blink.BlinkIDBTransaction.instance.objectStoreNames_Getter_(unwrap_jso(this)));
+  List<String> get objectStoreNames => _blink.BlinkIDBTransaction.instance.objectStoreNames_Getter_(this);
   
   @DomName('IDBTransaction.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkIDBTransaction.instance.abort_Callback_0_(unwrap_jso(this));
+  void abort() => _blink.BlinkIDBTransaction.instance.abort_Callback_0_(this);
   
   @DomName('IDBTransaction.objectStore')
   @DocsEditable()
-  ObjectStore objectStore(String name) => wrap_jso(_blink.BlinkIDBTransaction.instance.objectStore_Callback_1_(unwrap_jso(this), name));
+  ObjectStore objectStore(String name) => _blink.BlinkIDBTransaction.instance.objectStore_Callback_1_(this, name);
   
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
@@ -1377,18 +1363,14 @@
   factory VersionChangeEvent(String type, [Map eventInitDict]) {
     if (eventInitDict != null) {
       var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict);
-      return wrap_jso(_blink.BlinkIDBVersionChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1));
+      return _blink.BlinkIDBVersionChangeEvent.instance.constructorCallback_2_(type, eventInitDict_1);
     }
-    return wrap_jso(_blink.BlinkIDBVersionChangeEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkIDBVersionChangeEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static VersionChangeEvent internalCreateVersionChangeEvent() {
-    return new VersionChangeEvent._internalWrap();
-  }
-
-  external factory VersionChangeEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VersionChangeEvent.internal_() : super.internal_();
@@ -1397,19 +1379,19 @@
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLoss => _blink.BlinkIDBVersionChangeEvent.instance.dataLoss_Getter_(unwrap_jso(this));
+  String get dataLoss => _blink.BlinkIDBVersionChangeEvent.instance.dataLoss_Getter_(this);
   
   @DomName('IDBVersionChangeEvent.dataLossMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLossMessage => _blink.BlinkIDBVersionChangeEvent.instance.dataLossMessage_Getter_(unwrap_jso(this));
+  String get dataLossMessage => _blink.BlinkIDBVersionChangeEvent.instance.dataLossMessage_Getter_(this);
   
   @DomName('IDBVersionChangeEvent.newVersion')
   @DocsEditable()
-  int get newVersion => _blink.BlinkIDBVersionChangeEvent.instance.newVersion_Getter_(unwrap_jso(this));
+  int get newVersion => _blink.BlinkIDBVersionChangeEvent.instance.newVersion_Getter_(this);
   
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable()
-  int get oldVersion => _blink.BlinkIDBVersionChangeEvent.instance.oldVersion_Getter_(unwrap_jso(this));
+  int get oldVersion => _blink.BlinkIDBVersionChangeEvent.instance.oldVersion_Getter_(this);
   
 }
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart
index f3e3166..7104c27 100644
--- a/sdk/lib/internal/iterable.dart
+++ b/sdk/lib/internal/iterable.dart
@@ -172,7 +172,8 @@
 
   Iterable<E> where(bool test(E element)) => super.where(test);
 
-  Iterable map(f(E element)) => new MappedListIterable(this, f);
+  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) =>
+      new MappedListIterable<E, dynamic/*=T*/ >(this, f);
 
   E reduce(E combine(var value, E element)) {
     int length = this.length;
@@ -188,7 +189,9 @@
     return value;
   }
 
-  fold(var initialValue, combine(var previousValue, E element)) {
+  /*=T*/ fold/*<T>*/(
+      var/*=T*/ initialValue, /*=T*/ combine(
+          var/*=T*/ previousValue, E element)) {
     var value = initialValue;
     int length = this.length;
     for (int i = 0; i < length; i++) {
@@ -555,7 +558,7 @@
 
 class TakeWhileIterator<E> extends Iterator<E> {
   final Iterator<E> _iterator;
-  final _ElementPredicate _f;
+  final _ElementPredicate<E> _f;
   bool _isFinished = false;
 
   TakeWhileIterator(this._iterator, bool this._f(E element));
@@ -637,7 +640,7 @@
 
 class SkipWhileIterable<E> extends Iterable<E> {
   final Iterable<E> _iterable;
-  final _ElementPredicate _f;
+  final _ElementPredicate<E> _f;
 
   SkipWhileIterable(this._iterable, bool this._f(E element));
 
@@ -648,7 +651,7 @@
 
 class SkipWhileIterator<E> extends Iterator<E> {
   final Iterator<E> _iterator;
-  final _ElementPredicate _f;
+  final _ElementPredicate<E> _f;
   bool _hasSkipped = false;
 
   SkipWhileIterator(this._iterator, bool this._f(E element));
@@ -713,13 +716,15 @@
 
   Iterable<E> where(bool test(E element)) => this;
 
-  Iterable map(f(E element)) => const EmptyIterable();
+  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) => const EmptyIterable();
 
   E reduce(E combine(E value, E element)) {
     throw IterableElementError.noElement();
   }
 
-  fold(var initialValue, combine(var previousValue, E element)) {
+  /*=T*/ fold/*<T>*/(
+      var/*=T*/ initialValue, /*=T*/ combine(
+          var/*=T*/ previousValue, E element)) {
     return initialValue;
   }
 
@@ -737,9 +742,9 @@
 
   Iterable<E> takeWhile(bool test(E element)) => this;
 
-  List toList({ bool growable: true }) => growable ? <E>[] : new List<E>(0);
+  List<E> toList({bool growable: true}) => growable ? <E>[] : new List<E>(0);
 
-  Set toSet() => new Set<E>();
+  Set<E> toSet() => new Set<E>();
 }
 
 /** The always empty iterator. */
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index c271d77..07ef23e 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -842,7 +842,9 @@
   }
 
   void _tryFilter() {
-    if (_status == CLOSED) return;
+    if (_status == CLOSED) {
+      return;
+    }
     if (_filterPending && !_filterActive) {
       _filterActive = true;
       _filterPending = false;
@@ -858,7 +860,9 @@
         if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) {
           // Checks for and handles all cases of partially closed sockets.
           shutdown(SocketDirection.SEND);
-          if (_status == CLOSED) return;
+          if (_status == CLOSED) {
+            return;
+          }
         }
         if (_filterStatus.readEmpty && _socketClosedRead && !_closedRead) {
           if (_status == HANDSHAKE) {
@@ -870,14 +874,26 @@
           }
           _closeHandler();
         }
-        if (_status == CLOSED) return;
+        if (_status == CLOSED) {
+          return;
+        }
         if (_filterStatus.progress) {
           _filterPending = true;
-          if (_filterStatus.writePlaintextNoLongerFull) _sendWriteEvent();
-          if (_filterStatus.readEncryptedNoLongerFull) _readSocket();
-          if (_filterStatus.writeEncryptedNoLongerEmpty) _writeSocket();
-          if (_filterStatus.readPlaintextNoLongerEmpty) _scheduleReadEvent();
-          if (_status == HANDSHAKE) _secureHandshake();
+          if (_filterStatus.writeEncryptedNoLongerEmpty) {
+            _writeSocket();
+          }
+          if (_filterStatus.writePlaintextNoLongerFull) {
+            _sendWriteEvent();
+          }
+          if (_filterStatus.readEncryptedNoLongerFull) {
+            _readSocket();
+          }
+          if (_filterStatus.readPlaintextNoLongerEmpty) {
+            _scheduleReadEvent();
+          }
+          if (_status == HANDSHAKE) {
+            _secureHandshake();
+          }
         }
         _tryFilter();
       }).catchError(_reportError);
diff --git a/sdk/lib/js/dartium/cached_patches.dart b/sdk/lib/js/dartium/cached_patches.dart
new file mode 100644
index 0000000..1c3e7ea
--- /dev/null
+++ b/sdk/lib/js/dartium/cached_patches.dart
@@ -0,0 +1,6032 @@
+// START_OF_CACHED_PATCHES
+// 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.
+
+// DO NOT EDIT GENERATED FILE.
+
+library cached_patches;
+
+var cached_patches = {"dart:html": ["dart:html", "dart:html_js_interop_patch.dart", """import 'dart:js' as js_library;
+
+/**
+ * Placeholder object for cases where we need to determine exactly how many
+ * args were passed to a function.
+ */
+const _UNDEFINED_JS_CONST = const Object();
+
+patch class DivElement {
+  static Type get instanceRuntimeType => DivElementImpl;
+
+}
+class DivElementImpl extends DivElement implements js_library.JSObjectInterfacesDom {
+  DivElementImpl.internal_() : super.internal_();
+  get runtimeType => DivElement;
+  toString() => super.toString();
+}
+patch class ImageElement {
+  static Type get instanceRuntimeType => ImageElementImpl;
+
+}
+class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
+  ImageElementImpl.internal_() : super.internal_();
+  get runtimeType => ImageElement;
+  toString() => super.toString();
+}
+patch class TreeWalker {
+  static Type get instanceRuntimeType => TreeWalkerImpl;
+
+}
+class TreeWalkerImpl extends TreeWalker implements js_library.JSObjectInterfacesDom {
+  TreeWalkerImpl.internal_() : super.internal_();
+  get runtimeType => TreeWalker;
+  toString() => super.toString();
+}
+patch class TableSectionElement {
+  static Type get instanceRuntimeType => TableSectionElementImpl;
+
+}
+class TableSectionElementImpl extends TableSectionElement implements js_library.JSObjectInterfacesDom {
+  TableSectionElementImpl.internal_() : super.internal_();
+  get runtimeType => TableSectionElement;
+  toString() => super.toString();
+}
+patch class DetailsElement {
+  static Type get instanceRuntimeType => DetailsElementImpl;
+
+}
+class DetailsElementImpl extends DetailsElement implements js_library.JSObjectInterfacesDom {
+  DetailsElementImpl.internal_() : super.internal_();
+  get runtimeType => DetailsElement;
+  toString() => super.toString();
+}
+patch class XPathResult {
+  static Type get instanceRuntimeType => XPathResultImpl;
+
+}
+class XPathResultImpl extends XPathResult implements js_library.JSObjectInterfacesDom {
+  XPathResultImpl.internal_() : super.internal_();
+  get runtimeType => XPathResult;
+  toString() => super.toString();
+}
+patch class HttpRequest {
+  static Type get instanceRuntimeType => HttpRequestImpl;
+
+}
+class HttpRequestImpl extends HttpRequest implements js_library.JSObjectInterfacesDom {
+  HttpRequestImpl.internal_() : super.internal_();
+  get runtimeType => HttpRequest;
+  toString() => super.toString();
+}
+patch class SpeechSynthesisUtterance {
+  static Type get instanceRuntimeType => SpeechSynthesisUtteranceImpl;
+
+}
+class SpeechSynthesisUtteranceImpl extends SpeechSynthesisUtterance implements js_library.JSObjectInterfacesDom {
+  SpeechSynthesisUtteranceImpl.internal_() : super.internal_();
+  get runtimeType => SpeechSynthesisUtterance;
+  toString() => super.toString();
+}
+patch class CredentialsContainer {
+  static Type get instanceRuntimeType => CredentialsContainerImpl;
+
+}
+class CredentialsContainerImpl extends CredentialsContainer implements js_library.JSObjectInterfacesDom {
+  CredentialsContainerImpl.internal_() : super.internal_();
+  get runtimeType => CredentialsContainer;
+  toString() => super.toString();
+}
+patch class MessageChannel {
+  static Type get instanceRuntimeType => MessageChannelImpl;
+
+}
+class MessageChannelImpl extends MessageChannel implements js_library.JSObjectInterfacesDom {
+  MessageChannelImpl.internal_() : super.internal_();
+  get runtimeType => MessageChannel;
+  toString() => super.toString();
+}
+patch class CloseEvent {
+  static Type get instanceRuntimeType => CloseEventImpl;
+
+}
+class CloseEventImpl extends CloseEvent implements js_library.JSObjectInterfacesDom {
+  CloseEventImpl.internal_() : super.internal_();
+  get runtimeType => CloseEvent;
+  toString() => super.toString();
+}
+patch class ProgressEvent {
+  static Type get instanceRuntimeType => ProgressEventImpl;
+
+}
+class ProgressEventImpl extends ProgressEvent implements js_library.JSObjectInterfacesDom {
+  ProgressEventImpl.internal_() : super.internal_();
+  get runtimeType => ProgressEvent;
+  toString() => super.toString();
+}
+patch class MediaController {
+  static Type get instanceRuntimeType => MediaControllerImpl;
+
+}
+class MediaControllerImpl extends MediaController implements js_library.JSObjectInterfacesDom {
+  MediaControllerImpl.internal_() : super.internal_();
+  get runtimeType => MediaController;
+  toString() => super.toString();
+}
+patch class VRDevice {
+  static Type get instanceRuntimeType => VRDeviceImpl;
+
+}
+class VRDeviceImpl extends VRDevice implements js_library.JSObjectInterfacesDom {
+  VRDeviceImpl.internal_() : super.internal_();
+  get runtimeType => VRDevice;
+  toString() => super.toString();
+}
+patch class SpeechSynthesis {
+  static Type get instanceRuntimeType => SpeechSynthesisImpl;
+
+}
+class SpeechSynthesisImpl extends SpeechSynthesis implements js_library.JSObjectInterfacesDom {
+  SpeechSynthesisImpl.internal_() : super.internal_();
+  get runtimeType => SpeechSynthesis;
+  toString() => super.toString();
+}
+patch class HtmlCollection {
+  static Type get instanceRuntimeType => HtmlCollectionImpl;
+
+}
+class HtmlCollectionImpl extends HtmlCollection implements js_library.JSObjectInterfacesDom {
+  HtmlCollectionImpl.internal_() : super.internal_();
+  get runtimeType => HtmlCollection;
+  toString() => super.toString();
+}
+patch class Element {
+  static Type get instanceRuntimeType => ElementImpl;
+
+}
+class ElementImpl extends Element implements js_library.JSObjectInterfacesDom {
+  ElementImpl.internal_() : super.internal_();
+  get runtimeType => Element;
+  toString() => super.toString();
+}
+patch class Plugin {
+  static Type get instanceRuntimeType => PluginImpl;
+
+}
+class PluginImpl extends Plugin implements js_library.JSObjectInterfacesDom {
+  PluginImpl.internal_() : super.internal_();
+  get runtimeType => Plugin;
+  toString() => super.toString();
+}
+patch class CssFontFaceRule {
+  static Type get instanceRuntimeType => CssFontFaceRuleImpl;
+
+}
+class CssFontFaceRuleImpl extends CssFontFaceRule implements js_library.JSObjectInterfacesDom {
+  CssFontFaceRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssFontFaceRule;
+  toString() => super.toString();
+}
+patch class File {
+  static Type get instanceRuntimeType => FileImpl;
+
+}
+class FileImpl extends File implements js_library.JSObjectInterfacesDom {
+  FileImpl.internal_() : super.internal_();
+  get runtimeType => File;
+  toString() => super.toString();
+}
+patch class MouseEvent {
+  static Type get instanceRuntimeType => MouseEventImpl;
+
+}
+class MouseEventImpl extends MouseEvent implements js_library.JSObjectInterfacesDom {
+  MouseEventImpl.internal_() : super.internal_();
+  get runtimeType => MouseEvent;
+  toString() => super.toString();
+}
+patch class MenuElement {
+  static Type get instanceRuntimeType => MenuElementImpl;
+
+}
+class MenuElementImpl extends MenuElement implements js_library.JSObjectInterfacesDom {
+  MenuElementImpl.internal_() : super.internal_();
+  get runtimeType => MenuElement;
+  toString() => super.toString();
+}
+patch class ReadableByteStreamReader {
+  static Type get instanceRuntimeType => ReadableByteStreamReaderImpl;
+
+}
+class ReadableByteStreamReaderImpl extends ReadableByteStreamReader implements js_library.JSObjectInterfacesDom {
+  ReadableByteStreamReaderImpl.internal_() : super.internal_();
+  get runtimeType => ReadableByteStreamReader;
+  toString() => super.toString();
+}
+patch class FetchEvent {
+  static Type get instanceRuntimeType => FetchEventImpl;
+
+}
+class FetchEventImpl extends FetchEvent implements js_library.JSObjectInterfacesDom {
+  FetchEventImpl.internal_() : super.internal_();
+  get runtimeType => FetchEvent;
+  toString() => super.toString();
+}
+patch class MediaStreamTrack {
+  static Type get instanceRuntimeType => MediaStreamTrackImpl;
+
+}
+class MediaStreamTrackImpl extends MediaStreamTrack implements js_library.JSObjectInterfacesDom {
+  MediaStreamTrackImpl.internal_() : super.internal_();
+  get runtimeType => MediaStreamTrack;
+  toString() => super.toString();
+}
+patch class ShadowRoot {
+  static Type get instanceRuntimeType => ShadowRootImpl;
+
+}
+class ShadowRootImpl extends ShadowRoot implements js_library.JSObjectInterfacesDom {
+  ShadowRootImpl.internal_() : super.internal_();
+  get runtimeType => ShadowRoot;
+  toString() => super.toString();
+}
+patch class SpeechSynthesisEvent {
+  static Type get instanceRuntimeType => SpeechSynthesisEventImpl;
+
+}
+class SpeechSynthesisEventImpl extends SpeechSynthesisEvent implements js_library.JSObjectInterfacesDom {
+  SpeechSynthesisEventImpl.internal_() : super.internal_();
+  get runtimeType => SpeechSynthesisEvent;
+  toString() => super.toString();
+}
+patch class VRPositionState {
+  static Type get instanceRuntimeType => VRPositionStateImpl;
+
+}
+class VRPositionStateImpl extends VRPositionState implements js_library.JSObjectInterfacesDom {
+  VRPositionStateImpl.internal_() : super.internal_();
+  get runtimeType => VRPositionState;
+  toString() => super.toString();
+}
+patch class Window {
+  static Type get instanceRuntimeType => WindowImpl;
+
+}
+class WindowImpl extends Window implements js_library.JSObjectInterfacesDom {
+  WindowImpl.internal_() : super.internal_();
+  get runtimeType => Window;
+  toString() => super.toString();
+}
+patch class SpeechRecognition {
+  static Type get instanceRuntimeType => SpeechRecognitionImpl;
+
+}
+class SpeechRecognitionImpl extends SpeechRecognition implements js_library.JSObjectInterfacesDom {
+  SpeechRecognitionImpl.internal_() : super.internal_();
+  get runtimeType => SpeechRecognition;
+  toString() => super.toString();
+}
+patch class Console {
+  static Type get instanceRuntimeType => ConsoleImpl;
+
+}
+class ConsoleImpl extends Console implements js_library.JSObjectInterfacesDom {
+  ConsoleImpl.internal_() : super.internal_();
+  get runtimeType => Console;
+  toString() => super.toString();
+}
+patch class AutocompleteErrorEvent {
+  static Type get instanceRuntimeType => AutocompleteErrorEventImpl;
+
+}
+class AutocompleteErrorEventImpl extends AutocompleteErrorEvent implements js_library.JSObjectInterfacesDom {
+  AutocompleteErrorEventImpl.internal_() : super.internal_();
+  get runtimeType => AutocompleteErrorEvent;
+  toString() => super.toString();
+}
+patch class CanvasGradient {
+  static Type get instanceRuntimeType => CanvasGradientImpl;
+
+}
+class CanvasGradientImpl extends CanvasGradient implements js_library.JSObjectInterfacesDom {
+  CanvasGradientImpl.internal_() : super.internal_();
+  get runtimeType => CanvasGradient;
+  toString() => super.toString();
+}
+patch class MediaStream {
+  static Type get instanceRuntimeType => MediaStreamImpl;
+
+}
+class MediaStreamImpl extends MediaStream implements js_library.JSObjectInterfacesDom {
+  MediaStreamImpl.internal_() : super.internal_();
+  get runtimeType => MediaStream;
+  toString() => super.toString();
+}
+patch class _ClientRectList {
+  static Type get instanceRuntimeType => _ClientRectListImpl;
+
+}
+class _ClientRectListImpl extends _ClientRectList implements js_library.JSObjectInterfacesDom {
+  _ClientRectListImpl.internal_() : super.internal_();
+  get runtimeType => _ClientRectList;
+  toString() => super.toString();
+}
+patch class Document {
+  static Type get instanceRuntimeType => DocumentImpl;
+
+}
+class DocumentImpl extends Document implements js_library.JSObjectInterfacesDom {
+  DocumentImpl.internal_() : super.internal_();
+  get runtimeType => Document;
+  toString() => super.toString();
+}
+patch class MessageEvent {
+  static Type get instanceRuntimeType => MessageEventImpl;
+
+}
+class MessageEventImpl extends MessageEvent implements js_library.JSObjectInterfacesDom {
+  MessageEventImpl.internal_() : super.internal_();
+  get runtimeType => MessageEvent;
+  toString() => super.toString();
+}
+patch class RtcDtmfSender {
+  static Type get instanceRuntimeType => RtcDtmfSenderImpl;
+
+}
+class RtcDtmfSenderImpl extends RtcDtmfSender implements js_library.JSObjectInterfacesDom {
+  RtcDtmfSenderImpl.internal_() : super.internal_();
+  get runtimeType => RtcDtmfSender;
+  toString() => super.toString();
+}
+patch class ParamElement {
+  static Type get instanceRuntimeType => ParamElementImpl;
+
+}
+class ParamElementImpl extends ParamElement implements js_library.JSObjectInterfacesDom {
+  ParamElementImpl.internal_() : super.internal_();
+  get runtimeType => ParamElement;
+  toString() => super.toString();
+}
+patch class TextTrack {
+  static Type get instanceRuntimeType => TextTrackImpl;
+
+}
+class TextTrackImpl extends TextTrack implements js_library.JSObjectInterfacesDom {
+  TextTrackImpl.internal_() : super.internal_();
+  get runtimeType => TextTrack;
+  toString() => super.toString();
+}
+patch class ModElement {
+  static Type get instanceRuntimeType => ModElementImpl;
+
+}
+class ModElementImpl extends ModElement implements js_library.JSObjectInterfacesDom {
+  ModElementImpl.internal_() : super.internal_();
+  get runtimeType => ModElement;
+  toString() => super.toString();
+}
+patch class ScriptElement {
+  static Type get instanceRuntimeType => ScriptElementImpl;
+
+}
+class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
+  ScriptElementImpl.internal_() : super.internal_();
+  get runtimeType => ScriptElement;
+  toString() => super.toString();
+}
+patch class VRFieldOfView {
+  static Type get instanceRuntimeType => VRFieldOfViewImpl;
+
+}
+class VRFieldOfViewImpl extends VRFieldOfView implements js_library.JSObjectInterfacesDom {
+  VRFieldOfViewImpl.internal_() : super.internal_();
+  get runtimeType => VRFieldOfView;
+  toString() => super.toString();
+}
+patch class SyncRegistration {
+  static Type get instanceRuntimeType => SyncRegistrationImpl;
+
+}
+class SyncRegistrationImpl extends SyncRegistration implements js_library.JSObjectInterfacesDom {
+  SyncRegistrationImpl.internal_() : super.internal_();
+  get runtimeType => SyncRegistration;
+  toString() => super.toString();
+}
+patch class Touch {
+  static Type get instanceRuntimeType => TouchImpl;
+
+}
+class TouchImpl extends Touch implements js_library.JSObjectInterfacesDom {
+  TouchImpl.internal_() : super.internal_();
+  get runtimeType => Touch;
+  toString() => super.toString();
+}
+patch class BarProp {
+  static Type get instanceRuntimeType => BarPropImpl;
+
+}
+class BarPropImpl extends BarProp implements js_library.JSObjectInterfacesDom {
+  BarPropImpl.internal_() : super.internal_();
+  get runtimeType => BarProp;
+  toString() => super.toString();
+}
+patch class DeviceLightEvent {
+  static Type get instanceRuntimeType => DeviceLightEventImpl;
+
+}
+class DeviceLightEventImpl extends DeviceLightEvent implements js_library.JSObjectInterfacesDom {
+  DeviceLightEventImpl.internal_() : super.internal_();
+  get runtimeType => DeviceLightEvent;
+  toString() => super.toString();
+}
+patch class MediaDevices {
+  static Type get instanceRuntimeType => MediaDevicesImpl;
+
+}
+class MediaDevicesImpl extends MediaDevices implements js_library.JSObjectInterfacesDom {
+  MediaDevicesImpl.internal_() : super.internal_();
+  get runtimeType => MediaDevices;
+  toString() => super.toString();
+}
+patch class Url {
+  static Type get instanceRuntimeType => UrlImpl;
+
+}
+class UrlImpl extends Url implements js_library.JSObjectInterfacesDom {
+  UrlImpl.internal_() : super.internal_();
+  get runtimeType => Url;
+  toString() => super.toString();
+}
+patch class EmbedElement {
+  static Type get instanceRuntimeType => EmbedElementImpl;
+
+}
+class EmbedElementImpl extends EmbedElement implements js_library.JSObjectInterfacesDom {
+  EmbedElementImpl.internal_() : super.internal_();
+  get runtimeType => EmbedElement;
+  toString() => super.toString();
+}
+patch class Metadata {
+  static Type get instanceRuntimeType => MetadataImpl;
+
+}
+class MetadataImpl extends Metadata implements js_library.JSObjectInterfacesDom {
+  MetadataImpl.internal_() : super.internal_();
+  get runtimeType => Metadata;
+  toString() => super.toString();
+}
+patch class _FileEntrySync {
+  static Type get instanceRuntimeType => _FileEntrySyncImpl;
+
+}
+class _FileEntrySyncImpl extends _FileEntrySync implements js_library.JSObjectInterfacesDom {
+  _FileEntrySyncImpl.internal_() : super.internal_();
+  get runtimeType => _FileEntrySync;
+  toString() => super.toString();
+}
+patch class BaseElement {
+  static Type get instanceRuntimeType => BaseElementImpl;
+
+}
+class BaseElementImpl extends BaseElement implements js_library.JSObjectInterfacesDom {
+  BaseElementImpl.internal_() : super.internal_();
+  get runtimeType => BaseElement;
+  toString() => super.toString();
+}
+patch class BRElement {
+  static Type get instanceRuntimeType => BRElementImpl;
+
+}
+class BRElementImpl extends BRElement implements js_library.JSObjectInterfacesDom {
+  BRElementImpl.internal_() : super.internal_();
+  get runtimeType => BRElement;
+  toString() => super.toString();
+}
+patch class Presentation {
+  static Type get instanceRuntimeType => PresentationImpl;
+
+}
+class PresentationImpl extends Presentation implements js_library.JSObjectInterfacesDom {
+  PresentationImpl.internal_() : super.internal_();
+  get runtimeType => Presentation;
+  toString() => super.toString();
+}
+patch class CircularGeofencingRegion {
+  static Type get instanceRuntimeType => CircularGeofencingRegionImpl;
+
+}
+class CircularGeofencingRegionImpl extends CircularGeofencingRegion implements js_library.JSObjectInterfacesDom {
+  CircularGeofencingRegionImpl.internal_() : super.internal_();
+  get runtimeType => CircularGeofencingRegion;
+  toString() => super.toString();
+}
+patch class PushManager {
+  static Type get instanceRuntimeType => PushManagerImpl;
+
+}
+class PushManagerImpl extends PushManager implements js_library.JSObjectInterfacesDom {
+  PushManagerImpl.internal_() : super.internal_();
+  get runtimeType => PushManager;
+  toString() => super.toString();
+}
+patch class PasswordCredential {
+  static Type get instanceRuntimeType => PasswordCredentialImpl;
+
+}
+class PasswordCredentialImpl extends PasswordCredential implements js_library.JSObjectInterfacesDom {
+  PasswordCredentialImpl.internal_() : super.internal_();
+  get runtimeType => PasswordCredential;
+  toString() => super.toString();
+}
+patch class ObjectElement {
+  static Type get instanceRuntimeType => ObjectElementImpl;
+
+}
+class ObjectElementImpl extends ObjectElement implements js_library.JSObjectInterfacesDom {
+  ObjectElementImpl.internal_() : super.internal_();
+  get runtimeType => ObjectElement;
+  toString() => super.toString();
+}
+patch class DomMatrix {
+  static Type get instanceRuntimeType => DomMatrixImpl;
+
+}
+class DomMatrixImpl extends DomMatrix implements js_library.JSObjectInterfacesDom {
+  DomMatrixImpl.internal_() : super.internal_();
+  get runtimeType => DomMatrix;
+  toString() => super.toString();
+}
+patch class AbstractWorker {
+  static Type get instanceRuntimeType => AbstractWorkerImpl;
+
+}
+class AbstractWorkerImpl extends AbstractWorker implements js_library.JSObjectInterfacesDom {
+  AbstractWorkerImpl.internal_() : super.internal_();
+  get runtimeType => AbstractWorker;
+  toString() => super.toString();
+}
+patch class ResourceProgressEvent {
+  static Type get instanceRuntimeType => ResourceProgressEventImpl;
+
+}
+class ResourceProgressEventImpl extends ResourceProgressEvent implements js_library.JSObjectInterfacesDom {
+  ResourceProgressEventImpl.internal_() : super.internal_();
+  get runtimeType => ResourceProgressEvent;
+  toString() => super.toString();
+}
+patch class ValidityState {
+  static Type get instanceRuntimeType => ValidityStateImpl;
+
+}
+class ValidityStateImpl extends ValidityState implements js_library.JSObjectInterfacesDom {
+  ValidityStateImpl.internal_() : super.internal_();
+  get runtimeType => ValidityState;
+  toString() => super.toString();
+}
+patch class HRElement {
+  static Type get instanceRuntimeType => HRElementImpl;
+
+}
+class HRElementImpl extends HRElement implements js_library.JSObjectInterfacesDom {
+  HRElementImpl.internal_() : super.internal_();
+  get runtimeType => HRElement;
+  toString() => super.toString();
+}
+patch class OptGroupElement {
+  static Type get instanceRuntimeType => OptGroupElementImpl;
+
+}
+class OptGroupElementImpl extends OptGroupElement implements js_library.JSObjectInterfacesDom {
+  OptGroupElementImpl.internal_() : super.internal_();
+  get runtimeType => OptGroupElement;
+  toString() => super.toString();
+}
+patch class Crypto {
+  static Type get instanceRuntimeType => CryptoImpl;
+
+}
+class CryptoImpl extends Crypto implements js_library.JSObjectInterfacesDom {
+  CryptoImpl.internal_() : super.internal_();
+  get runtimeType => Crypto;
+  toString() => super.toString();
+}
+patch class PerformanceTiming {
+  static Type get instanceRuntimeType => PerformanceTimingImpl;
+
+}
+class PerformanceTimingImpl extends PerformanceTiming implements js_library.JSObjectInterfacesDom {
+  PerformanceTimingImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceTiming;
+  toString() => super.toString();
+}
+patch class RtcDataChannel {
+  static Type get instanceRuntimeType => RtcDataChannelImpl;
+
+}
+class RtcDataChannelImpl extends RtcDataChannel implements js_library.JSObjectInterfacesDom {
+  RtcDataChannelImpl.internal_() : super.internal_();
+  get runtimeType => RtcDataChannel;
+  toString() => super.toString();
+}
+patch class NavigatorOnLine {
+  static Type get instanceRuntimeType => NavigatorOnLineImpl;
+
+}
+class NavigatorOnLineImpl extends NavigatorOnLine implements js_library.JSObjectInterfacesDom {
+  NavigatorOnLineImpl.internal_() : super.internal_();
+  get runtimeType => NavigatorOnLine;
+  toString() => super.toString();
+}
+patch class _HTMLAppletElement {
+  static Type get instanceRuntimeType => _HTMLAppletElementImpl;
+
+}
+class _HTMLAppletElementImpl extends _HTMLAppletElement implements js_library.JSObjectInterfacesDom {
+  _HTMLAppletElementImpl.internal_() : super.internal_();
+  get runtimeType => _HTMLAppletElement;
+  toString() => super.toString();
+}
+patch class SpeechSynthesisVoice {
+  static Type get instanceRuntimeType => SpeechSynthesisVoiceImpl;
+
+}
+class SpeechSynthesisVoiceImpl extends SpeechSynthesisVoice implements js_library.JSObjectInterfacesDom {
+  SpeechSynthesisVoiceImpl.internal_() : super.internal_();
+  get runtimeType => SpeechSynthesisVoice;
+  toString() => super.toString();
+}
+patch class FontFaceSetLoadEvent {
+  static Type get instanceRuntimeType => FontFaceSetLoadEventImpl;
+
+}
+class FontFaceSetLoadEventImpl extends FontFaceSetLoadEvent implements js_library.JSObjectInterfacesDom {
+  FontFaceSetLoadEventImpl.internal_() : super.internal_();
+  get runtimeType => FontFaceSetLoadEvent;
+  toString() => super.toString();
+}
+patch class NavigatorStorageUtils {
+  static Type get instanceRuntimeType => NavigatorStorageUtilsImpl;
+
+}
+class NavigatorStorageUtilsImpl extends NavigatorStorageUtils implements js_library.JSObjectInterfacesDom {
+  NavigatorStorageUtilsImpl.internal_() : super.internal_();
+  get runtimeType => NavigatorStorageUtils;
+  toString() => super.toString();
+}
+patch class SourceElement {
+  static Type get instanceRuntimeType => SourceElementImpl;
+
+}
+class SourceElementImpl extends SourceElement implements js_library.JSObjectInterfacesDom {
+  SourceElementImpl.internal_() : super.internal_();
+  get runtimeType => SourceElement;
+  toString() => super.toString();
+}
+patch class InjectedScriptHost {
+  static Type get instanceRuntimeType => InjectedScriptHostImpl;
+
+}
+class InjectedScriptHostImpl extends InjectedScriptHost implements js_library.JSObjectInterfacesDom {
+  InjectedScriptHostImpl.internal_() : super.internal_();
+  get runtimeType => InjectedScriptHost;
+  toString() => super.toString();
+}
+patch class UIEvent {
+  static Type get instanceRuntimeType => UIEventImpl;
+
+}
+class UIEventImpl extends UIEvent implements js_library.JSObjectInterfacesDom {
+  UIEventImpl.internal_() : super.internal_();
+  get runtimeType => UIEvent;
+  toString() => super.toString();
+}
+patch class HtmlHtmlElement {
+  static Type get instanceRuntimeType => HtmlHtmlElementImpl;
+
+}
+class HtmlHtmlElementImpl extends HtmlHtmlElement implements js_library.JSObjectInterfacesDom {
+  HtmlHtmlElementImpl.internal_() : super.internal_();
+  get runtimeType => HtmlHtmlElement;
+  toString() => super.toString();
+}
+patch class ClipboardEvent {
+  static Type get instanceRuntimeType => ClipboardEventImpl;
+
+}
+class ClipboardEventImpl extends ClipboardEvent implements js_library.JSObjectInterfacesDom {
+  ClipboardEventImpl.internal_() : super.internal_();
+  get runtimeType => ClipboardEvent;
+  toString() => super.toString();
+}
+patch class OptionElement {
+  static Type get instanceRuntimeType => OptionElementImpl;
+
+}
+class OptionElementImpl extends OptionElement implements js_library.JSObjectInterfacesDom {
+  OptionElementImpl.internal_() : super.internal_();
+  get runtimeType => OptionElement;
+  toString() => super.toString();
+}
+patch class MediaSource {
+  static Type get instanceRuntimeType => MediaSourceImpl;
+
+}
+class MediaSourceImpl extends MediaSource implements js_library.JSObjectInterfacesDom {
+  MediaSourceImpl.internal_() : super.internal_();
+  get runtimeType => MediaSource;
+  toString() => super.toString();
+}
+patch class MediaKeyMessageEvent {
+  static Type get instanceRuntimeType => MediaKeyMessageEventImpl;
+
+}
+class MediaKeyMessageEventImpl extends MediaKeyMessageEvent implements js_library.JSObjectInterfacesDom {
+  MediaKeyMessageEventImpl.internal_() : super.internal_();
+  get runtimeType => MediaKeyMessageEvent;
+  toString() => super.toString();
+}
+patch class CustomEvent {
+  static Type get instanceRuntimeType => CustomEventImpl;
+
+}
+class CustomEventImpl extends CustomEvent implements js_library.JSObjectInterfacesDom {
+  CustomEventImpl.internal_() : super.internal_();
+  get runtimeType => CustomEvent;
+  toString() => super.toString();
+}
+patch class VttRegion {
+  static Type get instanceRuntimeType => VttRegionImpl;
+
+}
+class VttRegionImpl extends VttRegion implements js_library.JSObjectInterfacesDom {
+  VttRegionImpl.internal_() : super.internal_();
+  get runtimeType => VttRegion;
+  toString() => super.toString();
+}
+patch class HeadingElement {
+  static Type get instanceRuntimeType => HeadingElementImpl;
+
+}
+class HeadingElementImpl extends HeadingElement implements js_library.JSObjectInterfacesDom {
+  HeadingElementImpl.internal_() : super.internal_();
+  get runtimeType => HeadingElement;
+  toString() => super.toString();
+}
+patch class History {
+  static Type get instanceRuntimeType => HistoryImpl;
+
+}
+class HistoryImpl extends History implements js_library.JSObjectInterfacesDom {
+  HistoryImpl.internal_() : super.internal_();
+  get runtimeType => History;
+  toString() => super.toString();
+}
+patch class ServiceWorkerRegistration {
+  static Type get instanceRuntimeType => ServiceWorkerRegistrationImpl;
+
+}
+class ServiceWorkerRegistrationImpl extends ServiceWorkerRegistration implements js_library.JSObjectInterfacesDom {
+  ServiceWorkerRegistrationImpl.internal_() : super.internal_();
+  get runtimeType => ServiceWorkerRegistration;
+  toString() => super.toString();
+}
+patch class _WorkerNavigator {
+  static Type get instanceRuntimeType => _WorkerNavigatorImpl;
+
+}
+class _WorkerNavigatorImpl extends _WorkerNavigator implements js_library.JSObjectInterfacesDom {
+  _WorkerNavigatorImpl.internal_() : super.internal_();
+  get runtimeType => _WorkerNavigator;
+  toString() => super.toString();
+}
+patch class RtcStatsResponse {
+  static Type get instanceRuntimeType => RtcStatsResponseImpl;
+
+}
+class RtcStatsResponseImpl extends RtcStatsResponse implements js_library.JSObjectInterfacesDom {
+  RtcStatsResponseImpl.internal_() : super.internal_();
+  get runtimeType => RtcStatsResponse;
+  toString() => super.toString();
+}
+patch class DirectoryReader {
+  static Type get instanceRuntimeType => DirectoryReaderImpl;
+
+}
+class DirectoryReaderImpl extends DirectoryReader implements js_library.JSObjectInterfacesDom {
+  DirectoryReaderImpl.internal_() : super.internal_();
+  get runtimeType => DirectoryReader;
+  toString() => super.toString();
+}
+patch class Headers {
+  static Type get instanceRuntimeType => HeadersImpl;
+
+}
+class HeadersImpl extends Headers implements js_library.JSObjectInterfacesDom {
+  HeadersImpl.internal_() : super.internal_();
+  get runtimeType => Headers;
+  toString() => super.toString();
+}
+patch class DataListElement {
+  static Type get instanceRuntimeType => DataListElementImpl;
+
+}
+class DataListElementImpl extends DataListElement implements js_library.JSObjectInterfacesDom {
+  DataListElementImpl.internal_() : super.internal_();
+  get runtimeType => DataListElement;
+  toString() => super.toString();
+}
+patch class MediaList {
+  static Type get instanceRuntimeType => MediaListImpl;
+
+}
+class MediaListImpl extends MediaList implements js_library.JSObjectInterfacesDom {
+  MediaListImpl.internal_() : super.internal_();
+  get runtimeType => MediaList;
+  toString() => super.toString();
+}
+patch class ParentNode {
+  static Type get instanceRuntimeType => ParentNodeImpl;
+
+}
+class ParentNodeImpl extends ParentNode implements js_library.JSObjectInterfacesDom {
+  ParentNodeImpl.internal_() : super.internal_();
+  get runtimeType => ParentNode;
+  toString() => super.toString();
+}
+patch class _FileReaderSync {
+  static Type get instanceRuntimeType => _FileReaderSyncImpl;
+
+}
+class _FileReaderSyncImpl extends _FileReaderSync implements js_library.JSObjectInterfacesDom {
+  _FileReaderSyncImpl.internal_() : super.internal_();
+  get runtimeType => _FileReaderSync;
+  toString() => super.toString();
+}
+patch class DataTransferItemList {
+  static Type get instanceRuntimeType => DataTransferItemListImpl;
+
+}
+class DataTransferItemListImpl extends DataTransferItemList implements js_library.JSObjectInterfacesDom {
+  DataTransferItemListImpl.internal_() : super.internal_();
+  get runtimeType => DataTransferItemList;
+  toString() => super.toString();
+}
+patch class GlobalEventHandlers {
+  static Type get instanceRuntimeType => GlobalEventHandlersImpl;
+
+}
+class GlobalEventHandlersImpl extends GlobalEventHandlers implements js_library.JSObjectInterfacesDom {
+  GlobalEventHandlersImpl.internal_() : super.internal_();
+  get runtimeType => GlobalEventHandlers;
+  toString() => super.toString();
+}
+patch class DocumentFragment {
+  static Type get instanceRuntimeType => DocumentFragmentImpl;
+
+}
+class DocumentFragmentImpl extends DocumentFragment implements js_library.JSObjectInterfacesDom {
+  DocumentFragmentImpl.internal_() : super.internal_();
+  get runtimeType => DocumentFragment;
+  toString() => super.toString();
+}
+patch class DomImplementation {
+  static Type get instanceRuntimeType => DomImplementationImpl;
+
+}
+class DomImplementationImpl extends DomImplementation implements js_library.JSObjectInterfacesDom {
+  DomImplementationImpl.internal_() : super.internal_();
+  get runtimeType => DomImplementation;
+  toString() => super.toString();
+}
+patch class PeriodicSyncEvent {
+  static Type get instanceRuntimeType => PeriodicSyncEventImpl;
+
+}
+class PeriodicSyncEventImpl extends PeriodicSyncEvent implements js_library.JSObjectInterfacesDom {
+  PeriodicSyncEventImpl.internal_() : super.internal_();
+  get runtimeType => PeriodicSyncEvent;
+  toString() => super.toString();
+}
+patch class DialogElement {
+  static Type get instanceRuntimeType => DialogElementImpl;
+
+}
+class DialogElementImpl extends DialogElement implements js_library.JSObjectInterfacesDom {
+  DialogElementImpl.internal_() : super.internal_();
+  get runtimeType => DialogElement;
+  toString() => super.toString();
+}
+patch class PeriodicSyncRegistration {
+  static Type get instanceRuntimeType => PeriodicSyncRegistrationImpl;
+
+}
+class PeriodicSyncRegistrationImpl extends PeriodicSyncRegistration implements js_library.JSObjectInterfacesDom {
+  PeriodicSyncRegistrationImpl.internal_() : super.internal_();
+  get runtimeType => PeriodicSyncRegistration;
+  toString() => super.toString();
+}
+patch class MessagePort {
+  static Type get instanceRuntimeType => MessagePortImpl;
+
+}
+class MessagePortImpl extends MessagePort implements js_library.JSObjectInterfacesDom {
+  MessagePortImpl.internal_() : super.internal_();
+  get runtimeType => MessagePort;
+  toString() => super.toString();
+}
+patch class FileReader {
+  static Type get instanceRuntimeType => FileReaderImpl;
+
+}
+class FileReaderImpl extends FileReader implements js_library.JSObjectInterfacesDom {
+  FileReaderImpl.internal_() : super.internal_();
+  get runtimeType => FileReader;
+  toString() => super.toString();
+}
+patch class HtmlOptionsCollection {
+  static Type get instanceRuntimeType => HtmlOptionsCollectionImpl;
+
+}
+class HtmlOptionsCollectionImpl extends HtmlOptionsCollection implements js_library.JSObjectInterfacesDom {
+  HtmlOptionsCollectionImpl.internal_() : super.internal_();
+  get runtimeType => HtmlOptionsCollection;
+  toString() => super.toString();
+}
+patch class _HTMLFrameSetElement {
+  static Type get instanceRuntimeType => _HTMLFrameSetElementImpl;
+
+}
+class _HTMLFrameSetElementImpl extends _HTMLFrameSetElement implements js_library.JSObjectInterfacesDom {
+  _HTMLFrameSetElementImpl.internal_() : super.internal_();
+  get runtimeType => _HTMLFrameSetElement;
+  toString() => super.toString();
+}
+patch class PerformanceMeasure {
+  static Type get instanceRuntimeType => PerformanceMeasureImpl;
+
+}
+class PerformanceMeasureImpl extends PerformanceMeasure implements js_library.JSObjectInterfacesDom {
+  PerformanceMeasureImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceMeasure;
+  toString() => super.toString();
+}
+patch class ServiceWorkerContainer {
+  static Type get instanceRuntimeType => ServiceWorkerContainerImpl;
+
+}
+class ServiceWorkerContainerImpl extends ServiceWorkerContainer implements js_library.JSObjectInterfacesDom {
+  ServiceWorkerContainerImpl.internal_() : super.internal_();
+  get runtimeType => ServiceWorkerContainer;
+  toString() => super.toString();
+}
+patch class TrackDefaultList {
+  static Type get instanceRuntimeType => TrackDefaultListImpl;
+
+}
+class TrackDefaultListImpl extends TrackDefaultList implements js_library.JSObjectInterfacesDom {
+  TrackDefaultListImpl.internal_() : super.internal_();
+  get runtimeType => TrackDefaultList;
+  toString() => super.toString();
+}
+patch class RelatedEvent {
+  static Type get instanceRuntimeType => RelatedEventImpl;
+
+}
+class RelatedEventImpl extends RelatedEvent implements js_library.JSObjectInterfacesDom {
+  RelatedEventImpl.internal_() : super.internal_();
+  get runtimeType => RelatedEvent;
+  toString() => super.toString();
+}
+patch class TableCaptionElement {
+  static Type get instanceRuntimeType => TableCaptionElementImpl;
+
+}
+class TableCaptionElementImpl extends TableCaptionElement implements js_library.JSObjectInterfacesDom {
+  TableCaptionElementImpl.internal_() : super.internal_();
+  get runtimeType => TableCaptionElement;
+  toString() => super.toString();
+}
+patch class ScrollState {
+  static Type get instanceRuntimeType => ScrollStateImpl;
+
+}
+class ScrollStateImpl extends ScrollState implements js_library.JSObjectInterfacesDom {
+  ScrollStateImpl.internal_() : super.internal_();
+  get runtimeType => ScrollState;
+  toString() => super.toString();
+}
+patch class MenuItemElement {
+  static Type get instanceRuntimeType => MenuItemElementImpl;
+
+}
+class MenuItemElementImpl extends MenuItemElement implements js_library.JSObjectInterfacesDom {
+  MenuItemElementImpl.internal_() : super.internal_();
+  get runtimeType => MenuItemElement;
+  toString() => super.toString();
+}
+patch class MediaKeyStatusMap {
+  static Type get instanceRuntimeType => MediaKeyStatusMapImpl;
+
+}
+class MediaKeyStatusMapImpl extends MediaKeyStatusMap implements js_library.JSObjectInterfacesDom {
+  MediaKeyStatusMapImpl.internal_() : super.internal_();
+  get runtimeType => MediaKeyStatusMap;
+  toString() => super.toString();
+}
+patch class RtcDataChannelEvent {
+  static Type get instanceRuntimeType => RtcDataChannelEventImpl;
+
+}
+class RtcDataChannelEventImpl extends RtcDataChannelEvent implements js_library.JSObjectInterfacesDom {
+  RtcDataChannelEventImpl.internal_() : super.internal_();
+  get runtimeType => RtcDataChannelEvent;
+  toString() => super.toString();
+}
+patch class MediaElement {
+  static Type get instanceRuntimeType => MediaElementImpl;
+
+}
+class MediaElementImpl extends MediaElement implements js_library.JSObjectInterfacesDom {
+  MediaElementImpl.internal_() : super.internal_();
+  get runtimeType => MediaElement;
+  toString() => super.toString();
+}
+patch class MediaDeviceInfo {
+  static Type get instanceRuntimeType => MediaDeviceInfoImpl;
+
+}
+class MediaDeviceInfoImpl extends MediaDeviceInfo implements js_library.JSObjectInterfacesDom {
+  MediaDeviceInfoImpl.internal_() : super.internal_();
+  get runtimeType => MediaDeviceInfo;
+  toString() => super.toString();
+}
+patch class StorageEvent {
+  static Type get instanceRuntimeType => StorageEventImpl;
+
+}
+class StorageEventImpl extends StorageEvent implements js_library.JSObjectInterfacesDom {
+  StorageEventImpl.internal_() : super.internal_();
+  get runtimeType => StorageEvent;
+  toString() => super.toString();
+}
+patch class FormData {
+  static Type get instanceRuntimeType => FormDataImpl;
+
+}
+class FormDataImpl extends FormData implements js_library.JSObjectInterfacesDom {
+  FormDataImpl.internal_() : super.internal_();
+  get runtimeType => FormData;
+  toString() => super.toString();
+}
+patch class PushEvent {
+  static Type get instanceRuntimeType => PushEventImpl;
+
+}
+class PushEventImpl extends PushEvent implements js_library.JSObjectInterfacesDom {
+  PushEventImpl.internal_() : super.internal_();
+  get runtimeType => PushEvent;
+  toString() => super.toString();
+}
+patch class CssPageRule {
+  static Type get instanceRuntimeType => CssPageRuleImpl;
+
+}
+class CssPageRuleImpl extends CssPageRule implements js_library.JSObjectInterfacesDom {
+  CssPageRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssPageRule;
+  toString() => super.toString();
+}
+patch class PageTransitionEvent {
+  static Type get instanceRuntimeType => PageTransitionEventImpl;
+
+}
+class PageTransitionEventImpl extends PageTransitionEvent implements js_library.JSObjectInterfacesDom {
+  PageTransitionEventImpl.internal_() : super.internal_();
+  get runtimeType => PageTransitionEvent;
+  toString() => super.toString();
+}
+patch class MemoryInfo {
+  static Type get instanceRuntimeType => MemoryInfoImpl;
+
+}
+class MemoryInfoImpl extends MemoryInfo implements js_library.JSObjectInterfacesDom {
+  MemoryInfoImpl.internal_() : super.internal_();
+  get runtimeType => MemoryInfo;
+  toString() => super.toString();
+}
+patch class ChromiumValuebuffer {
+  static Type get instanceRuntimeType => ChromiumValuebufferImpl;
+
+}
+class ChromiumValuebufferImpl extends ChromiumValuebuffer implements js_library.JSObjectInterfacesDom {
+  ChromiumValuebufferImpl.internal_() : super.internal_();
+  get runtimeType => ChromiumValuebuffer;
+  toString() => super.toString();
+}
+patch class KeyframeEffect {
+  static Type get instanceRuntimeType => KeyframeEffectImpl;
+
+}
+class KeyframeEffectImpl extends KeyframeEffect implements js_library.JSObjectInterfacesDom {
+  KeyframeEffectImpl.internal_() : super.internal_();
+  get runtimeType => KeyframeEffect;
+  toString() => super.toString();
+}
+patch class XPathEvaluator {
+  static Type get instanceRuntimeType => XPathEvaluatorImpl;
+
+}
+class XPathEvaluatorImpl extends XPathEvaluator implements js_library.JSObjectInterfacesDom {
+  XPathEvaluatorImpl.internal_() : super.internal_();
+  get runtimeType => XPathEvaluator;
+  toString() => super.toString();
+}
+patch class ContentElement {
+  static Type get instanceRuntimeType => ContentElementImpl;
+
+}
+class ContentElementImpl extends ContentElement implements js_library.JSObjectInterfacesDom {
+  ContentElementImpl.internal_() : super.internal_();
+  get runtimeType => ContentElement;
+  toString() => super.toString();
+}
+patch class CompositionEvent {
+  static Type get instanceRuntimeType => CompositionEventImpl;
+
+}
+class CompositionEventImpl extends CompositionEvent implements js_library.JSObjectInterfacesDom {
+  CompositionEventImpl.internal_() : super.internal_();
+  get runtimeType => CompositionEvent;
+  toString() => super.toString();
+}
+patch class FileWriter {
+  static Type get instanceRuntimeType => FileWriterImpl;
+
+}
+class FileWriterImpl extends FileWriter implements js_library.JSObjectInterfacesDom {
+  FileWriterImpl.internal_() : super.internal_();
+  get runtimeType => FileWriter;
+  toString() => super.toString();
+}
+patch class SpanElement {
+  static Type get instanceRuntimeType => SpanElementImpl;
+
+}
+class SpanElementImpl extends SpanElement implements js_library.JSObjectInterfacesDom {
+  SpanElementImpl.internal_() : super.internal_();
+  get runtimeType => SpanElement;
+  toString() => super.toString();
+}
+patch class _WebKitCSSMatrix {
+  static Type get instanceRuntimeType => _WebKitCSSMatrixImpl;
+
+}
+class _WebKitCSSMatrixImpl extends _WebKitCSSMatrix implements js_library.JSObjectInterfacesDom {
+  _WebKitCSSMatrixImpl.internal_() : super.internal_();
+  get runtimeType => _WebKitCSSMatrix;
+  toString() => super.toString();
+}
+patch class WorkerPerformance {
+  static Type get instanceRuntimeType => WorkerPerformanceImpl;
+
+}
+class WorkerPerformanceImpl extends WorkerPerformance implements js_library.JSObjectInterfacesDom {
+  WorkerPerformanceImpl.internal_() : super.internal_();
+  get runtimeType => WorkerPerformance;
+  toString() => super.toString();
+}
+patch class TransitionEvent {
+  static Type get instanceRuntimeType => TransitionEventImpl;
+
+}
+class TransitionEventImpl extends TransitionEvent implements js_library.JSObjectInterfacesDom {
+  TransitionEventImpl.internal_() : super.internal_();
+  get runtimeType => TransitionEvent;
+  toString() => super.toString();
+}
+patch class GamepadEvent {
+  static Type get instanceRuntimeType => GamepadEventImpl;
+
+}
+class GamepadEventImpl extends GamepadEvent implements js_library.JSObjectInterfacesDom {
+  GamepadEventImpl.internal_() : super.internal_();
+  get runtimeType => GamepadEvent;
+  toString() => super.toString();
+}
+patch class _HTMLFontElement {
+  static Type get instanceRuntimeType => _HTMLFontElementImpl;
+
+}
+class _HTMLFontElementImpl extends _HTMLFontElement implements js_library.JSObjectInterfacesDom {
+  _HTMLFontElementImpl.internal_() : super.internal_();
+  get runtimeType => _HTMLFontElement;
+  toString() => super.toString();
+}
+patch class _Response {
+  static Type get instanceRuntimeType => _ResponseImpl;
+
+}
+class _ResponseImpl extends _Response implements js_library.JSObjectInterfacesDom {
+  _ResponseImpl.internal_() : super.internal_();
+  get runtimeType => _Response;
+  toString() => super.toString();
+}
+patch class _PagePopupController {
+  static Type get instanceRuntimeType => _PagePopupControllerImpl;
+
+}
+class _PagePopupControllerImpl extends _PagePopupController implements js_library.JSObjectInterfacesDom {
+  _PagePopupControllerImpl.internal_() : super.internal_();
+  get runtimeType => _PagePopupController;
+  toString() => super.toString();
+}
+patch class AnimationPlayerEvent {
+  static Type get instanceRuntimeType => AnimationPlayerEventImpl;
+
+}
+class AnimationPlayerEventImpl extends AnimationPlayerEvent implements js_library.JSObjectInterfacesDom {
+  AnimationPlayerEventImpl.internal_() : super.internal_();
+  get runtimeType => AnimationPlayerEvent;
+  toString() => super.toString();
+}
+patch class DomTokenList {
+  static Type get instanceRuntimeType => DomTokenListImpl;
+
+}
+class DomTokenListImpl extends DomTokenList implements js_library.JSObjectInterfacesDom {
+  DomTokenListImpl.internal_() : super.internal_();
+  get runtimeType => DomTokenList;
+  toString() => super.toString();
+}
+patch class _GamepadList {
+  static Type get instanceRuntimeType => _GamepadListImpl;
+
+}
+class _GamepadListImpl extends _GamepadList implements js_library.JSObjectInterfacesDom {
+  _GamepadListImpl.internal_() : super.internal_();
+  get runtimeType => _GamepadList;
+  toString() => super.toString();
+}
+patch class PluginArray {
+  static Type get instanceRuntimeType => PluginArrayImpl;
+
+}
+class PluginArrayImpl extends PluginArray implements js_library.JSObjectInterfacesDom {
+  PluginArrayImpl.internal_() : super.internal_();
+  get runtimeType => PluginArray;
+  toString() => super.toString();
+}
+patch class DomPoint {
+  static Type get instanceRuntimeType => DomPointImpl;
+
+}
+class DomPointImpl extends DomPoint implements js_library.JSObjectInterfacesDom {
+  DomPointImpl.internal_() : super.internal_();
+  get runtimeType => DomPoint;
+  toString() => super.toString();
+}
+patch class FileSystem {
+  static Type get instanceRuntimeType => FileSystemImpl;
+
+}
+class FileSystemImpl extends FileSystem implements js_library.JSObjectInterfacesDom {
+  FileSystemImpl.internal_() : super.internal_();
+  get runtimeType => FileSystem;
+  toString() => super.toString();
+}
+patch class NavigatorCpu {
+  static Type get instanceRuntimeType => NavigatorCpuImpl;
+
+}
+class NavigatorCpuImpl extends NavigatorCpu implements js_library.JSObjectInterfacesDom {
+  NavigatorCpuImpl.internal_() : super.internal_();
+  get runtimeType => NavigatorCpu;
+  toString() => super.toString();
+}
+patch class VideoTrack {
+  static Type get instanceRuntimeType => VideoTrackImpl;
+
+}
+class VideoTrackImpl extends VideoTrack implements js_library.JSObjectInterfacesDom {
+  VideoTrackImpl.internal_() : super.internal_();
+  get runtimeType => VideoTrack;
+  toString() => super.toString();
+}
+patch class QuoteElement {
+  static Type get instanceRuntimeType => QuoteElementImpl;
+
+}
+class QuoteElementImpl extends QuoteElement implements js_library.JSObjectInterfacesDom {
+  QuoteElementImpl.internal_() : super.internal_();
+  get runtimeType => QuoteElement;
+  toString() => super.toString();
+}
+patch class LabelElement {
+  static Type get instanceRuntimeType => LabelElementImpl;
+
+}
+class LabelElementImpl extends LabelElement implements js_library.JSObjectInterfacesDom {
+  LabelElementImpl.internal_() : super.internal_();
+  get runtimeType => LabelElement;
+  toString() => super.toString();
+}
+patch class TextAreaElement {
+  static Type get instanceRuntimeType => TextAreaElementImpl;
+
+}
+class TextAreaElementImpl extends TextAreaElement implements js_library.JSObjectInterfacesDom {
+  TextAreaElementImpl.internal_() : super.internal_();
+  get runtimeType => TextAreaElement;
+  toString() => super.toString();
+}
+patch class TextMetrics {
+  static Type get instanceRuntimeType => TextMetricsImpl;
+
+}
+class TextMetricsImpl extends TextMetrics implements js_library.JSObjectInterfacesDom {
+  TextMetricsImpl.internal_() : super.internal_();
+  get runtimeType => TextMetrics;
+  toString() => super.toString();
+}
+patch class Selection {
+  static Type get instanceRuntimeType => SelectionImpl;
+
+}
+class SelectionImpl extends Selection implements js_library.JSObjectInterfacesDom {
+  SelectionImpl.internal_() : super.internal_();
+  get runtimeType => Selection;
+  toString() => super.toString();
+}
+patch class NodeIterator {
+  static Type get instanceRuntimeType => NodeIteratorImpl;
+
+}
+class NodeIteratorImpl extends NodeIterator implements js_library.JSObjectInterfacesDom {
+  NodeIteratorImpl.internal_() : super.internal_();
+  get runtimeType => NodeIterator;
+  toString() => super.toString();
+}
+patch class _HTMLDirectoryElement {
+  static Type get instanceRuntimeType => _HTMLDirectoryElementImpl;
+
+}
+class _HTMLDirectoryElementImpl extends _HTMLDirectoryElement implements js_library.JSObjectInterfacesDom {
+  _HTMLDirectoryElementImpl.internal_() : super.internal_();
+  get runtimeType => _HTMLDirectoryElement;
+  toString() => super.toString();
+}
+patch class AreaElement {
+  static Type get instanceRuntimeType => AreaElementImpl;
+
+}
+class AreaElementImpl extends AreaElement implements js_library.JSObjectInterfacesDom {
+  AreaElementImpl.internal_() : super.internal_();
+  get runtimeType => AreaElement;
+  toString() => super.toString();
+}
+patch class Notification {
+  static Type get instanceRuntimeType => NotificationImpl;
+
+}
+class NotificationImpl extends Notification implements js_library.JSObjectInterfacesDom {
+  NotificationImpl.internal_() : super.internal_();
+  get runtimeType => Notification;
+  toString() => super.toString();
+}
+patch class TableCellElement {
+  static Type get instanceRuntimeType => TableCellElementImpl;
+
+}
+class TableCellElementImpl extends TableCellElement implements js_library.JSObjectInterfacesDom {
+  TableCellElementImpl.internal_() : super.internal_();
+  get runtimeType => TableCellElement;
+  toString() => super.toString();
+}
+patch class DomStringMap {
+  static Type get instanceRuntimeType => DomStringMapImpl;
+
+}
+class DomStringMapImpl extends DomStringMap implements js_library.JSObjectInterfacesDom {
+  DomStringMapImpl.internal_() : super.internal_();
+  get runtimeType => DomStringMap;
+  toString() => super.toString();
+}
+patch class Entry {
+  static Type get instanceRuntimeType => EntryImpl;
+
+}
+class EntryImpl extends Entry implements js_library.JSObjectInterfacesDom {
+  EntryImpl.internal_() : super.internal_();
+  get runtimeType => Entry;
+  toString() => super.toString();
+}
+patch class PeriodicSyncManager {
+  static Type get instanceRuntimeType => PeriodicSyncManagerImpl;
+
+}
+class PeriodicSyncManagerImpl extends PeriodicSyncManager implements js_library.JSObjectInterfacesDom {
+  PeriodicSyncManagerImpl.internal_() : super.internal_();
+  get runtimeType => PeriodicSyncManager;
+  toString() => super.toString();
+}
+patch class RtcIceCandidate {
+  static Type get instanceRuntimeType => RtcIceCandidateImpl;
+
+}
+class RtcIceCandidateImpl extends RtcIceCandidate implements js_library.JSObjectInterfacesDom {
+  RtcIceCandidateImpl.internal_() : super.internal_();
+  get runtimeType => RtcIceCandidate;
+  toString() => super.toString();
+}
+patch class SpeechRecognitionResult {
+  static Type get instanceRuntimeType => SpeechRecognitionResultImpl;
+
+}
+class SpeechRecognitionResultImpl extends SpeechRecognitionResult implements js_library.JSObjectInterfacesDom {
+  SpeechRecognitionResultImpl.internal_() : super.internal_();
+  get runtimeType => SpeechRecognitionResult;
+  toString() => super.toString();
+}
+patch class TextTrackList {
+  static Type get instanceRuntimeType => TextTrackListImpl;
+
+}
+class TextTrackListImpl extends TextTrackList implements js_library.JSObjectInterfacesDom {
+  TextTrackListImpl.internal_() : super.internal_();
+  get runtimeType => TextTrackList;
+  toString() => super.toString();
+}
+patch class _ServiceWorker {
+  static Type get instanceRuntimeType => _ServiceWorkerImpl;
+
+}
+class _ServiceWorkerImpl extends _ServiceWorker implements js_library.JSObjectInterfacesDom {
+  _ServiceWorkerImpl.internal_() : super.internal_();
+  get runtimeType => _ServiceWorker;
+  toString() => super.toString();
+}
+patch class SharedWorker {
+  static Type get instanceRuntimeType => SharedWorkerImpl;
+
+}
+class SharedWorkerImpl extends SharedWorker implements js_library.JSObjectInterfacesDom {
+  SharedWorkerImpl.internal_() : super.internal_();
+  get runtimeType => SharedWorker;
+  toString() => super.toString();
+}
+patch class EventTarget {
+  static Type get instanceRuntimeType => EventTargetImpl;
+
+}
+class EventTargetImpl extends EventTarget implements js_library.JSObjectInterfacesDom {
+  EventTargetImpl.internal_() : super.internal_();
+  get runtimeType => EventTarget;
+  toString() => super.toString();
+}
+patch class HtmlFormControlsCollection {
+  static Type get instanceRuntimeType => HtmlFormControlsCollectionImpl;
+
+}
+class HtmlFormControlsCollectionImpl extends HtmlFormControlsCollection implements js_library.JSObjectInterfacesDom {
+  HtmlFormControlsCollectionImpl.internal_() : super.internal_();
+  get runtimeType => HtmlFormControlsCollection;
+  toString() => super.toString();
+}
+patch class KeyboardEvent {
+  static Type get instanceRuntimeType => KeyboardEventImpl;
+
+}
+class KeyboardEventImpl extends KeyboardEvent implements js_library.JSObjectInterfacesDom {
+  KeyboardEventImpl.internal_() : super.internal_();
+  get runtimeType => KeyboardEvent;
+  toString() => super.toString();
+}
+patch class MidiMessageEvent {
+  static Type get instanceRuntimeType => MidiMessageEventImpl;
+
+}
+class MidiMessageEventImpl extends MidiMessageEvent implements js_library.JSObjectInterfacesDom {
+  MidiMessageEventImpl.internal_() : super.internal_();
+  get runtimeType => MidiMessageEvent;
+  toString() => super.toString();
+}
+patch class CacheStorage {
+  static Type get instanceRuntimeType => CacheStorageImpl;
+
+}
+class CacheStorageImpl extends CacheStorage implements js_library.JSObjectInterfacesDom {
+  CacheStorageImpl.internal_() : super.internal_();
+  get runtimeType => CacheStorage;
+  toString() => super.toString();
+}
+patch class CanvasElement {
+  static Type get instanceRuntimeType => CanvasElementImpl;
+
+}
+class CanvasElementImpl extends CanvasElement implements js_library.JSObjectInterfacesDom {
+  CanvasElementImpl.internal_() : super.internal_();
+  get runtimeType => CanvasElement;
+  toString() => super.toString();
+}
+patch class BatteryManager {
+  static Type get instanceRuntimeType => BatteryManagerImpl;
+
+}
+class BatteryManagerImpl extends BatteryManager implements js_library.JSObjectInterfacesDom {
+  BatteryManagerImpl.internal_() : super.internal_();
+  get runtimeType => BatteryManager;
+  toString() => super.toString();
+}
+patch class _StyleSheetList {
+  static Type get instanceRuntimeType => _StyleSheetListImpl;
+
+}
+class _StyleSheetListImpl extends _StyleSheetList implements js_library.JSObjectInterfacesDom {
+  _StyleSheetListImpl.internal_() : super.internal_();
+  get runtimeType => _StyleSheetList;
+  toString() => super.toString();
+}
+patch class Path2D {
+  static Type get instanceRuntimeType => Path2DImpl;
+
+}
+class Path2DImpl extends Path2D implements js_library.JSObjectInterfacesDom {
+  Path2DImpl.internal_() : super.internal_();
+  get runtimeType => Path2D;
+  toString() => super.toString();
+}
+patch class DeviceRotationRate {
+  static Type get instanceRuntimeType => DeviceRotationRateImpl;
+
+}
+class DeviceRotationRateImpl extends DeviceRotationRate implements js_library.JSObjectInterfacesDom {
+  DeviceRotationRateImpl.internal_() : super.internal_();
+  get runtimeType => DeviceRotationRate;
+  toString() => super.toString();
+}
+patch class Screen {
+  static Type get instanceRuntimeType => ScreenImpl;
+
+}
+class ScreenImpl extends Screen implements js_library.JSObjectInterfacesDom {
+  ScreenImpl.internal_() : super.internal_();
+  get runtimeType => Screen;
+  toString() => super.toString();
+}
+patch class StorageInfo {
+  static Type get instanceRuntimeType => StorageInfoImpl;
+
+}
+class StorageInfoImpl extends StorageInfo implements js_library.JSObjectInterfacesDom {
+  StorageInfoImpl.internal_() : super.internal_();
+  get runtimeType => StorageInfo;
+  toString() => super.toString();
+}
+patch class TableColElement {
+  static Type get instanceRuntimeType => TableColElementImpl;
+
+}
+class TableColElementImpl extends TableColElement implements js_library.JSObjectInterfacesDom {
+  TableColElementImpl.internal_() : super.internal_();
+  get runtimeType => TableColElement;
+  toString() => super.toString();
+}
+patch class CssStyleDeclaration {
+  static Type get instanceRuntimeType => CssStyleDeclarationImpl;
+
+}
+class CssStyleDeclarationImpl extends CssStyleDeclaration implements js_library.JSObjectInterfacesDom {
+  CssStyleDeclarationImpl.internal_() : super.internal_();
+  get runtimeType => CssStyleDeclaration;
+  toString() => super.toString();
+}
+patch class DomStringList {
+  static Type get instanceRuntimeType => DomStringListImpl;
+
+}
+class DomStringListImpl extends DomStringList implements js_library.JSObjectInterfacesDom {
+  DomStringListImpl.internal_() : super.internal_();
+  get runtimeType => DomStringList;
+  toString() => super.toString();
+}
+patch class StashedPortCollection {
+  static Type get instanceRuntimeType => StashedPortCollectionImpl;
+
+}
+class StashedPortCollectionImpl extends StashedPortCollection implements js_library.JSObjectInterfacesDom {
+  StashedPortCollectionImpl.internal_() : super.internal_();
+  get runtimeType => StashedPortCollection;
+  toString() => super.toString();
+}
+patch class SyncManager {
+  static Type get instanceRuntimeType => SyncManagerImpl;
+
+}
+class SyncManagerImpl extends SyncManager implements js_library.JSObjectInterfacesDom {
+  SyncManagerImpl.internal_() : super.internal_();
+  get runtimeType => SyncManager;
+  toString() => super.toString();
+}
+patch class HttpRequestUpload {
+  static Type get instanceRuntimeType => HttpRequestUploadImpl;
+
+}
+class HttpRequestUploadImpl extends HttpRequestUpload implements js_library.JSObjectInterfacesDom {
+  HttpRequestUploadImpl.internal_() : super.internal_();
+  get runtimeType => HttpRequestUpload;
+  toString() => super.toString();
+}
+patch class ReadableStreamReader {
+  static Type get instanceRuntimeType => ReadableStreamReaderImpl;
+
+}
+class ReadableStreamReaderImpl extends ReadableStreamReader implements js_library.JSObjectInterfacesDom {
+  ReadableStreamReaderImpl.internal_() : super.internal_();
+  get runtimeType => ReadableStreamReader;
+  toString() => super.toString();
+}
+patch class MediaKeySession {
+  static Type get instanceRuntimeType => MediaKeySessionImpl;
+
+}
+class MediaKeySessionImpl extends MediaKeySession implements js_library.JSObjectInterfacesDom {
+  MediaKeySessionImpl.internal_() : super.internal_();
+  get runtimeType => MediaKeySession;
+  toString() => super.toString();
+}
+patch class Gamepad {
+  static Type get instanceRuntimeType => GamepadImpl;
+
+}
+class GamepadImpl extends Gamepad implements js_library.JSObjectInterfacesDom {
+  GamepadImpl.internal_() : super.internal_();
+  get runtimeType => Gamepad;
+  toString() => super.toString();
+}
+patch class Worker {
+  static Type get instanceRuntimeType => WorkerImpl;
+
+}
+class WorkerImpl extends Worker implements js_library.JSObjectInterfacesDom {
+  WorkerImpl.internal_() : super.internal_();
+  get runtimeType => Worker;
+  toString() => super.toString();
+}
+patch class DefaultSessionStartEvent {
+  static Type get instanceRuntimeType => DefaultSessionStartEventImpl;
+
+}
+class DefaultSessionStartEventImpl extends DefaultSessionStartEvent implements js_library.JSObjectInterfacesDom {
+  DefaultSessionStartEventImpl.internal_() : super.internal_();
+  get runtimeType => DefaultSessionStartEvent;
+  toString() => super.toString();
+}
+patch class DListElement {
+  static Type get instanceRuntimeType => DListElementImpl;
+
+}
+class DListElementImpl extends DListElement implements js_library.JSObjectInterfacesDom {
+  DListElementImpl.internal_() : super.internal_();
+  get runtimeType => DListElement;
+  toString() => super.toString();
+}
+patch class FileError {
+  static Type get instanceRuntimeType => FileErrorImpl;
+
+}
+class FileErrorImpl extends FileError implements js_library.JSObjectInterfacesDom {
+  FileErrorImpl.internal_() : super.internal_();
+  get runtimeType => FileError;
+  toString() => super.toString();
+}
+patch class HeadElement {
+  static Type get instanceRuntimeType => HeadElementImpl;
+
+}
+class HeadElementImpl extends HeadElement implements js_library.JSObjectInterfacesDom {
+  HeadElementImpl.internal_() : super.internal_();
+  get runtimeType => HeadElement;
+  toString() => super.toString();
+}
+patch class BluetoothGattCharacteristic {
+  static Type get instanceRuntimeType => BluetoothGattCharacteristicImpl;
+
+}
+class BluetoothGattCharacteristicImpl extends BluetoothGattCharacteristic implements js_library.JSObjectInterfacesDom {
+  BluetoothGattCharacteristicImpl.internal_() : super.internal_();
+  get runtimeType => BluetoothGattCharacteristic;
+  toString() => super.toString();
+}
+patch class DomSettableTokenList {
+  static Type get instanceRuntimeType => DomSettableTokenListImpl;
+
+}
+class DomSettableTokenListImpl extends DomSettableTokenList implements js_library.JSObjectInterfacesDom {
+  DomSettableTokenListImpl.internal_() : super.internal_();
+  get runtimeType => DomSettableTokenList;
+  toString() => super.toString();
+}
+patch class _WorkerLocation {
+  static Type get instanceRuntimeType => _WorkerLocationImpl;
+
+}
+class _WorkerLocationImpl extends _WorkerLocation implements js_library.JSObjectInterfacesDom {
+  _WorkerLocationImpl.internal_() : super.internal_();
+  get runtimeType => _WorkerLocation;
+  toString() => super.toString();
+}
+patch class TouchList {
+  static Type get instanceRuntimeType => TouchListImpl;
+
+}
+class TouchListImpl extends TouchList implements js_library.JSObjectInterfacesDom {
+  TouchListImpl.internal_() : super.internal_();
+  get runtimeType => TouchList;
+  toString() => super.toString();
+}
+patch class MetaElement {
+  static Type get instanceRuntimeType => MetaElementImpl;
+
+}
+class MetaElementImpl extends MetaElement implements js_library.JSObjectInterfacesDom {
+  MetaElementImpl.internal_() : super.internal_();
+  get runtimeType => MetaElement;
+  toString() => super.toString();
+}
+patch class TrackElement {
+  static Type get instanceRuntimeType => TrackElementImpl;
+
+}
+class TrackElementImpl extends TrackElement implements js_library.JSObjectInterfacesDom {
+  TrackElementImpl.internal_() : super.internal_();
+  get runtimeType => TrackElement;
+  toString() => super.toString();
+}
+patch class WheelEvent {
+  static Type get instanceRuntimeType => WheelEventImpl;
+
+}
+class WheelEventImpl extends WheelEvent implements js_library.JSObjectInterfacesDom {
+  WheelEventImpl.internal_() : super.internal_();
+  get runtimeType => WheelEvent;
+  toString() => super.toString();
+}
+patch class DomMatrixReadOnly {
+  static Type get instanceRuntimeType => DomMatrixReadOnlyImpl;
+
+}
+class DomMatrixReadOnlyImpl extends DomMatrixReadOnly implements js_library.JSObjectInterfacesDom {
+  DomMatrixReadOnlyImpl.internal_() : super.internal_();
+  get runtimeType => DomMatrixReadOnly;
+  toString() => super.toString();
+}
+patch class FormElement {
+  static Type get instanceRuntimeType => FormElementImpl;
+
+}
+class FormElementImpl extends FormElement implements js_library.JSObjectInterfacesDom {
+  FormElementImpl.internal_() : super.internal_();
+  get runtimeType => FormElement;
+  toString() => super.toString();
+}
+patch class _SpeechRecognitionResultList {
+  static Type get instanceRuntimeType => _SpeechRecognitionResultListImpl;
+
+}
+class _SpeechRecognitionResultListImpl extends _SpeechRecognitionResultList implements js_library.JSObjectInterfacesDom {
+  _SpeechRecognitionResultListImpl.internal_() : super.internal_();
+  get runtimeType => _SpeechRecognitionResultList;
+  toString() => super.toString();
+}
+patch class CompositorWorkerGlobalScope {
+  static Type get instanceRuntimeType => CompositorWorkerGlobalScopeImpl;
+
+}
+class CompositorWorkerGlobalScopeImpl extends CompositorWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+  CompositorWorkerGlobalScopeImpl.internal_() : super.internal_();
+  get runtimeType => CompositorWorkerGlobalScope;
+  toString() => super.toString();
+}
+patch class PresentationAvailability {
+  static Type get instanceRuntimeType => PresentationAvailabilityImpl;
+
+}
+class PresentationAvailabilityImpl extends PresentationAvailability implements js_library.JSObjectInterfacesDom {
+  PresentationAvailabilityImpl.internal_() : super.internal_();
+  get runtimeType => PresentationAvailability;
+  toString() => super.toString();
+}
+patch class FontFaceSet {
+  static Type get instanceRuntimeType => FontFaceSetImpl;
+
+}
+class FontFaceSetImpl extends FontFaceSet implements js_library.JSObjectInterfacesDom {
+  FontFaceSetImpl.internal_() : super.internal_();
+  get runtimeType => FontFaceSet;
+  toString() => super.toString();
+}
+patch class _SubtleCrypto {
+  static Type get instanceRuntimeType => _SubtleCryptoImpl;
+
+}
+class _SubtleCryptoImpl extends _SubtleCrypto implements js_library.JSObjectInterfacesDom {
+  _SubtleCryptoImpl.internal_() : super.internal_();
+  get runtimeType => _SubtleCrypto;
+  toString() => super.toString();
+}
+patch class ButtonElement {
+  static Type get instanceRuntimeType => ButtonElementImpl;
+
+}
+class ButtonElementImpl extends ButtonElement implements js_library.JSObjectInterfacesDom {
+  ButtonElementImpl.internal_() : super.internal_();
+  get runtimeType => ButtonElement;
+  toString() => super.toString();
+}
+patch class ProcessingInstruction {
+  static Type get instanceRuntimeType => ProcessingInstructionImpl;
+
+}
+class ProcessingInstructionImpl extends ProcessingInstruction implements js_library.JSObjectInterfacesDom {
+  ProcessingInstructionImpl.internal_() : super.internal_();
+  get runtimeType => ProcessingInstruction;
+  toString() => super.toString();
+}
+patch class StashedMessagePort {
+  static Type get instanceRuntimeType => StashedMessagePortImpl;
+
+}
+class StashedMessagePortImpl extends StashedMessagePort implements js_library.JSObjectInterfacesDom {
+  StashedMessagePortImpl.internal_() : super.internal_();
+  get runtimeType => StashedMessagePort;
+  toString() => super.toString();
+}
+patch class DeviceAcceleration {
+  static Type get instanceRuntimeType => DeviceAccelerationImpl;
+
+}
+class DeviceAccelerationImpl extends DeviceAcceleration implements js_library.JSObjectInterfacesDom {
+  DeviceAccelerationImpl.internal_() : super.internal_();
+  get runtimeType => DeviceAcceleration;
+  toString() => super.toString();
+}
+patch class MapElement {
+  static Type get instanceRuntimeType => MapElementImpl;
+
+}
+class MapElementImpl extends MapElement implements js_library.JSObjectInterfacesDom {
+  MapElementImpl.internal_() : super.internal_();
+  get runtimeType => MapElement;
+  toString() => super.toString();
+}
+patch class PresentationSession {
+  static Type get instanceRuntimeType => PresentationSessionImpl;
+
+}
+class PresentationSessionImpl extends PresentationSession implements js_library.JSObjectInterfacesDom {
+  PresentationSessionImpl.internal_() : super.internal_();
+  get runtimeType => PresentationSession;
+  toString() => super.toString();
+}
+patch class RtcDtmfToneChangeEvent {
+  static Type get instanceRuntimeType => RtcDtmfToneChangeEventImpl;
+
+}
+class RtcDtmfToneChangeEventImpl extends RtcDtmfToneChangeEvent implements js_library.JSObjectInterfacesDom {
+  RtcDtmfToneChangeEventImpl.internal_() : super.internal_();
+  get runtimeType => RtcDtmfToneChangeEvent;
+  toString() => super.toString();
+}
+patch class PerformanceCompositeTiming {
+  static Type get instanceRuntimeType => PerformanceCompositeTimingImpl;
+
+}
+class PerformanceCompositeTimingImpl extends PerformanceCompositeTiming implements js_library.JSObjectInterfacesDom {
+  PerformanceCompositeTimingImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceCompositeTiming;
+  toString() => super.toString();
+}
+patch class NodeFilter {
+  static Type get instanceRuntimeType => NodeFilterImpl;
+
+}
+class NodeFilterImpl extends NodeFilter implements js_library.JSObjectInterfacesDom {
+  NodeFilterImpl.internal_() : super.internal_();
+  get runtimeType => NodeFilter;
+  toString() => super.toString();
+}
+patch class _DomRect {
+  static Type get instanceRuntimeType => _DomRectImpl;
+
+}
+class _DomRectImpl extends _DomRect implements js_library.JSObjectInterfacesDom {
+  _DomRectImpl.internal_() : super.internal_();
+  get runtimeType => _DomRect;
+  toString() => super.toString();
+}
+patch class PermissionStatus {
+  static Type get instanceRuntimeType => PermissionStatusImpl;
+
+}
+class PermissionStatusImpl extends PermissionStatus implements js_library.JSObjectInterfacesDom {
+  PermissionStatusImpl.internal_() : super.internal_();
+  get runtimeType => PermissionStatus;
+  toString() => super.toString();
+}
+patch class DeviceMotionEvent {
+  static Type get instanceRuntimeType => DeviceMotionEventImpl;
+
+}
+class DeviceMotionEventImpl extends DeviceMotionEvent implements js_library.JSObjectInterfacesDom {
+  DeviceMotionEventImpl.internal_() : super.internal_();
+  get runtimeType => DeviceMotionEvent;
+  toString() => super.toString();
+}
+patch class Comment {
+  static Type get instanceRuntimeType => CommentImpl;
+
+}
+class CommentImpl extends Comment implements js_library.JSObjectInterfacesDom {
+  CommentImpl.internal_() : super.internal_();
+  get runtimeType => Comment;
+  toString() => super.toString();
+}
+patch class CanvasPattern {
+  static Type get instanceRuntimeType => CanvasPatternImpl;
+
+}
+class CanvasPatternImpl extends CanvasPattern implements js_library.JSObjectInterfacesDom {
+  CanvasPatternImpl.internal_() : super.internal_();
+  get runtimeType => CanvasPattern;
+  toString() => super.toString();
+}
+patch class CompositorProxy {
+  static Type get instanceRuntimeType => CompositorProxyImpl;
+
+}
+class CompositorProxyImpl extends CompositorProxy implements js_library.JSObjectInterfacesDom {
+  CompositorProxyImpl.internal_() : super.internal_();
+  get runtimeType => CompositorProxy;
+  toString() => super.toString();
+}
+patch class MediaKeyError {
+  static Type get instanceRuntimeType => MediaKeyErrorImpl;
+
+}
+class MediaKeyErrorImpl extends MediaKeyError implements js_library.JSObjectInterfacesDom {
+  MediaKeyErrorImpl.internal_() : super.internal_();
+  get runtimeType => MediaKeyError;
+  toString() => super.toString();
+}
+patch class CssRule {
+  static Type get instanceRuntimeType => CssRuleImpl;
+
+}
+class CssRuleImpl extends CssRule implements js_library.JSObjectInterfacesDom {
+  CssRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssRule;
+  toString() => super.toString();
+}
+patch class SpeechRecognitionAlternative {
+  static Type get instanceRuntimeType => SpeechRecognitionAlternativeImpl;
+
+}
+class SpeechRecognitionAlternativeImpl extends SpeechRecognitionAlternative implements js_library.JSObjectInterfacesDom {
+  SpeechRecognitionAlternativeImpl.internal_() : super.internal_();
+  get runtimeType => SpeechRecognitionAlternative;
+  toString() => super.toString();
+}
+patch class XPathExpression {
+  static Type get instanceRuntimeType => XPathExpressionImpl;
+
+}
+class XPathExpressionImpl extends XPathExpression implements js_library.JSObjectInterfacesDom {
+  XPathExpressionImpl.internal_() : super.internal_();
+  get runtimeType => XPathExpression;
+  toString() => super.toString();
+}
+patch class Permissions {
+  static Type get instanceRuntimeType => PermissionsImpl;
+
+}
+class PermissionsImpl extends Permissions implements js_library.JSObjectInterfacesDom {
+  PermissionsImpl.internal_() : super.internal_();
+  get runtimeType => Permissions;
+  toString() => super.toString();
+}
+patch class PerformanceNavigation {
+  static Type get instanceRuntimeType => PerformanceNavigationImpl;
+
+}
+class PerformanceNavigationImpl extends PerformanceNavigation implements js_library.JSObjectInterfacesDom {
+  PerformanceNavigationImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceNavigation;
+  toString() => super.toString();
+}
+patch class SecurityPolicyViolationEvent {
+  static Type get instanceRuntimeType => SecurityPolicyViolationEventImpl;
+
+}
+class SecurityPolicyViolationEventImpl extends SecurityPolicyViolationEvent implements js_library.JSObjectInterfacesDom {
+  SecurityPolicyViolationEventImpl.internal_() : super.internal_();
+  get runtimeType => SecurityPolicyViolationEvent;
+  toString() => super.toString();
+}
+patch class TableElement {
+  static Type get instanceRuntimeType => TableElementImpl;
+
+}
+class TableElementImpl extends TableElement implements js_library.JSObjectInterfacesDom {
+  TableElementImpl.internal_() : super.internal_();
+  get runtimeType => TableElement;
+  toString() => super.toString();
+}
+patch class NavigatorID {
+  static Type get instanceRuntimeType => NavigatorIDImpl;
+
+}
+class NavigatorIDImpl extends NavigatorID implements js_library.JSObjectInterfacesDom {
+  NavigatorIDImpl.internal_() : super.internal_();
+  get runtimeType => NavigatorID;
+  toString() => super.toString();
+}
+patch class ServicePort {
+  static Type get instanceRuntimeType => ServicePortImpl;
+
+}
+class ServicePortImpl extends ServicePort implements js_library.JSObjectInterfacesDom {
+  ServicePortImpl.internal_() : super.internal_();
+  get runtimeType => ServicePort;
+  toString() => super.toString();
+}
+patch class TextTrackCue {
+  static Type get instanceRuntimeType => TextTrackCueImpl;
+
+}
+class TextTrackCueImpl extends TextTrackCue implements js_library.JSObjectInterfacesDom {
+  TextTrackCueImpl.internal_() : super.internal_();
+  get runtimeType => TextTrackCue;
+  toString() => super.toString();
+}
+patch class FileEntry {
+  static Type get instanceRuntimeType => FileEntryImpl;
+
+}
+class FileEntryImpl extends FileEntry implements js_library.JSObjectInterfacesDom {
+  FileEntryImpl.internal_() : super.internal_();
+  get runtimeType => FileEntry;
+  toString() => super.toString();
+}
+patch class _DOMFileSystemSync {
+  static Type get instanceRuntimeType => _DOMFileSystemSyncImpl;
+
+}
+class _DOMFileSystemSyncImpl extends _DOMFileSystemSync implements js_library.JSObjectInterfacesDom {
+  _DOMFileSystemSyncImpl.internal_() : super.internal_();
+  get runtimeType => _DOMFileSystemSync;
+  toString() => super.toString();
+}
+patch class Animation {
+  static Type get instanceRuntimeType => AnimationImpl;
+
+}
+class AnimationImpl extends Animation implements js_library.JSObjectInterfacesDom {
+  AnimationImpl.internal_() : super.internal_();
+  get runtimeType => Animation;
+  toString() => super.toString();
+}
+patch class Navigator {
+  static Type get instanceRuntimeType => NavigatorImpl;
+
+}
+class NavigatorImpl extends Navigator implements js_library.JSObjectInterfacesDom {
+  NavigatorImpl.internal_() : super.internal_();
+  get runtimeType => Navigator;
+  toString() => super.toString();
+}
+patch class MediaQueryList {
+  static Type get instanceRuntimeType => MediaQueryListImpl;
+
+}
+class MediaQueryListImpl extends MediaQueryList implements js_library.JSObjectInterfacesDom {
+  MediaQueryListImpl.internal_() : super.internal_();
+  get runtimeType => MediaQueryList;
+  toString() => super.toString();
+}
+patch class CssImportRule {
+  static Type get instanceRuntimeType => CssImportRuleImpl;
+
+}
+class CssImportRuleImpl extends CssImportRule implements js_library.JSObjectInterfacesDom {
+  CssImportRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssImportRule;
+  toString() => super.toString();
+}
+patch class StorageQuota {
+  static Type get instanceRuntimeType => StorageQuotaImpl;
+
+}
+class StorageQuotaImpl extends StorageQuota implements js_library.JSObjectInterfacesDom {
+  StorageQuotaImpl.internal_() : super.internal_();
+  get runtimeType => StorageQuota;
+  toString() => super.toString();
+}
+patch class MediaQueryListEvent {
+  static Type get instanceRuntimeType => MediaQueryListEventImpl;
+
+}
+class MediaQueryListEventImpl extends MediaQueryListEvent implements js_library.JSObjectInterfacesDom {
+  MediaQueryListEventImpl.internal_() : super.internal_();
+  get runtimeType => MediaQueryListEvent;
+  toString() => super.toString();
+}
+patch class BluetoothGattRemoteServer {
+  static Type get instanceRuntimeType => BluetoothGattRemoteServerImpl;
+
+}
+class BluetoothGattRemoteServerImpl extends BluetoothGattRemoteServer implements js_library.JSObjectInterfacesDom {
+  BluetoothGattRemoteServerImpl.internal_() : super.internal_();
+  get runtimeType => BluetoothGattRemoteServer;
+  toString() => super.toString();
+}
+patch class FileList {
+  static Type get instanceRuntimeType => FileListImpl;
+
+}
+class FileListImpl extends FileList implements js_library.JSObjectInterfacesDom {
+  FileListImpl.internal_() : super.internal_();
+  get runtimeType => FileList;
+  toString() => super.toString();
+}
+patch class WindowClient {
+  static Type get instanceRuntimeType => WindowClientImpl;
+
+}
+class WindowClientImpl extends WindowClient implements js_library.JSObjectInterfacesDom {
+  WindowClientImpl.internal_() : super.internal_();
+  get runtimeType => WindowClient;
+  toString() => super.toString();
+}
+patch class ReadableStream {
+  static Type get instanceRuntimeType => ReadableStreamImpl;
+
+}
+class ReadableStreamImpl extends ReadableStream implements js_library.JSObjectInterfacesDom {
+  ReadableStreamImpl.internal_() : super.internal_();
+  get runtimeType => ReadableStream;
+  toString() => super.toString();
+}
+patch class Node {
+  static Type get instanceRuntimeType => NodeImpl;
+
+}
+class NodeImpl extends Node implements js_library.JSObjectInterfacesDom {
+  NodeImpl.internal_() : super.internal_();
+  get runtimeType => Node;
+  toString() => super.toString();
+}
+patch class DedicatedWorkerGlobalScope {
+  static Type get instanceRuntimeType => DedicatedWorkerGlobalScopeImpl;
+
+}
+class DedicatedWorkerGlobalScopeImpl extends DedicatedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+  DedicatedWorkerGlobalScopeImpl.internal_() : super.internal_();
+  get runtimeType => DedicatedWorkerGlobalScope;
+  toString() => super.toString();
+}
+patch class AudioTrackList {
+  static Type get instanceRuntimeType => AudioTrackListImpl;
+
+}
+class AudioTrackListImpl extends AudioTrackList implements js_library.JSObjectInterfacesDom {
+  AudioTrackListImpl.internal_() : super.internal_();
+  get runtimeType => AudioTrackList;
+  toString() => super.toString();
+}
+patch class StyleMedia {
+  static Type get instanceRuntimeType => StyleMediaImpl;
+
+}
+class StyleMediaImpl extends StyleMedia implements js_library.JSObjectInterfacesDom {
+  StyleMediaImpl.internal_() : super.internal_();
+  get runtimeType => StyleMedia;
+  toString() => super.toString();
+}
+patch class WindowEventHandlers {
+  static Type get instanceRuntimeType => WindowEventHandlersImpl;
+
+}
+class WindowEventHandlersImpl extends WindowEventHandlers implements js_library.JSObjectInterfacesDom {
+  WindowEventHandlersImpl.internal_() : super.internal_();
+  get runtimeType => WindowEventHandlers;
+  toString() => super.toString();
+}
+patch class SourceInfo {
+  static Type get instanceRuntimeType => SourceInfoImpl;
+
+}
+class SourceInfoImpl extends SourceInfo implements js_library.JSObjectInterfacesDom {
+  SourceInfoImpl.internal_() : super.internal_();
+  get runtimeType => SourceInfo;
+  toString() => super.toString();
+}
+patch class _DirectoryEntrySync {
+  static Type get instanceRuntimeType => _DirectoryEntrySyncImpl;
+
+}
+class _DirectoryEntrySyncImpl extends _DirectoryEntrySync implements js_library.JSObjectInterfacesDom {
+  _DirectoryEntrySyncImpl.internal_() : super.internal_();
+  get runtimeType => _DirectoryEntrySync;
+  toString() => super.toString();
+}
+patch class AnimationEvent {
+  static Type get instanceRuntimeType => AnimationEventImpl;
+
+}
+class AnimationEventImpl extends AnimationEvent implements js_library.JSObjectInterfacesDom {
+  AnimationEventImpl.internal_() : super.internal_();
+  get runtimeType => AnimationEvent;
+  toString() => super.toString();
+}
+patch class PluginPlaceholderElement {
+  static Type get instanceRuntimeType => PluginPlaceholderElementImpl;
+
+}
+class PluginPlaceholderElementImpl extends PluginPlaceholderElement implements js_library.JSObjectInterfacesDom {
+  PluginPlaceholderElementImpl.internal_() : super.internal_();
+  get runtimeType => PluginPlaceholderElement;
+  toString() => super.toString();
+}
+patch class _MutationEvent {
+  static Type get instanceRuntimeType => _MutationEventImpl;
+
+}
+class _MutationEventImpl extends _MutationEvent implements js_library.JSObjectInterfacesDom {
+  _MutationEventImpl.internal_() : super.internal_();
+  get runtimeType => _MutationEvent;
+  toString() => super.toString();
+}
+patch class LinkElement {
+  static Type get instanceRuntimeType => LinkElementImpl;
+
+}
+class LinkElementImpl extends LinkElement implements js_library.JSObjectInterfacesDom {
+  LinkElementImpl.internal_() : super.internal_();
+  get runtimeType => LinkElement;
+  toString() => super.toString();
+}
+patch class TextTrackCueList {
+  static Type get instanceRuntimeType => TextTrackCueListImpl;
+
+}
+class TextTrackCueListImpl extends TextTrackCueList implements js_library.JSObjectInterfacesDom {
+  TextTrackCueListImpl.internal_() : super.internal_();
+  get runtimeType => TextTrackCueList;
+  toString() => super.toString();
+}
+patch class VideoPlaybackQuality {
+  static Type get instanceRuntimeType => VideoPlaybackQualityImpl;
+
+}
+class VideoPlaybackQualityImpl extends VideoPlaybackQuality implements js_library.JSObjectInterfacesDom {
+  VideoPlaybackQualityImpl.internal_() : super.internal_();
+  get runtimeType => VideoPlaybackQuality;
+  toString() => super.toString();
+}
+patch class IFrameElement {
+  static Type get instanceRuntimeType => IFrameElementImpl;
+
+}
+class IFrameElementImpl extends IFrameElement implements js_library.JSObjectInterfacesDom {
+  IFrameElementImpl.internal_() : super.internal_();
+  get runtimeType => IFrameElement;
+  toString() => super.toString();
+}
+patch class FontFace {
+  static Type get instanceRuntimeType => FontFaceImpl;
+
+}
+class FontFaceImpl extends FontFace implements js_library.JSObjectInterfacesDom {
+  FontFaceImpl.internal_() : super.internal_();
+  get runtimeType => FontFace;
+  toString() => super.toString();
+}
+patch class AnchorElement {
+  static Type get instanceRuntimeType => AnchorElementImpl;
+
+}
+class AnchorElementImpl extends AnchorElement implements js_library.JSObjectInterfacesDom {
+  AnchorElementImpl.internal_() : super.internal_();
+  get runtimeType => AnchorElement;
+  toString() => super.toString();
+}
+patch class XsltProcessor {
+  static Type get instanceRuntimeType => XsltProcessorImpl;
+
+}
+class XsltProcessorImpl extends XsltProcessor implements js_library.JSObjectInterfacesDom {
+  XsltProcessorImpl.internal_() : super.internal_();
+  get runtimeType => XsltProcessor;
+  toString() => super.toString();
+}
+patch class NavigatorLanguage {
+  static Type get instanceRuntimeType => NavigatorLanguageImpl;
+
+}
+class NavigatorLanguageImpl extends NavigatorLanguage implements js_library.JSObjectInterfacesDom {
+  NavigatorLanguageImpl.internal_() : super.internal_();
+  get runtimeType => NavigatorLanguage;
+  toString() => super.toString();
+}
+patch class ParagraphElement {
+  static Type get instanceRuntimeType => ParagraphElementImpl;
+
+}
+class ParagraphElementImpl extends ParagraphElement implements js_library.JSObjectInterfacesDom {
+  ParagraphElementImpl.internal_() : super.internal_();
+  get runtimeType => ParagraphElement;
+  toString() => super.toString();
+}
+patch class HmdvrDevice {
+  static Type get instanceRuntimeType => HmdvrDeviceImpl;
+
+}
+class HmdvrDeviceImpl extends HmdvrDevice implements js_library.JSObjectInterfacesDom {
+  HmdvrDeviceImpl.internal_() : super.internal_();
+  get runtimeType => HmdvrDevice;
+  toString() => super.toString();
+}
+patch class SourceBuffer {
+  static Type get instanceRuntimeType => SourceBufferImpl;
+
+}
+class SourceBufferImpl extends SourceBuffer implements js_library.JSObjectInterfacesDom {
+  SourceBufferImpl.internal_() : super.internal_();
+  get runtimeType => SourceBuffer;
+  toString() => super.toString();
+}
+patch class CssCharsetRule {
+  static Type get instanceRuntimeType => CssCharsetRuleImpl;
+
+}
+class CssCharsetRuleImpl extends CssCharsetRule implements js_library.JSObjectInterfacesDom {
+  CssCharsetRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssCharsetRule;
+  toString() => super.toString();
+}
+patch class DeprecatedStorageQuota {
+  static Type get instanceRuntimeType => DeprecatedStorageQuotaImpl;
+
+}
+class DeprecatedStorageQuotaImpl extends DeprecatedStorageQuota implements js_library.JSObjectInterfacesDom {
+  DeprecatedStorageQuotaImpl.internal_() : super.internal_();
+  get runtimeType => DeprecatedStorageQuota;
+  toString() => super.toString();
+}
+patch class DataTransfer {
+  static Type get instanceRuntimeType => DataTransferImpl;
+
+}
+class DataTransferImpl extends DataTransfer implements js_library.JSObjectInterfacesDom {
+  DataTransferImpl.internal_() : super.internal_();
+  get runtimeType => DataTransfer;
+  toString() => super.toString();
+}
+patch class MutationObserver {
+  static Type get instanceRuntimeType => MutationObserverImpl;
+
+}
+class MutationObserverImpl extends MutationObserver implements js_library.JSObjectInterfacesDom {
+  MutationObserverImpl.internal_() : super.internal_();
+  get runtimeType => MutationObserver;
+  toString() => super.toString();
+}
+patch class XmlSerializer {
+  static Type get instanceRuntimeType => XmlSerializerImpl;
+
+}
+class XmlSerializerImpl extends XmlSerializer implements js_library.JSObjectInterfacesDom {
+  XmlSerializerImpl.internal_() : super.internal_();
+  get runtimeType => XmlSerializer;
+  toString() => super.toString();
+}
+patch class PictureElement {
+  static Type get instanceRuntimeType => PictureElementImpl;
+
+}
+class PictureElementImpl extends PictureElement implements js_library.JSObjectInterfacesDom {
+  PictureElementImpl.internal_() : super.internal_();
+  get runtimeType => PictureElement;
+  toString() => super.toString();
+}
+patch class MediaEncryptedEvent {
+  static Type get instanceRuntimeType => MediaEncryptedEventImpl;
+
+}
+class MediaEncryptedEventImpl extends MediaEncryptedEvent implements js_library.JSObjectInterfacesDom {
+  MediaEncryptedEventImpl.internal_() : super.internal_();
+  get runtimeType => MediaEncryptedEvent;
+  toString() => super.toString();
+}
+patch class TouchEvent {
+  static Type get instanceRuntimeType => TouchEventImpl;
+
+}
+class TouchEventImpl extends TouchEvent implements js_library.JSObjectInterfacesDom {
+  TouchEventImpl.internal_() : super.internal_();
+  get runtimeType => TouchEvent;
+  toString() => super.toString();
+}
+patch class ServiceWorkerMessageEvent {
+  static Type get instanceRuntimeType => ServiceWorkerMessageEventImpl;
+
+}
+class ServiceWorkerMessageEventImpl extends ServiceWorkerMessageEvent implements js_library.JSObjectInterfacesDom {
+  ServiceWorkerMessageEventImpl.internal_() : super.internal_();
+  get runtimeType => ServiceWorkerMessageEvent;
+  toString() => super.toString();
+}
+patch class MeterElement {
+  static Type get instanceRuntimeType => MeterElementImpl;
+
+}
+class MeterElementImpl extends MeterElement implements js_library.JSObjectInterfacesDom {
+  MeterElementImpl.internal_() : super.internal_();
+  get runtimeType => MeterElement;
+  toString() => super.toString();
+}
+patch class CssGroupingRule {
+  static Type get instanceRuntimeType => CssGroupingRuleImpl;
+
+}
+class CssGroupingRuleImpl extends CssGroupingRule implements js_library.JSObjectInterfacesDom {
+  CssGroupingRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssGroupingRule;
+  toString() => super.toString();
+}
+patch class UListElement {
+  static Type get instanceRuntimeType => UListElementImpl;
+
+}
+class UListElementImpl extends UListElement implements js_library.JSObjectInterfacesDom {
+  UListElementImpl.internal_() : super.internal_();
+  get runtimeType => UListElement;
+  toString() => super.toString();
+}
+patch class Storage {
+  static Type get instanceRuntimeType => StorageImpl;
+
+}
+class StorageImpl extends Storage implements js_library.JSObjectInterfacesDom {
+  StorageImpl.internal_() : super.internal_();
+  get runtimeType => Storage;
+  toString() => super.toString();
+}
+patch class _DocumentType {
+  static Type get instanceRuntimeType => _DocumentTypeImpl;
+
+}
+class _DocumentTypeImpl extends _DocumentType implements js_library.JSObjectInterfacesDom {
+  _DocumentTypeImpl.internal_() : super.internal_();
+  get runtimeType => _DocumentType;
+  toString() => super.toString();
+}
+patch class ErrorEvent {
+  static Type get instanceRuntimeType => ErrorEventImpl;
+
+}
+class ErrorEventImpl extends ErrorEvent implements js_library.JSObjectInterfacesDom {
+  ErrorEventImpl.internal_() : super.internal_();
+  get runtimeType => ErrorEvent;
+  toString() => super.toString();
+}
+patch class BodyElement {
+  static Type get instanceRuntimeType => BodyElementImpl;
+
+}
+class BodyElementImpl extends BodyElement implements js_library.JSObjectInterfacesDom {
+  BodyElementImpl.internal_() : super.internal_();
+  get runtimeType => BodyElement;
+  toString() => super.toString();
+}
+patch class DeprecatedStorageInfo {
+  static Type get instanceRuntimeType => DeprecatedStorageInfoImpl;
+
+}
+class DeprecatedStorageInfoImpl extends DeprecatedStorageInfo implements js_library.JSObjectInterfacesDom {
+  DeprecatedStorageInfoImpl.internal_() : super.internal_();
+  get runtimeType => DeprecatedStorageInfo;
+  toString() => super.toString();
+}
+patch class Geoposition {
+  static Type get instanceRuntimeType => GeopositionImpl;
+
+}
+class GeopositionImpl extends Geoposition implements js_library.JSObjectInterfacesDom {
+  GeopositionImpl.internal_() : super.internal_();
+  get runtimeType => Geoposition;
+  toString() => super.toString();
+}
+patch class ApplicationCacheErrorEvent {
+  static Type get instanceRuntimeType => ApplicationCacheErrorEventImpl;
+
+}
+class ApplicationCacheErrorEventImpl extends ApplicationCacheErrorEvent implements js_library.JSObjectInterfacesDom {
+  ApplicationCacheErrorEventImpl.internal_() : super.internal_();
+  get runtimeType => ApplicationCacheErrorEvent;
+  toString() => super.toString();
+}
+patch class MutationRecord {
+  static Type get instanceRuntimeType => MutationRecordImpl;
+
+}
+class MutationRecordImpl extends MutationRecord implements js_library.JSObjectInterfacesDom {
+  MutationRecordImpl.internal_() : super.internal_();
+  get runtimeType => MutationRecord;
+  toString() => super.toString();
+}
+patch class FieldSetElement {
+  static Type get instanceRuntimeType => FieldSetElementImpl;
+
+}
+class FieldSetElementImpl extends FieldSetElement implements js_library.JSObjectInterfacesDom {
+  FieldSetElementImpl.internal_() : super.internal_();
+  get runtimeType => FieldSetElement;
+  toString() => super.toString();
+}
+patch class NonDocumentTypeChildNode {
+  static Type get instanceRuntimeType => NonDocumentTypeChildNodeImpl;
+
+}
+class NonDocumentTypeChildNodeImpl extends NonDocumentTypeChildNode implements js_library.JSObjectInterfacesDom {
+  NonDocumentTypeChildNodeImpl.internal_() : super.internal_();
+  get runtimeType => NonDocumentTypeChildNode;
+  toString() => super.toString();
+}
+patch class _DirectoryReaderSync {
+  static Type get instanceRuntimeType => _DirectoryReaderSyncImpl;
+
+}
+class _DirectoryReaderSyncImpl extends _DirectoryReaderSync implements js_library.JSObjectInterfacesDom {
+  _DirectoryReaderSyncImpl.internal_() : super.internal_();
+  get runtimeType => _DirectoryReaderSync;
+  toString() => super.toString();
+}
+patch class RtcSessionDescription {
+  static Type get instanceRuntimeType => RtcSessionDescriptionImpl;
+
+}
+class RtcSessionDescriptionImpl extends RtcSessionDescription implements js_library.JSObjectInterfacesDom {
+  RtcSessionDescriptionImpl.internal_() : super.internal_();
+  get runtimeType => RtcSessionDescription;
+  toString() => super.toString();
+}
+patch class PositionSensorVRDevice {
+  static Type get instanceRuntimeType => PositionSensorVRDeviceImpl;
+
+}
+class PositionSensorVRDeviceImpl extends PositionSensorVRDevice implements js_library.JSObjectInterfacesDom {
+  PositionSensorVRDeviceImpl.internal_() : super.internal_();
+  get runtimeType => PositionSensorVRDevice;
+  toString() => super.toString();
+}
+patch class Text {
+  static Type get instanceRuntimeType => TextImpl;
+
+}
+class TextImpl extends Text implements js_library.JSObjectInterfacesDom {
+  TextImpl.internal_() : super.internal_();
+  get runtimeType => Text;
+  toString() => super.toString();
+}
+patch class AnimationEffectTiming {
+  static Type get instanceRuntimeType => AnimationEffectTimingImpl;
+
+}
+class AnimationEffectTimingImpl extends AnimationEffectTiming implements js_library.JSObjectInterfacesDom {
+  AnimationEffectTimingImpl.internal_() : super.internal_();
+  get runtimeType => AnimationEffectTiming;
+  toString() => super.toString();
+}
+patch class PositionError {
+  static Type get instanceRuntimeType => PositionErrorImpl;
+
+}
+class PositionErrorImpl extends PositionError implements js_library.JSObjectInterfacesDom {
+  PositionErrorImpl.internal_() : super.internal_();
+  get runtimeType => PositionError;
+  toString() => super.toString();
+}
+patch class VideoTrackList {
+  static Type get instanceRuntimeType => VideoTrackListImpl;
+
+}
+class VideoTrackListImpl extends VideoTrackList implements js_library.JSObjectInterfacesDom {
+  VideoTrackListImpl.internal_() : super.internal_();
+  get runtimeType => VideoTrackList;
+  toString() => super.toString();
+}
+patch class GamepadButton {
+  static Type get instanceRuntimeType => GamepadButtonImpl;
+
+}
+class GamepadButtonImpl extends GamepadButton implements js_library.JSObjectInterfacesDom {
+  GamepadButtonImpl.internal_() : super.internal_();
+  get runtimeType => GamepadButton;
+  toString() => super.toString();
+}
+patch class WorkerConsole {
+  static Type get instanceRuntimeType => WorkerConsoleImpl;
+
+}
+class WorkerConsoleImpl extends WorkerConsole implements js_library.JSObjectInterfacesDom {
+  WorkerConsoleImpl.internal_() : super.internal_();
+  get runtimeType => WorkerConsole;
+  toString() => super.toString();
+}
+patch class TrackDefault {
+  static Type get instanceRuntimeType => TrackDefaultImpl;
+
+}
+class TrackDefaultImpl extends TrackDefault implements js_library.JSObjectInterfacesDom {
+  TrackDefaultImpl.internal_() : super.internal_();
+  get runtimeType => TrackDefault;
+  toString() => super.toString();
+}
+patch class FileStream {
+  static Type get instanceRuntimeType => FileStreamImpl;
+
+}
+class FileStreamImpl extends FileStream implements js_library.JSObjectInterfacesDom {
+  FileStreamImpl.internal_() : super.internal_();
+  get runtimeType => FileStream;
+  toString() => super.toString();
+}
+patch class _ClientRect {
+  static Type get instanceRuntimeType => _ClientRectImpl;
+
+}
+class _ClientRectImpl extends _ClientRect implements js_library.JSObjectInterfacesDom {
+  _ClientRectImpl.internal_() : super.internal_();
+  get runtimeType => _ClientRect;
+  toString() => super.toString();
+}
+patch class TemplateElement {
+  static Type get instanceRuntimeType => TemplateElementImpl;
+
+}
+class TemplateElementImpl extends TemplateElement implements js_library.JSObjectInterfacesDom {
+  TemplateElementImpl.internal_() : super.internal_();
+  get runtimeType => TemplateElement;
+  toString() => super.toString();
+}
+patch class RtcStatsReport {
+  static Type get instanceRuntimeType => RtcStatsReportImpl;
+
+}
+class RtcStatsReportImpl extends RtcStatsReport implements js_library.JSObjectInterfacesDom {
+  RtcStatsReportImpl.internal_() : super.internal_();
+  get runtimeType => RtcStatsReport;
+  toString() => super.toString();
+}
+patch class TimeRanges {
+  static Type get instanceRuntimeType => TimeRangesImpl;
+
+}
+class TimeRangesImpl extends TimeRanges implements js_library.JSObjectInterfacesDom {
+  TimeRangesImpl.internal_() : super.internal_();
+  get runtimeType => TimeRanges;
+  toString() => super.toString();
+}
+patch class _Request {
+  static Type get instanceRuntimeType => _RequestImpl;
+
+}
+class _RequestImpl extends _Request implements js_library.JSObjectInterfacesDom {
+  _RequestImpl.internal_() : super.internal_();
+  get runtimeType => _Request;
+  toString() => super.toString();
+}
+patch class _WindowTimers {
+  static Type get instanceRuntimeType => _WindowTimersImpl;
+
+}
+class _WindowTimersImpl extends _WindowTimers implements js_library.JSObjectInterfacesDom {
+  _WindowTimersImpl.internal_() : super.internal_();
+  get runtimeType => _WindowTimers;
+  toString() => super.toString();
+}
+patch class VttRegionList {
+  static Type get instanceRuntimeType => VttRegionListImpl;
+
+}
+class VttRegionListImpl extends VttRegionList implements js_library.JSObjectInterfacesDom {
+  VttRegionListImpl.internal_() : super.internal_();
+  get runtimeType => VttRegionList;
+  toString() => super.toString();
+}
+patch class AnimationTimeline {
+  static Type get instanceRuntimeType => AnimationTimelineImpl;
+
+}
+class AnimationTimelineImpl extends AnimationTimeline implements js_library.JSObjectInterfacesDom {
+  AnimationTimelineImpl.internal_() : super.internal_();
+  get runtimeType => AnimationTimeline;
+  toString() => super.toString();
+}
+patch class Event {
+  static Type get instanceRuntimeType => EventImpl;
+
+}
+class EventImpl extends Event implements js_library.JSObjectInterfacesDom {
+  EventImpl.internal_() : super.internal_();
+  get runtimeType => Event;
+  toString() => super.toString();
+}
+patch class DomIterator {
+  static Type get instanceRuntimeType => DomIteratorImpl;
+
+}
+class DomIteratorImpl extends DomIterator implements js_library.JSObjectInterfacesDom {
+  DomIteratorImpl.internal_() : super.internal_();
+  get runtimeType => DomIterator;
+  toString() => super.toString();
+}
+patch class ImageData {
+  static Type get instanceRuntimeType => ImageDataImpl;
+
+}
+class ImageDataImpl extends ImageData implements js_library.JSObjectInterfacesDom {
+  ImageDataImpl.internal_() : super.internal_();
+  get runtimeType => ImageData;
+  toString() => super.toString();
+}
+patch class MediaStreamTrackEvent {
+  static Type get instanceRuntimeType => MediaStreamTrackEventImpl;
+
+}
+class MediaStreamTrackEventImpl extends MediaStreamTrackEvent implements js_library.JSObjectInterfacesDom {
+  MediaStreamTrackEventImpl.internal_() : super.internal_();
+  get runtimeType => MediaStreamTrackEvent;
+  toString() => super.toString();
+}
+patch class PromiseRejectionEvent {
+  static Type get instanceRuntimeType => PromiseRejectionEventImpl;
+
+}
+class PromiseRejectionEventImpl extends PromiseRejectionEvent implements js_library.JSObjectInterfacesDom {
+  PromiseRejectionEventImpl.internal_() : super.internal_();
+  get runtimeType => PromiseRejectionEvent;
+  toString() => super.toString();
+}
+patch class HtmlElement {
+  static Type get instanceRuntimeType => HtmlElementImpl;
+
+}
+class HtmlElementImpl extends HtmlElement implements js_library.JSObjectInterfacesDom {
+  HtmlElementImpl.internal_() : super.internal_();
+  get runtimeType => HtmlElement;
+  toString() => super.toString();
+}
+patch class HtmlDocument {
+  static Type get instanceRuntimeType => HtmlDocumentImpl;
+
+}
+class HtmlDocumentImpl extends HtmlDocument implements js_library.JSObjectInterfacesDom {
+  HtmlDocumentImpl.internal_() : super.internal_();
+  get runtimeType => HtmlDocument;
+  toString() => super.toString();
+}
+patch class MidiPort {
+  static Type get instanceRuntimeType => MidiPortImpl;
+
+}
+class MidiPortImpl extends MidiPort implements js_library.JSObjectInterfacesDom {
+  MidiPortImpl.internal_() : super.internal_();
+  get runtimeType => MidiPort;
+  toString() => super.toString();
+}
+patch class CssMediaRule {
+  static Type get instanceRuntimeType => CssMediaRuleImpl;
+
+}
+class CssMediaRuleImpl extends CssMediaRule implements js_library.JSObjectInterfacesDom {
+  CssMediaRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssMediaRule;
+  toString() => super.toString();
+}
+patch class CssViewportRule {
+  static Type get instanceRuntimeType => CssViewportRuleImpl;
+
+}
+class CssViewportRuleImpl extends CssViewportRule implements js_library.JSObjectInterfacesDom {
+  CssViewportRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssViewportRule;
+  toString() => super.toString();
+}
+patch class FederatedCredential {
+  static Type get instanceRuntimeType => FederatedCredentialImpl;
+
+}
+class FederatedCredentialImpl extends FederatedCredential implements js_library.JSObjectInterfacesDom {
+  FederatedCredentialImpl.internal_() : super.internal_();
+  get runtimeType => FederatedCredential;
+  toString() => super.toString();
+}
+patch class RtcIceCandidateEvent {
+  static Type get instanceRuntimeType => RtcIceCandidateEventImpl;
+
+}
+class RtcIceCandidateEventImpl extends RtcIceCandidateEvent implements js_library.JSObjectInterfacesDom {
+  RtcIceCandidateEventImpl.internal_() : super.internal_();
+  get runtimeType => RtcIceCandidateEvent;
+  toString() => super.toString();
+}
+patch class PerformanceMark {
+  static Type get instanceRuntimeType => PerformanceMarkImpl;
+
+}
+class PerformanceMarkImpl extends PerformanceMark implements js_library.JSObjectInterfacesDom {
+  PerformanceMarkImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceMark;
+  toString() => super.toString();
+}
+patch class SharedWorkerGlobalScope {
+  static Type get instanceRuntimeType => SharedWorkerGlobalScopeImpl;
+
+}
+class SharedWorkerGlobalScopeImpl extends SharedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+  SharedWorkerGlobalScopeImpl.internal_() : super.internal_();
+  get runtimeType => SharedWorkerGlobalScope;
+  toString() => super.toString();
+}
+patch class MimeTypeArray {
+  static Type get instanceRuntimeType => MimeTypeArrayImpl;
+
+}
+class MimeTypeArrayImpl extends MimeTypeArray implements js_library.JSObjectInterfacesDom {
+  MimeTypeArrayImpl.internal_() : super.internal_();
+  get runtimeType => MimeTypeArray;
+  toString() => super.toString();
+}
+patch class PerformanceRenderTiming {
+  static Type get instanceRuntimeType => PerformanceRenderTimingImpl;
+
+}
+class PerformanceRenderTimingImpl extends PerformanceRenderTiming implements js_library.JSObjectInterfacesDom {
+  PerformanceRenderTimingImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceRenderTiming;
+  toString() => super.toString();
+}
+patch class EffectModel {
+  static Type get instanceRuntimeType => EffectModelImpl;
+
+}
+class EffectModelImpl extends EffectModel implements js_library.JSObjectInterfacesDom {
+  EffectModelImpl.internal_() : super.internal_();
+  get runtimeType => EffectModel;
+  toString() => super.toString();
+}
+patch class StyleSheet {
+  static Type get instanceRuntimeType => StyleSheetImpl;
+
+}
+class StyleSheetImpl extends StyleSheet implements js_library.JSObjectInterfacesDom {
+  StyleSheetImpl.internal_() : super.internal_();
+  get runtimeType => StyleSheet;
+  toString() => super.toString();
+}
+patch class TableRowElement {
+  static Type get instanceRuntimeType => TableRowElementImpl;
+
+}
+class TableRowElementImpl extends TableRowElement implements js_library.JSObjectInterfacesDom {
+  TableRowElementImpl.internal_() : super.internal_();
+  get runtimeType => TableRowElement;
+  toString() => super.toString();
+}
+patch class Geofencing {
+  static Type get instanceRuntimeType => GeofencingImpl;
+
+}
+class GeofencingImpl extends Geofencing implements js_library.JSObjectInterfacesDom {
+  GeofencingImpl.internal_() : super.internal_();
+  get runtimeType => Geofencing;
+  toString() => super.toString();
+}
+patch class NodeList {
+  static Type get instanceRuntimeType => NodeListImpl;
+
+}
+class NodeListImpl extends NodeList implements js_library.JSObjectInterfacesDom {
+  NodeListImpl.internal_() : super.internal_();
+  get runtimeType => NodeList;
+  toString() => super.toString();
+}
+patch class MidiAccess {
+  static Type get instanceRuntimeType => MidiAccessImpl;
+
+}
+class MidiAccessImpl extends MidiAccess implements js_library.JSObjectInterfacesDom {
+  MidiAccessImpl.internal_() : super.internal_();
+  get runtimeType => MidiAccess;
+  toString() => super.toString();
+}
+patch class CssStyleRule {
+  static Type get instanceRuntimeType => CssStyleRuleImpl;
+
+}
+class CssStyleRuleImpl extends CssStyleRule implements js_library.JSObjectInterfacesDom {
+  CssStyleRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssStyleRule;
+  toString() => super.toString();
+}
+patch class DomError {
+  static Type get instanceRuntimeType => DomErrorImpl;
+
+}
+class DomErrorImpl extends DomError implements js_library.JSObjectInterfacesDom {
+  DomErrorImpl.internal_() : super.internal_();
+  get runtimeType => DomError;
+  toString() => super.toString();
+}
+patch class BluetoothUuid {
+  static Type get instanceRuntimeType => BluetoothUuidImpl;
+
+}
+class BluetoothUuidImpl extends BluetoothUuid implements js_library.JSObjectInterfacesDom {
+  BluetoothUuidImpl.internal_() : super.internal_();
+  get runtimeType => BluetoothUuid;
+  toString() => super.toString();
+}
+patch class HashChangeEvent {
+  static Type get instanceRuntimeType => HashChangeEventImpl;
+
+}
+class HashChangeEventImpl extends HashChangeEvent implements js_library.JSObjectInterfacesDom {
+  HashChangeEventImpl.internal_() : super.internal_();
+  get runtimeType => HashChangeEvent;
+  toString() => super.toString();
+}
+patch class InputElement {
+  static Type get instanceRuntimeType => InputElementImpl;
+
+}
+class InputElementImpl extends InputElement implements js_library.JSObjectInterfacesDom {
+  InputElementImpl.internal_() : super.internal_();
+  get runtimeType => InputElement;
+  toString() => super.toString();
+}
+patch class CDataSection {
+  static Type get instanceRuntimeType => CDataSectionImpl;
+
+}
+class CDataSectionImpl extends CDataSection implements js_library.JSObjectInterfacesDom {
+  CDataSectionImpl.internal_() : super.internal_();
+  get runtimeType => CDataSection;
+  toString() => super.toString();
+}
+patch class CssStyleSheet {
+  static Type get instanceRuntimeType => CssStyleSheetImpl;
+
+}
+class CssStyleSheetImpl extends CssStyleSheet implements js_library.JSObjectInterfacesDom {
+  CssStyleSheetImpl.internal_() : super.internal_();
+  get runtimeType => CssStyleSheet;
+  toString() => super.toString();
+}
+patch class DomRectReadOnly {
+  static Type get instanceRuntimeType => DomRectReadOnlyImpl;
+
+}
+class DomRectReadOnlyImpl extends DomRectReadOnly implements js_library.JSObjectInterfacesDom {
+  DomRectReadOnlyImpl.internal_() : super.internal_();
+  get runtimeType => DomRectReadOnly;
+  toString() => super.toString();
+}
+patch class SyncEvent {
+  static Type get instanceRuntimeType => SyncEventImpl;
+
+}
+class SyncEventImpl extends SyncEvent implements js_library.JSObjectInterfacesDom {
+  SyncEventImpl.internal_() : super.internal_();
+  get runtimeType => SyncEvent;
+  toString() => super.toString();
+}
+patch class CssSupportsRule {
+  static Type get instanceRuntimeType => CssSupportsRuleImpl;
+
+}
+class CssSupportsRuleImpl extends CssSupportsRule implements js_library.JSObjectInterfacesDom {
+  CssSupportsRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssSupportsRule;
+  toString() => super.toString();
+}
+patch class DomParser {
+  static Type get instanceRuntimeType => DomParserImpl;
+
+}
+class DomParserImpl extends DomParser implements js_library.JSObjectInterfacesDom {
+  DomParserImpl.internal_() : super.internal_();
+  get runtimeType => DomParser;
+  toString() => super.toString();
+}
+patch class LIElement {
+  static Type get instanceRuntimeType => LIElementImpl;
+
+}
+class LIElementImpl extends LIElement implements js_library.JSObjectInterfacesDom {
+  LIElementImpl.internal_() : super.internal_();
+  get runtimeType => LIElement;
+  toString() => super.toString();
+}
+patch class CrossOriginServiceWorkerClient {
+  static Type get instanceRuntimeType => CrossOriginServiceWorkerClientImpl;
+
+}
+class CrossOriginServiceWorkerClientImpl extends CrossOriginServiceWorkerClient implements js_library.JSObjectInterfacesDom {
+  CrossOriginServiceWorkerClientImpl.internal_() : super.internal_();
+  get runtimeType => CrossOriginServiceWorkerClient;
+  toString() => super.toString();
+}
+patch class ServiceWorkerGlobalScope {
+  static Type get instanceRuntimeType => ServiceWorkerGlobalScopeImpl;
+
+}
+class ServiceWorkerGlobalScopeImpl extends ServiceWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+  ServiceWorkerGlobalScopeImpl.internal_() : super.internal_();
+  get runtimeType => ServiceWorkerGlobalScope;
+  toString() => super.toString();
+}
+patch class InputDevice {
+  static Type get instanceRuntimeType => InputDeviceImpl;
+
+}
+class InputDeviceImpl extends InputDevice implements js_library.JSObjectInterfacesDom {
+  InputDeviceImpl.internal_() : super.internal_();
+  get runtimeType => InputDevice;
+  toString() => super.toString();
+}
+patch class MediaSession {
+  static Type get instanceRuntimeType => MediaSessionImpl;
+
+}
+class MediaSessionImpl extends MediaSession implements js_library.JSObjectInterfacesDom {
+  MediaSessionImpl.internal_() : super.internal_();
+  get runtimeType => MediaSession;
+  toString() => super.toString();
+}
+patch class PreElement {
+  static Type get instanceRuntimeType => PreElementImpl;
+
+}
+class PreElementImpl extends PreElement implements js_library.JSObjectInterfacesDom {
+  PreElementImpl.internal_() : super.internal_();
+  get runtimeType => PreElement;
+  toString() => super.toString();
+}
+patch class _NamedNodeMap {
+  static Type get instanceRuntimeType => _NamedNodeMapImpl;
+
+}
+class _NamedNodeMapImpl extends _NamedNodeMap implements js_library.JSObjectInterfacesDom {
+  _NamedNodeMapImpl.internal_() : super.internal_();
+  get runtimeType => _NamedNodeMap;
+  toString() => super.toString();
+}
+patch class StyleElement {
+  static Type get instanceRuntimeType => StyleElementImpl;
+
+}
+class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
+  StyleElementImpl.internal_() : super.internal_();
+  get runtimeType => StyleElement;
+  toString() => super.toString();
+}
+patch class TrackEvent {
+  static Type get instanceRuntimeType => TrackEventImpl;
+
+}
+class TrackEventImpl extends TrackEvent implements js_library.JSObjectInterfacesDom {
+  TrackEventImpl.internal_() : super.internal_();
+  get runtimeType => TrackEvent;
+  toString() => super.toString();
+}
+patch class Performance {
+  static Type get instanceRuntimeType => PerformanceImpl;
+
+}
+class PerformanceImpl extends Performance implements js_library.JSObjectInterfacesDom {
+  PerformanceImpl.internal_() : super.internal_();
+  get runtimeType => Performance;
+  toString() => super.toString();
+}
+patch class CssKeyframeRule {
+  static Type get instanceRuntimeType => CssKeyframeRuleImpl;
+
+}
+class CssKeyframeRuleImpl extends CssKeyframeRule implements js_library.JSObjectInterfacesDom {
+  CssKeyframeRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssKeyframeRule;
+  toString() => super.toString();
+}
+patch class MidiInputMap {
+  static Type get instanceRuntimeType => MidiInputMapImpl;
+
+}
+class MidiInputMapImpl extends MidiInputMap implements js_library.JSObjectInterfacesDom {
+  MidiInputMapImpl.internal_() : super.internal_();
+  get runtimeType => MidiInputMap;
+  toString() => super.toString();
+}
+patch class XmlDocument {
+  static Type get instanceRuntimeType => XmlDocumentImpl;
+
+}
+class XmlDocumentImpl extends XmlDocument implements js_library.JSObjectInterfacesDom {
+  XmlDocumentImpl.internal_() : super.internal_();
+  get runtimeType => XmlDocument;
+  toString() => super.toString();
+}
+patch class VREyeParameters {
+  static Type get instanceRuntimeType => VREyeParametersImpl;
+
+}
+class VREyeParametersImpl extends VREyeParameters implements js_library.JSObjectInterfacesDom {
+  VREyeParametersImpl.internal_() : super.internal_();
+  get runtimeType => VREyeParameters;
+  toString() => super.toString();
+}
+patch class Credential {
+  static Type get instanceRuntimeType => CredentialImpl;
+
+}
+class CredentialImpl extends Credential implements js_library.JSObjectInterfacesDom {
+  CredentialImpl.internal_() : super.internal_();
+  get runtimeType => Credential;
+  toString() => super.toString();
+}
+patch class DomException {
+  static Type get instanceRuntimeType => DomExceptionImpl;
+
+}
+class DomExceptionImpl extends DomException implements js_library.JSObjectInterfacesDom {
+  DomExceptionImpl.internal_() : super.internal_();
+  get runtimeType => DomException;
+  toString() => super.toString();
+}
+patch class LegendElement {
+  static Type get instanceRuntimeType => LegendElementImpl;
+
+}
+class LegendElementImpl extends LegendElement implements js_library.JSObjectInterfacesDom {
+  LegendElementImpl.internal_() : super.internal_();
+  get runtimeType => LegendElement;
+  toString() => super.toString();
+}
+patch class HttpRequestEventTarget {
+  static Type get instanceRuntimeType => HttpRequestEventTargetImpl;
+
+}
+class HttpRequestEventTargetImpl extends HttpRequestEventTarget implements js_library.JSObjectInterfacesDom {
+  HttpRequestEventTargetImpl.internal_() : super.internal_();
+  get runtimeType => HttpRequestEventTarget;
+  toString() => super.toString();
+}
+patch class UnknownElement {
+  static Type get instanceRuntimeType => UnknownElementImpl;
+
+}
+class UnknownElementImpl extends UnknownElement implements js_library.JSObjectInterfacesDom {
+  UnknownElementImpl.internal_() : super.internal_();
+  get runtimeType => UnknownElement;
+  toString() => super.toString();
+}
+patch class _RadioNodeList {
+  static Type get instanceRuntimeType => _RadioNodeListImpl;
+
+}
+class _RadioNodeListImpl extends _RadioNodeList implements js_library.JSObjectInterfacesDom {
+  _RadioNodeListImpl.internal_() : super.internal_();
+  get runtimeType => _RadioNodeList;
+  toString() => super.toString();
+}
+patch class NavigatorUserMediaError {
+  static Type get instanceRuntimeType => NavigatorUserMediaErrorImpl;
+
+}
+class NavigatorUserMediaErrorImpl extends NavigatorUserMediaError implements js_library.JSObjectInterfacesDom {
+  NavigatorUserMediaErrorImpl.internal_() : super.internal_();
+  get runtimeType => NavigatorUserMediaError;
+  toString() => super.toString();
+}
+patch class ImageBitmap {
+  static Type get instanceRuntimeType => ImageBitmapImpl;
+
+}
+class ImageBitmapImpl extends ImageBitmap implements js_library.JSObjectInterfacesDom {
+  ImageBitmapImpl.internal_() : super.internal_();
+  get runtimeType => ImageBitmap;
+  toString() => super.toString();
+}
+patch class AudioTrack {
+  static Type get instanceRuntimeType => AudioTrackImpl;
+
+}
+class AudioTrackImpl extends AudioTrack implements js_library.JSObjectInterfacesDom {
+  AudioTrackImpl.internal_() : super.internal_();
+  get runtimeType => AudioTrack;
+  toString() => super.toString();
+}
+patch class ReadableByteStream {
+  static Type get instanceRuntimeType => ReadableByteStreamImpl;
+
+}
+class ReadableByteStreamImpl extends ReadableByteStream implements js_library.JSObjectInterfacesDom {
+  ReadableByteStreamImpl.internal_() : super.internal_();
+  get runtimeType => ReadableByteStream;
+  toString() => super.toString();
+}
+patch class _HTMLFrameElement {
+  static Type get instanceRuntimeType => _HTMLFrameElementImpl;
+
+}
+class _HTMLFrameElementImpl extends _HTMLFrameElement implements js_library.JSObjectInterfacesDom {
+  _HTMLFrameElementImpl.internal_() : super.internal_();
+  get runtimeType => _HTMLFrameElement;
+  toString() => super.toString();
+}
+patch class Body {
+  static Type get instanceRuntimeType => BodyImpl;
+
+}
+class BodyImpl extends Body implements js_library.JSObjectInterfacesDom {
+  BodyImpl.internal_() : super.internal_();
+  get runtimeType => Body;
+  toString() => super.toString();
+}
+patch class MediaKeySystemAccess {
+  static Type get instanceRuntimeType => MediaKeySystemAccessImpl;
+
+}
+class MediaKeySystemAccessImpl extends MediaKeySystemAccess implements js_library.JSObjectInterfacesDom {
+  MediaKeySystemAccessImpl.internal_() : super.internal_();
+  get runtimeType => MediaKeySystemAccess;
+  toString() => super.toString();
+}
+patch class BluetoothGattService {
+  static Type get instanceRuntimeType => BluetoothGattServiceImpl;
+
+}
+class BluetoothGattServiceImpl extends BluetoothGattService implements js_library.JSObjectInterfacesDom {
+  BluetoothGattServiceImpl.internal_() : super.internal_();
+  get runtimeType => BluetoothGattService;
+  toString() => super.toString();
+}
+patch class _Attr {
+  static Type get instanceRuntimeType => _AttrImpl;
+
+}
+class _AttrImpl extends _Attr implements js_library.JSObjectInterfacesDom {
+  _AttrImpl.internal_() : super.internal_();
+  get runtimeType => _Attr;
+  toString() => super.toString();
+}
+patch class CanvasRenderingContext2D {
+  static Type get instanceRuntimeType => CanvasRenderingContext2DImpl;
+
+}
+class CanvasRenderingContext2DImpl extends CanvasRenderingContext2D implements js_library.JSObjectInterfacesDom {
+  CanvasRenderingContext2DImpl.internal_() : super.internal_();
+  get runtimeType => CanvasRenderingContext2D;
+  toString() => super.toString();
+}
+patch class OListElement {
+  static Type get instanceRuntimeType => OListElementImpl;
+
+}
+class OListElementImpl extends OListElement implements js_library.JSObjectInterfacesDom {
+  OListElementImpl.internal_() : super.internal_();
+  get runtimeType => OListElement;
+  toString() => super.toString();
+}
+patch class ApplicationCache {
+  static Type get instanceRuntimeType => ApplicationCacheImpl;
+
+}
+class ApplicationCacheImpl extends ApplicationCache implements js_library.JSObjectInterfacesDom {
+  ApplicationCacheImpl.internal_() : super.internal_();
+  get runtimeType => ApplicationCache;
+  toString() => super.toString();
+}
+patch class Clients {
+  static Type get instanceRuntimeType => ClientsImpl;
+
+}
+class ClientsImpl extends Clients implements js_library.JSObjectInterfacesDom {
+  ClientsImpl.internal_() : super.internal_();
+  get runtimeType => Clients;
+  toString() => super.toString();
+}
+patch class RtcPeerConnection {
+  static Type get instanceRuntimeType => RtcPeerConnectionImpl;
+
+}
+class RtcPeerConnectionImpl extends RtcPeerConnection implements js_library.JSObjectInterfacesDom {
+  RtcPeerConnectionImpl.internal_() : super.internal_();
+  get runtimeType => RtcPeerConnection;
+  toString() => super.toString();
+}
+patch class VideoElement {
+  static Type get instanceRuntimeType => VideoElementImpl;
+
+}
+class VideoElementImpl extends VideoElement implements js_library.JSObjectInterfacesDom {
+  VideoElementImpl.internal_() : super.internal_();
+  get runtimeType => VideoElement;
+  toString() => super.toString();
+}
+patch class OutputElement {
+  static Type get instanceRuntimeType => OutputElementImpl;
+
+}
+class OutputElementImpl extends OutputElement implements js_library.JSObjectInterfacesDom {
+  OutputElementImpl.internal_() : super.internal_();
+  get runtimeType => OutputElement;
+  toString() => super.toString();
+}
+patch class Coordinates {
+  static Type get instanceRuntimeType => CoordinatesImpl;
+
+}
+class CoordinatesImpl extends Coordinates implements js_library.JSObjectInterfacesDom {
+  CoordinatesImpl.internal_() : super.internal_();
+  get runtimeType => Coordinates;
+  toString() => super.toString();
+}
+patch class NetworkInformation {
+  static Type get instanceRuntimeType => NetworkInformationImpl;
+
+}
+class NetworkInformationImpl extends NetworkInformation implements js_library.JSObjectInterfacesDom {
+  NetworkInformationImpl.internal_() : super.internal_();
+  get runtimeType => NetworkInformation;
+  toString() => super.toString();
+}
+patch class FocusEvent {
+  static Type get instanceRuntimeType => FocusEventImpl;
+
+}
+class FocusEventImpl extends FocusEvent implements js_library.JSObjectInterfacesDom {
+  FocusEventImpl.internal_() : super.internal_();
+  get runtimeType => FocusEvent;
+  toString() => super.toString();
+}
+patch class SpeechGrammarList {
+  static Type get instanceRuntimeType => SpeechGrammarListImpl;
+
+}
+class SpeechGrammarListImpl extends SpeechGrammarList implements js_library.JSObjectInterfacesDom {
+  SpeechGrammarListImpl.internal_() : super.internal_();
+  get runtimeType => SpeechGrammarList;
+  toString() => super.toString();
+}
+patch class Range {
+  static Type get instanceRuntimeType => RangeImpl;
+
+}
+class RangeImpl extends Range implements js_library.JSObjectInterfacesDom {
+  RangeImpl.internal_() : super.internal_();
+  get runtimeType => Range;
+  toString() => super.toString();
+}
+patch class SpeechGrammar {
+  static Type get instanceRuntimeType => SpeechGrammarImpl;
+
+}
+class SpeechGrammarImpl extends SpeechGrammar implements js_library.JSObjectInterfacesDom {
+  SpeechGrammarImpl.internal_() : super.internal_();
+  get runtimeType => SpeechGrammar;
+  toString() => super.toString();
+}
+patch class WorkerGlobalScope {
+  static Type get instanceRuntimeType => WorkerGlobalScopeImpl;
+
+}
+class WorkerGlobalScopeImpl extends WorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+  WorkerGlobalScopeImpl.internal_() : super.internal_();
+  get runtimeType => WorkerGlobalScope;
+  toString() => super.toString();
+}
+patch class ScreenOrientation {
+  static Type get instanceRuntimeType => ScreenOrientationImpl;
+
+}
+class ScreenOrientationImpl extends ScreenOrientation implements js_library.JSObjectInterfacesDom {
+  ScreenOrientationImpl.internal_() : super.internal_();
+  get runtimeType => ScreenOrientation;
+  toString() => super.toString();
+}
+patch class NonElementParentNode {
+  static Type get instanceRuntimeType => NonElementParentNodeImpl;
+
+}
+class NonElementParentNodeImpl extends NonElementParentNode implements js_library.JSObjectInterfacesDom {
+  NonElementParentNodeImpl.internal_() : super.internal_();
+  get runtimeType => NonElementParentNode;
+  toString() => super.toString();
+}
+patch class TitleElement {
+  static Type get instanceRuntimeType => TitleElementImpl;
+
+}
+class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
+  TitleElementImpl.internal_() : super.internal_();
+  get runtimeType => TitleElement;
+  toString() => super.toString();
+}
+patch class MidiConnectionEvent {
+  static Type get instanceRuntimeType => MidiConnectionEventImpl;
+
+}
+class MidiConnectionEventImpl extends MidiConnectionEvent implements js_library.JSObjectInterfacesDom {
+  MidiConnectionEventImpl.internal_() : super.internal_();
+  get runtimeType => MidiConnectionEvent;
+  toString() => super.toString();
+}
+patch class NotificationEvent {
+  static Type get instanceRuntimeType => NotificationEventImpl;
+
+}
+class NotificationEventImpl extends NotificationEvent implements js_library.JSObjectInterfacesDom {
+  NotificationEventImpl.internal_() : super.internal_();
+  get runtimeType => NotificationEvent;
+  toString() => super.toString();
+}
+patch class BeforeInstallPromptEvent {
+  static Type get instanceRuntimeType => BeforeInstallPromptEventImpl;
+
+}
+class BeforeInstallPromptEventImpl extends BeforeInstallPromptEvent implements js_library.JSObjectInterfacesDom {
+  BeforeInstallPromptEventImpl.internal_() : super.internal_();
+  get runtimeType => BeforeInstallPromptEvent;
+  toString() => super.toString();
+}
+patch class _CanvasPathMethods {
+  static Type get instanceRuntimeType => _CanvasPathMethodsImpl;
+
+}
+class _CanvasPathMethodsImpl extends _CanvasPathMethods implements js_library.JSObjectInterfacesDom {
+  _CanvasPathMethodsImpl.internal_() : super.internal_();
+  get runtimeType => _CanvasPathMethods;
+  toString() => super.toString();
+}
+patch class UrlUtils {
+  static Type get instanceRuntimeType => UrlUtilsImpl;
+
+}
+class UrlUtilsImpl extends UrlUtils implements js_library.JSObjectInterfacesDom {
+  UrlUtilsImpl.internal_() : super.internal_();
+  get runtimeType => UrlUtils;
+  toString() => super.toString();
+}
+patch class SelectElement {
+  static Type get instanceRuntimeType => SelectElementImpl;
+
+}
+class SelectElementImpl extends SelectElement implements js_library.JSObjectInterfacesDom {
+  SelectElementImpl.internal_() : super.internal_();
+  get runtimeType => SelectElement;
+  toString() => super.toString();
+}
+patch class Bluetooth {
+  static Type get instanceRuntimeType => BluetoothImpl;
+
+}
+class BluetoothImpl extends Bluetooth implements js_library.JSObjectInterfacesDom {
+  BluetoothImpl.internal_() : super.internal_();
+  get runtimeType => Bluetooth;
+  toString() => super.toString();
+}
+patch class BluetoothDevice {
+  static Type get instanceRuntimeType => BluetoothDeviceImpl;
+
+}
+class BluetoothDeviceImpl extends BluetoothDevice implements js_library.JSObjectInterfacesDom {
+  BluetoothDeviceImpl.internal_() : super.internal_();
+  get runtimeType => BluetoothDevice;
+  toString() => super.toString();
+}
+patch class ConsoleBase {
+  static Type get instanceRuntimeType => ConsoleBaseImpl;
+
+}
+class ConsoleBaseImpl extends ConsoleBase implements js_library.JSObjectInterfacesDom {
+  ConsoleBaseImpl.internal_() : super.internal_();
+  get runtimeType => ConsoleBase;
+  toString() => super.toString();
+}
+patch class AudioElement {
+  static Type get instanceRuntimeType => AudioElementImpl;
+
+}
+class AudioElementImpl extends AudioElement implements js_library.JSObjectInterfacesDom {
+  AudioElementImpl.internal_() : super.internal_();
+  get runtimeType => AudioElement;
+  toString() => super.toString();
+}
+patch class PushMessageData {
+  static Type get instanceRuntimeType => PushMessageDataImpl;
+
+}
+class PushMessageDataImpl extends PushMessageData implements js_library.JSObjectInterfacesDom {
+  PushMessageDataImpl.internal_() : super.internal_();
+  get runtimeType => PushMessageData;
+  toString() => super.toString();
+}
+patch class SpeechRecognitionEvent {
+  static Type get instanceRuntimeType => SpeechRecognitionEventImpl;
+
+}
+class SpeechRecognitionEventImpl extends SpeechRecognitionEvent implements js_library.JSObjectInterfacesDom {
+  SpeechRecognitionEventImpl.internal_() : super.internal_();
+  get runtimeType => SpeechRecognitionEvent;
+  toString() => super.toString();
+}
+patch class WebSocket {
+  static Type get instanceRuntimeType => WebSocketImpl;
+
+}
+class WebSocketImpl extends WebSocket implements js_library.JSObjectInterfacesDom {
+  WebSocketImpl.internal_() : super.internal_();
+  get runtimeType => WebSocket;
+  toString() => super.toString();
+}
+patch class _XMLHttpRequestProgressEvent {
+  static Type get instanceRuntimeType => _XMLHttpRequestProgressEventImpl;
+
+}
+class _XMLHttpRequestProgressEventImpl extends _XMLHttpRequestProgressEvent implements js_library.JSObjectInterfacesDom {
+  _XMLHttpRequestProgressEventImpl.internal_() : super.internal_();
+  get runtimeType => _XMLHttpRequestProgressEvent;
+  toString() => super.toString();
+}
+patch class Location {
+  static Type get instanceRuntimeType => LocationImpl;
+
+}
+class LocationImpl extends Location implements js_library.JSObjectInterfacesDom {
+  LocationImpl.internal_() : super.internal_();
+  get runtimeType => Location;
+  toString() => super.toString();
+}
+patch class PerformanceEntry {
+  static Type get instanceRuntimeType => PerformanceEntryImpl;
+
+}
+class PerformanceEntryImpl extends PerformanceEntry implements js_library.JSObjectInterfacesDom {
+  PerformanceEntryImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceEntry;
+  toString() => super.toString();
+}
+patch class Client {
+  static Type get instanceRuntimeType => ClientImpl;
+
+}
+class ClientImpl extends Client implements js_library.JSObjectInterfacesDom {
+  ClientImpl.internal_() : super.internal_();
+  get runtimeType => Client;
+  toString() => super.toString();
+}
+patch class _Cache {
+  static Type get instanceRuntimeType => _CacheImpl;
+
+}
+class _CacheImpl extends _Cache implements js_library.JSObjectInterfacesDom {
+  _CacheImpl.internal_() : super.internal_();
+  get runtimeType => _Cache;
+  toString() => super.toString();
+}
+patch class MimeType {
+  static Type get instanceRuntimeType => MimeTypeImpl;
+
+}
+class MimeTypeImpl extends MimeType implements js_library.JSObjectInterfacesDom {
+  MimeTypeImpl.internal_() : super.internal_();
+  get runtimeType => MimeType;
+  toString() => super.toString();
+}
+patch class MidiOutputMap {
+  static Type get instanceRuntimeType => MidiOutputMapImpl;
+
+}
+class MidiOutputMapImpl extends MidiOutputMap implements js_library.JSObjectInterfacesDom {
+  MidiOutputMapImpl.internal_() : super.internal_();
+  get runtimeType => MidiOutputMap;
+  toString() => super.toString();
+}
+patch class PointerEvent {
+  static Type get instanceRuntimeType => PointerEventImpl;
+
+}
+class PointerEventImpl extends PointerEvent implements js_library.JSObjectInterfacesDom {
+  PointerEventImpl.internal_() : super.internal_();
+  get runtimeType => PointerEvent;
+  toString() => super.toString();
+}
+patch class ChildNode {
+  static Type get instanceRuntimeType => ChildNodeImpl;
+
+}
+class ChildNodeImpl extends ChildNode implements js_library.JSObjectInterfacesDom {
+  ChildNodeImpl.internal_() : super.internal_();
+  get runtimeType => ChildNode;
+  toString() => super.toString();
+}
+patch class Geolocation {
+  static Type get instanceRuntimeType => GeolocationImpl;
+
+}
+class GeolocationImpl extends Geolocation implements js_library.JSObjectInterfacesDom {
+  GeolocationImpl.internal_() : super.internal_();
+  get runtimeType => Geolocation;
+  toString() => super.toString();
+}
+patch class _CssRuleList {
+  static Type get instanceRuntimeType => _CssRuleListImpl;
+
+}
+class _CssRuleListImpl extends _CssRuleList implements js_library.JSObjectInterfacesDom {
+  _CssRuleListImpl.internal_() : super.internal_();
+  get runtimeType => _CssRuleList;
+  toString() => super.toString();
+}
+patch class MediaKeyEvent {
+  static Type get instanceRuntimeType => MediaKeyEventImpl;
+
+}
+class MediaKeyEventImpl extends MediaKeyEvent implements js_library.JSObjectInterfacesDom {
+  MediaKeyEventImpl.internal_() : super.internal_();
+  get runtimeType => MediaKeyEvent;
+  toString() => super.toString();
+}
+patch class CompositorWorker {
+  static Type get instanceRuntimeType => CompositorWorkerImpl;
+
+}
+class CompositorWorkerImpl extends CompositorWorker implements js_library.JSObjectInterfacesDom {
+  CompositorWorkerImpl.internal_() : super.internal_();
+  get runtimeType => CompositorWorker;
+  toString() => super.toString();
+}
+patch class ProgressElement {
+  static Type get instanceRuntimeType => ProgressElementImpl;
+
+}
+class ProgressElementImpl extends ProgressElement implements js_library.JSObjectInterfacesDom {
+  ProgressElementImpl.internal_() : super.internal_();
+  get runtimeType => ProgressElement;
+  toString() => super.toString();
+}
+patch class SharedArrayBuffer {
+  static Type get instanceRuntimeType => SharedArrayBufferImpl;
+
+}
+class SharedArrayBufferImpl extends SharedArrayBuffer implements js_library.JSObjectInterfacesDom {
+  SharedArrayBufferImpl.internal_() : super.internal_();
+  get runtimeType => SharedArrayBuffer;
+  toString() => super.toString();
+}
+patch class CrossOriginConnectEvent {
+  static Type get instanceRuntimeType => CrossOriginConnectEventImpl;
+
+}
+class CrossOriginConnectEventImpl extends CrossOriginConnectEvent implements js_library.JSObjectInterfacesDom {
+  CrossOriginConnectEventImpl.internal_() : super.internal_();
+  get runtimeType => CrossOriginConnectEvent;
+  toString() => super.toString();
+}
+patch class BeforeUnloadEvent {
+  static Type get instanceRuntimeType => BeforeUnloadEventImpl;
+
+}
+class BeforeUnloadEventImpl extends BeforeUnloadEvent implements js_library.JSObjectInterfacesDom {
+  BeforeUnloadEventImpl.internal_() : super.internal_();
+  get runtimeType => BeforeUnloadEvent;
+  toString() => super.toString();
+}
+patch class DataTransferItem {
+  static Type get instanceRuntimeType => DataTransferItemImpl;
+
+}
+class DataTransferItemImpl extends DataTransferItem implements js_library.JSObjectInterfacesDom {
+  DataTransferItemImpl.internal_() : super.internal_();
+  get runtimeType => DataTransferItem;
+  toString() => super.toString();
+}
+patch class _HTMLAllCollection {
+  static Type get instanceRuntimeType => _HTMLAllCollectionImpl;
+
+}
+class _HTMLAllCollectionImpl extends _HTMLAllCollection implements js_library.JSObjectInterfacesDom {
+  _HTMLAllCollectionImpl.internal_() : super.internal_();
+  get runtimeType => _HTMLAllCollection;
+  toString() => super.toString();
+}
+patch class ServicePortCollection {
+  static Type get instanceRuntimeType => ServicePortCollectionImpl;
+
+}
+class ServicePortCollectionImpl extends ServicePortCollection implements js_library.JSObjectInterfacesDom {
+  ServicePortCollectionImpl.internal_() : super.internal_();
+  get runtimeType => ServicePortCollection;
+  toString() => super.toString();
+}
+patch class KeygenElement {
+  static Type get instanceRuntimeType => KeygenElementImpl;
+
+}
+class KeygenElementImpl extends KeygenElement implements js_library.JSObjectInterfacesDom {
+  KeygenElementImpl.internal_() : super.internal_();
+  get runtimeType => KeygenElement;
+  toString() => super.toString();
+}
+patch class CryptoKey {
+  static Type get instanceRuntimeType => CryptoKeyImpl;
+
+}
+class CryptoKeyImpl extends CryptoKey implements js_library.JSObjectInterfacesDom {
+  CryptoKeyImpl.internal_() : super.internal_();
+  get runtimeType => CryptoKey;
+  toString() => super.toString();
+}
+patch class CssKeyframesRule {
+  static Type get instanceRuntimeType => CssKeyframesRuleImpl;
+
+}
+class CssKeyframesRuleImpl extends CssKeyframesRule implements js_library.JSObjectInterfacesDom {
+  CssKeyframesRuleImpl.internal_() : super.internal_();
+  get runtimeType => CssKeyframesRule;
+  toString() => super.toString();
+}
+patch class _HTMLMarqueeElement {
+  static Type get instanceRuntimeType => _HTMLMarqueeElementImpl;
+
+}
+class _HTMLMarqueeElementImpl extends _HTMLMarqueeElement implements js_library.JSObjectInterfacesDom {
+  _HTMLMarqueeElementImpl.internal_() : super.internal_();
+  get runtimeType => _HTMLMarqueeElement;
+  toString() => super.toString();
+}
+patch class TextEvent {
+  static Type get instanceRuntimeType => TextEventImpl;
+
+}
+class TextEventImpl extends TextEvent implements js_library.JSObjectInterfacesDom {
+  TextEventImpl.internal_() : super.internal_();
+  get runtimeType => TextEvent;
+  toString() => super.toString();
+}
+patch class _EntrySync {
+  static Type get instanceRuntimeType => _EntrySyncImpl;
+
+}
+class _EntrySyncImpl extends _EntrySync implements js_library.JSObjectInterfacesDom {
+  _EntrySyncImpl.internal_() : super.internal_();
+  get runtimeType => _EntrySync;
+  toString() => super.toString();
+}
+patch class GeofencingEvent {
+  static Type get instanceRuntimeType => GeofencingEventImpl;
+
+}
+class GeofencingEventImpl extends GeofencingEvent implements js_library.JSObjectInterfacesDom {
+  GeofencingEventImpl.internal_() : super.internal_();
+  get runtimeType => GeofencingEvent;
+  toString() => super.toString();
+}
+patch class MediaKeys {
+  static Type get instanceRuntimeType => MediaKeysImpl;
+
+}
+class MediaKeysImpl extends MediaKeys implements js_library.JSObjectInterfacesDom {
+  MediaKeysImpl.internal_() : super.internal_();
+  get runtimeType => MediaKeys;
+  toString() => super.toString();
+}
+patch class DomPointReadOnly {
+  static Type get instanceRuntimeType => DomPointReadOnlyImpl;
+
+}
+class DomPointReadOnlyImpl extends DomPointReadOnly implements js_library.JSObjectInterfacesDom {
+  DomPointReadOnlyImpl.internal_() : super.internal_();
+  get runtimeType => DomPointReadOnly;
+  toString() => super.toString();
+}
+patch class WindowBase64 {
+  static Type get instanceRuntimeType => WindowBase64Impl;
+
+}
+class WindowBase64Impl extends WindowBase64 implements js_library.JSObjectInterfacesDom {
+  WindowBase64Impl.internal_() : super.internal_();
+  get runtimeType => WindowBase64;
+  toString() => super.toString();
+}
+patch class SpeechRecognitionError {
+  static Type get instanceRuntimeType => SpeechRecognitionErrorImpl;
+
+}
+class SpeechRecognitionErrorImpl extends SpeechRecognitionError implements js_library.JSObjectInterfacesDom {
+  SpeechRecognitionErrorImpl.internal_() : super.internal_();
+  get runtimeType => SpeechRecognitionError;
+  toString() => super.toString();
+}
+patch class MidiOutput {
+  static Type get instanceRuntimeType => MidiOutputImpl;
+
+}
+class MidiOutputImpl extends MidiOutput implements js_library.JSObjectInterfacesDom {
+  MidiOutputImpl.internal_() : super.internal_();
+  get runtimeType => MidiOutput;
+  toString() => super.toString();
+}
+patch class EventSource {
+  static Type get instanceRuntimeType => EventSourceImpl;
+
+}
+class EventSourceImpl extends EventSource implements js_library.JSObjectInterfacesDom {
+  EventSourceImpl.internal_() : super.internal_();
+  get runtimeType => EventSource;
+  toString() => super.toString();
+}
+patch class DeviceOrientationEvent {
+  static Type get instanceRuntimeType => DeviceOrientationEventImpl;
+
+}
+class DeviceOrientationEventImpl extends DeviceOrientationEvent implements js_library.JSObjectInterfacesDom {
+  DeviceOrientationEventImpl.internal_() : super.internal_();
+  get runtimeType => DeviceOrientationEvent;
+  toString() => super.toString();
+}
+patch class DirectoryEntry {
+  static Type get instanceRuntimeType => DirectoryEntryImpl;
+
+}
+class DirectoryEntryImpl extends DirectoryEntry implements js_library.JSObjectInterfacesDom {
+  DirectoryEntryImpl.internal_() : super.internal_();
+  get runtimeType => DirectoryEntry;
+  toString() => super.toString();
+}
+patch class ShadowElement {
+  static Type get instanceRuntimeType => ShadowElementImpl;
+
+}
+class ShadowElementImpl extends ShadowElement implements js_library.JSObjectInterfacesDom {
+  ShadowElementImpl.internal_() : super.internal_();
+  get runtimeType => ShadowElement;
+  toString() => super.toString();
+}
+patch class AppBannerPromptResult {
+  static Type get instanceRuntimeType => AppBannerPromptResultImpl;
+
+}
+class AppBannerPromptResultImpl extends AppBannerPromptResult implements js_library.JSObjectInterfacesDom {
+  AppBannerPromptResultImpl.internal_() : super.internal_();
+  get runtimeType => AppBannerPromptResult;
+  toString() => super.toString();
+}
+patch class Blob {
+  static Type get instanceRuntimeType => BlobImpl;
+
+}
+class BlobImpl extends Blob implements js_library.JSObjectInterfacesDom {
+  BlobImpl.internal_() : super.internal_();
+  get runtimeType => Blob;
+  toString() => super.toString();
+}
+patch class VttCue {
+  static Type get instanceRuntimeType => VttCueImpl;
+
+}
+class VttCueImpl extends VttCue implements js_library.JSObjectInterfacesDom {
+  VttCueImpl.internal_() : super.internal_();
+  get runtimeType => VttCue;
+  toString() => super.toString();
+}
+patch class PopStateEvent {
+  static Type get instanceRuntimeType => PopStateEventImpl;
+
+}
+class PopStateEventImpl extends PopStateEvent implements js_library.JSObjectInterfacesDom {
+  PopStateEventImpl.internal_() : super.internal_();
+  get runtimeType => PopStateEvent;
+  toString() => super.toString();
+}
+patch class PushSubscription {
+  static Type get instanceRuntimeType => PushSubscriptionImpl;
+
+}
+class PushSubscriptionImpl extends PushSubscription implements js_library.JSObjectInterfacesDom {
+  PushSubscriptionImpl.internal_() : super.internal_();
+  get runtimeType => PushSubscription;
+  toString() => super.toString();
+}
+patch class UrlUtilsReadOnly {
+  static Type get instanceRuntimeType => UrlUtilsReadOnlyImpl;
+
+}
+class UrlUtilsReadOnlyImpl extends UrlUtilsReadOnly implements js_library.JSObjectInterfacesDom {
+  UrlUtilsReadOnlyImpl.internal_() : super.internal_();
+  get runtimeType => UrlUtilsReadOnly;
+  toString() => super.toString();
+}
+patch class MediaError {
+  static Type get instanceRuntimeType => MediaErrorImpl;
+
+}
+class MediaErrorImpl extends MediaError implements js_library.JSObjectInterfacesDom {
+  MediaErrorImpl.internal_() : super.internal_();
+  get runtimeType => MediaError;
+  toString() => super.toString();
+}
+patch class SourceBufferList {
+  static Type get instanceRuntimeType => SourceBufferListImpl;
+
+}
+class SourceBufferListImpl extends SourceBufferList implements js_library.JSObjectInterfacesDom {
+  SourceBufferListImpl.internal_() : super.internal_();
+  get runtimeType => SourceBufferList;
+  toString() => super.toString();
+}
+patch class AnimationEffectReadOnly {
+  static Type get instanceRuntimeType => AnimationEffectReadOnlyImpl;
+
+}
+class AnimationEffectReadOnlyImpl extends AnimationEffectReadOnly implements js_library.JSObjectInterfacesDom {
+  AnimationEffectReadOnlyImpl.internal_() : super.internal_();
+  get runtimeType => AnimationEffectReadOnly;
+  toString() => super.toString();
+}
+patch class PerformanceResourceTiming {
+  static Type get instanceRuntimeType => PerformanceResourceTimingImpl;
+
+}
+class PerformanceResourceTimingImpl extends PerformanceResourceTiming implements js_library.JSObjectInterfacesDom {
+  PerformanceResourceTimingImpl.internal_() : super.internal_();
+  get runtimeType => PerformanceResourceTiming;
+  toString() => super.toString();
+}
+patch class GeofencingRegion {
+  static Type get instanceRuntimeType => GeofencingRegionImpl;
+
+}
+class GeofencingRegionImpl extends GeofencingRegion implements js_library.JSObjectInterfacesDom {
+  GeofencingRegionImpl.internal_() : super.internal_();
+  get runtimeType => GeofencingRegion;
+  toString() => super.toString();
+}
+patch class CharacterData {
+  static Type get instanceRuntimeType => CharacterDataImpl;
+
+}
+class CharacterDataImpl extends CharacterData implements js_library.JSObjectInterfacesDom {
+  CharacterDataImpl.internal_() : super.internal_();
+  get runtimeType => CharacterData;
+  toString() => super.toString();
+}
+patch class Css {
+  static Type get instanceRuntimeType => CssImpl;
+
+}
+class CssImpl extends Css implements js_library.JSObjectInterfacesDom {
+  CssImpl.internal_() : super.internal_();
+  get runtimeType => Css;
+  toString() => super.toString();
+}
+patch class MidiInput {
+  static Type get instanceRuntimeType => MidiInputImpl;
+
+}
+class MidiInputImpl extends MidiInput implements js_library.JSObjectInterfacesDom {
+  MidiInputImpl.internal_() : super.internal_();
+  get runtimeType => MidiInput;
+  toString() => super.toString();
+}
+patch class ServicePortConnectEvent {
+  static Type get instanceRuntimeType => ServicePortConnectEventImpl;
+
+}
+class ServicePortConnectEventImpl extends ServicePortConnectEvent implements js_library.JSObjectInterfacesDom {
+  ServicePortConnectEventImpl.internal_() : super.internal_();
+  get runtimeType => ServicePortConnectEvent;
+  toString() => super.toString();
+}
+patch class ExtendableEvent {
+  static Type get instanceRuntimeType => ExtendableEventImpl;
+
+}
+class ExtendableEventImpl extends ExtendableEvent implements js_library.JSObjectInterfacesDom {
+  ExtendableEventImpl.internal_() : super.internal_();
+  get runtimeType => ExtendableEvent;
+  toString() => super.toString();
+}
+patch class MediaStreamEvent {
+  static Type get instanceRuntimeType => MediaStreamEventImpl;
+
+}
+class MediaStreamEventImpl extends MediaStreamEvent implements js_library.JSObjectInterfacesDom {
+  MediaStreamEventImpl.internal_() : super.internal_();
+  get runtimeType => MediaStreamEvent;
+  toString() => super.toString();
+}
+patch class XPathNSResolver {
+  static Type get instanceRuntimeType => XPathNSResolverImpl;
+
+}
+class XPathNSResolverImpl extends XPathNSResolver implements js_library.JSObjectInterfacesDom {
+  XPathNSResolverImpl.internal_() : super.internal_();
+  get runtimeType => XPathNSResolver;
+  toString() => super.toString();
+}
+patch class _FileWriterSync {
+  static Type get instanceRuntimeType => _FileWriterSyncImpl;
+
+}
+class _FileWriterSyncImpl extends _FileWriterSync implements js_library.JSObjectInterfacesDom {
+  _FileWriterSyncImpl.internal_() : super.internal_();
+  get runtimeType => _FileWriterSync;
+  toString() => super.toString();
+}
+
+"""],"dart:indexed_db": ["dart:indexed_db", "dart:indexed_db_js_interop_patch.dart", """import 'dart:js' as js_library;
+
+/**
+ * Placeholder object for cases where we need to determine exactly how many
+ * args were passed to a function.
+ */
+const _UNDEFINED_JS_CONST = const Object();
+
+patch class IdbFactory {
+  static Type get instanceRuntimeType => IdbFactoryImpl;
+
+}
+class IdbFactoryImpl extends IdbFactory implements js_library.JSObjectInterfacesDom {
+  IdbFactoryImpl.internal_() : super.internal_();
+  get runtimeType => IdbFactory;
+  toString() => super.toString();
+}
+patch class Cursor {
+  static Type get instanceRuntimeType => CursorImpl;
+
+}
+class CursorImpl extends Cursor implements js_library.JSObjectInterfacesDom {
+  CursorImpl.internal_() : super.internal_();
+  get runtimeType => Cursor;
+  toString() => super.toString();
+}
+patch class Transaction {
+  static Type get instanceRuntimeType => TransactionImpl;
+
+}
+class TransactionImpl extends Transaction implements js_library.JSObjectInterfacesDom {
+  TransactionImpl.internal_() : super.internal_();
+  get runtimeType => Transaction;
+  toString() => super.toString();
+}
+patch class KeyRange {
+  static Type get instanceRuntimeType => KeyRangeImpl;
+
+}
+class KeyRangeImpl extends KeyRange implements js_library.JSObjectInterfacesDom {
+  KeyRangeImpl.internal_() : super.internal_();
+  get runtimeType => KeyRange;
+  toString() => super.toString();
+}
+patch class Request {
+  static Type get instanceRuntimeType => RequestImpl;
+
+}
+class RequestImpl extends Request implements js_library.JSObjectInterfacesDom {
+  RequestImpl.internal_() : super.internal_();
+  get runtimeType => Request;
+  toString() => super.toString();
+}
+patch class OpenDBRequest {
+  static Type get instanceRuntimeType => OpenDBRequestImpl;
+
+}
+class OpenDBRequestImpl extends OpenDBRequest implements js_library.JSObjectInterfacesDom {
+  OpenDBRequestImpl.internal_() : super.internal_();
+  get runtimeType => OpenDBRequest;
+  toString() => super.toString();
+}
+patch class Database {
+  static Type get instanceRuntimeType => DatabaseImpl;
+
+}
+class DatabaseImpl extends Database implements js_library.JSObjectInterfacesDom {
+  DatabaseImpl.internal_() : super.internal_();
+  get runtimeType => Database;
+  toString() => super.toString();
+}
+patch class Index {
+  static Type get instanceRuntimeType => IndexImpl;
+
+}
+class IndexImpl extends Index implements js_library.JSObjectInterfacesDom {
+  IndexImpl.internal_() : super.internal_();
+  get runtimeType => Index;
+  toString() => super.toString();
+}
+patch class ObjectStore {
+  static Type get instanceRuntimeType => ObjectStoreImpl;
+
+}
+class ObjectStoreImpl extends ObjectStore implements js_library.JSObjectInterfacesDom {
+  ObjectStoreImpl.internal_() : super.internal_();
+  get runtimeType => ObjectStore;
+  toString() => super.toString();
+}
+patch class VersionChangeEvent {
+  static Type get instanceRuntimeType => VersionChangeEventImpl;
+
+}
+class VersionChangeEventImpl extends VersionChangeEvent implements js_library.JSObjectInterfacesDom {
+  VersionChangeEventImpl.internal_() : super.internal_();
+  get runtimeType => VersionChangeEvent;
+  toString() => super.toString();
+}
+patch class CursorWithValue {
+  static Type get instanceRuntimeType => CursorWithValueImpl;
+
+}
+class CursorWithValueImpl extends CursorWithValue implements js_library.JSObjectInterfacesDom {
+  CursorWithValueImpl.internal_() : super.internal_();
+  get runtimeType => CursorWithValue;
+  toString() => super.toString();
+}
+
+"""],"dart:web_gl": ["dart:web_gl", "dart:web_gl_js_interop_patch.dart", """import 'dart:js' as js_library;
+
+/**
+ * Placeholder object for cases where we need to determine exactly how many
+ * args were passed to a function.
+ */
+const _UNDEFINED_JS_CONST = const Object();
+
+patch class Buffer {
+  static Type get instanceRuntimeType => BufferImpl;
+
+}
+class BufferImpl extends Buffer implements js_library.JSObjectInterfacesDom {
+  BufferImpl.internal_() : super.internal_();
+  get runtimeType => Buffer;
+  toString() => super.toString();
+}
+patch class Texture {
+  static Type get instanceRuntimeType => TextureImpl;
+
+}
+class TextureImpl extends Texture implements js_library.JSObjectInterfacesDom {
+  TextureImpl.internal_() : super.internal_();
+  get runtimeType => Texture;
+  toString() => super.toString();
+}
+patch class VertexArrayObjectOes {
+  static Type get instanceRuntimeType => VertexArrayObjectOesImpl;
+
+}
+class VertexArrayObjectOesImpl extends VertexArrayObjectOes implements js_library.JSObjectInterfacesDom {
+  VertexArrayObjectOesImpl.internal_() : super.internal_();
+  get runtimeType => VertexArrayObjectOes;
+  toString() => super.toString();
+}
+patch class DepthTexture {
+  static Type get instanceRuntimeType => DepthTextureImpl;
+
+}
+class DepthTextureImpl extends DepthTexture implements js_library.JSObjectInterfacesDom {
+  DepthTextureImpl.internal_() : super.internal_();
+  get runtimeType => DepthTexture;
+  toString() => super.toString();
+}
+patch class OesTextureHalfFloatLinear {
+  static Type get instanceRuntimeType => OesTextureHalfFloatLinearImpl;
+
+}
+class OesTextureHalfFloatLinearImpl extends OesTextureHalfFloatLinear implements js_library.JSObjectInterfacesDom {
+  OesTextureHalfFloatLinearImpl.internal_() : super.internal_();
+  get runtimeType => OesTextureHalfFloatLinear;
+  toString() => super.toString();
+}
+patch class Sampler {
+  static Type get instanceRuntimeType => SamplerImpl;
+
+}
+class SamplerImpl extends Sampler implements js_library.JSObjectInterfacesDom {
+  SamplerImpl.internal_() : super.internal_();
+  get runtimeType => Sampler;
+  toString() => super.toString();
+}
+patch class Sync {
+  static Type get instanceRuntimeType => SyncImpl;
+
+}
+class SyncImpl extends Sync implements js_library.JSObjectInterfacesDom {
+  SyncImpl.internal_() : super.internal_();
+  get runtimeType => Sync;
+  toString() => super.toString();
+}
+patch class OesVertexArrayObject {
+  static Type get instanceRuntimeType => OesVertexArrayObjectImpl;
+
+}
+class OesVertexArrayObjectImpl extends OesVertexArrayObject implements js_library.JSObjectInterfacesDom {
+  OesVertexArrayObjectImpl.internal_() : super.internal_();
+  get runtimeType => OesVertexArrayObject;
+  toString() => super.toString();
+}
+patch class CompressedTextureS3TC {
+  static Type get instanceRuntimeType => CompressedTextureS3TCImpl;
+
+}
+class CompressedTextureS3TCImpl extends CompressedTextureS3TC implements js_library.JSObjectInterfacesDom {
+  CompressedTextureS3TCImpl.internal_() : super.internal_();
+  get runtimeType => CompressedTextureS3TC;
+  toString() => super.toString();
+}
+patch class ExtFragDepth {
+  static Type get instanceRuntimeType => ExtFragDepthImpl;
+
+}
+class ExtFragDepthImpl extends ExtFragDepth implements js_library.JSObjectInterfacesDom {
+  ExtFragDepthImpl.internal_() : super.internal_();
+  get runtimeType => ExtFragDepth;
+  toString() => super.toString();
+}
+patch class Shader {
+  static Type get instanceRuntimeType => ShaderImpl;
+
+}
+class ShaderImpl extends Shader implements js_library.JSObjectInterfacesDom {
+  ShaderImpl.internal_() : super.internal_();
+  get runtimeType => Shader;
+  toString() => super.toString();
+}
+patch class _WebGL2RenderingContextBase {
+  static Type get instanceRuntimeType => _WebGL2RenderingContextBaseImpl;
+
+}
+class _WebGL2RenderingContextBaseImpl extends _WebGL2RenderingContextBase implements js_library.JSObjectInterfacesDom {
+  _WebGL2RenderingContextBaseImpl.internal_() : super.internal_();
+  get runtimeType => _WebGL2RenderingContextBase;
+  toString() => super.toString();
+}
+patch class Query {
+  static Type get instanceRuntimeType => QueryImpl;
+
+}
+class QueryImpl extends Query implements js_library.JSObjectInterfacesDom {
+  QueryImpl.internal_() : super.internal_();
+  get runtimeType => Query;
+  toString() => super.toString();
+}
+patch class RenderingContext {
+  static Type get instanceRuntimeType => RenderingContextImpl;
+
+}
+class RenderingContextImpl extends RenderingContext implements js_library.JSObjectInterfacesDom {
+  RenderingContextImpl.internal_() : super.internal_();
+  get runtimeType => RenderingContext;
+  toString() => super.toString();
+}
+patch class ShaderPrecisionFormat {
+  static Type get instanceRuntimeType => ShaderPrecisionFormatImpl;
+
+}
+class ShaderPrecisionFormatImpl extends ShaderPrecisionFormat implements js_library.JSObjectInterfacesDom {
+  ShaderPrecisionFormatImpl.internal_() : super.internal_();
+  get runtimeType => ShaderPrecisionFormat;
+  toString() => super.toString();
+}
+patch class OesTextureHalfFloat {
+  static Type get instanceRuntimeType => OesTextureHalfFloatImpl;
+
+}
+class OesTextureHalfFloatImpl extends OesTextureHalfFloat implements js_library.JSObjectInterfacesDom {
+  OesTextureHalfFloatImpl.internal_() : super.internal_();
+  get runtimeType => OesTextureHalfFloat;
+  toString() => super.toString();
+}
+patch class ExtTextureFilterAnisotropic {
+  static Type get instanceRuntimeType => ExtTextureFilterAnisotropicImpl;
+
+}
+class ExtTextureFilterAnisotropicImpl extends ExtTextureFilterAnisotropic implements js_library.JSObjectInterfacesDom {
+  ExtTextureFilterAnisotropicImpl.internal_() : super.internal_();
+  get runtimeType => ExtTextureFilterAnisotropic;
+  toString() => super.toString();
+}
+patch class OesTextureFloat {
+  static Type get instanceRuntimeType => OesTextureFloatImpl;
+
+}
+class OesTextureFloatImpl extends OesTextureFloat implements js_library.JSObjectInterfacesDom {
+  OesTextureFloatImpl.internal_() : super.internal_();
+  get runtimeType => OesTextureFloat;
+  toString() => super.toString();
+}
+patch class VertexArrayObject {
+  static Type get instanceRuntimeType => VertexArrayObjectImpl;
+
+}
+class VertexArrayObjectImpl extends VertexArrayObject implements js_library.JSObjectInterfacesDom {
+  VertexArrayObjectImpl.internal_() : super.internal_();
+  get runtimeType => VertexArrayObject;
+  toString() => super.toString();
+}
+patch class CompressedTexturePvrtc {
+  static Type get instanceRuntimeType => CompressedTexturePvrtcImpl;
+
+}
+class CompressedTexturePvrtcImpl extends CompressedTexturePvrtc implements js_library.JSObjectInterfacesDom {
+  CompressedTexturePvrtcImpl.internal_() : super.internal_();
+  get runtimeType => CompressedTexturePvrtc;
+  toString() => super.toString();
+}
+patch class ChromiumSubscribeUniform {
+  static Type get instanceRuntimeType => ChromiumSubscribeUniformImpl;
+
+}
+class ChromiumSubscribeUniformImpl extends ChromiumSubscribeUniform implements js_library.JSObjectInterfacesDom {
+  ChromiumSubscribeUniformImpl.internal_() : super.internal_();
+  get runtimeType => ChromiumSubscribeUniform;
+  toString() => super.toString();
+}
+patch class _WebGLRenderingContextBase {
+  static Type get instanceRuntimeType => _WebGLRenderingContextBaseImpl;
+
+}
+class _WebGLRenderingContextBaseImpl extends _WebGLRenderingContextBase implements js_library.JSObjectInterfacesDom {
+  _WebGLRenderingContextBaseImpl.internal_() : super.internal_();
+  get runtimeType => _WebGLRenderingContextBase;
+  toString() => super.toString();
+}
+patch class ActiveInfo {
+  static Type get instanceRuntimeType => ActiveInfoImpl;
+
+}
+class ActiveInfoImpl extends ActiveInfo implements js_library.JSObjectInterfacesDom {
+  ActiveInfoImpl.internal_() : super.internal_();
+  get runtimeType => ActiveInfo;
+  toString() => super.toString();
+}
+patch class TransformFeedback {
+  static Type get instanceRuntimeType => TransformFeedbackImpl;
+
+}
+class TransformFeedbackImpl extends TransformFeedback implements js_library.JSObjectInterfacesDom {
+  TransformFeedbackImpl.internal_() : super.internal_();
+  get runtimeType => TransformFeedback;
+  toString() => super.toString();
+}
+patch class ExtShaderTextureLod {
+  static Type get instanceRuntimeType => ExtShaderTextureLodImpl;
+
+}
+class ExtShaderTextureLodImpl extends ExtShaderTextureLod implements js_library.JSObjectInterfacesDom {
+  ExtShaderTextureLodImpl.internal_() : super.internal_();
+  get runtimeType => ExtShaderTextureLod;
+  toString() => super.toString();
+}
+patch class UniformLocation {
+  static Type get instanceRuntimeType => UniformLocationImpl;
+
+}
+class UniformLocationImpl extends UniformLocation implements js_library.JSObjectInterfacesDom {
+  UniformLocationImpl.internal_() : super.internal_();
+  get runtimeType => UniformLocation;
+  toString() => super.toString();
+}
+patch class ExtBlendMinMax {
+  static Type get instanceRuntimeType => ExtBlendMinMaxImpl;
+
+}
+class ExtBlendMinMaxImpl extends ExtBlendMinMax implements js_library.JSObjectInterfacesDom {
+  ExtBlendMinMaxImpl.internal_() : super.internal_();
+  get runtimeType => ExtBlendMinMax;
+  toString() => super.toString();
+}
+patch class Framebuffer {
+  static Type get instanceRuntimeType => FramebufferImpl;
+
+}
+class FramebufferImpl extends Framebuffer implements js_library.JSObjectInterfacesDom {
+  FramebufferImpl.internal_() : super.internal_();
+  get runtimeType => Framebuffer;
+  toString() => super.toString();
+}
+patch class OesStandardDerivatives {
+  static Type get instanceRuntimeType => OesStandardDerivativesImpl;
+
+}
+class OesStandardDerivativesImpl extends OesStandardDerivatives implements js_library.JSObjectInterfacesDom {
+  OesStandardDerivativesImpl.internal_() : super.internal_();
+  get runtimeType => OesStandardDerivatives;
+  toString() => super.toString();
+}
+patch class DrawBuffers {
+  static Type get instanceRuntimeType => DrawBuffersImpl;
+
+}
+class DrawBuffersImpl extends DrawBuffers implements js_library.JSObjectInterfacesDom {
+  DrawBuffersImpl.internal_() : super.internal_();
+  get runtimeType => DrawBuffers;
+  toString() => super.toString();
+}
+patch class OesTextureFloatLinear {
+  static Type get instanceRuntimeType => OesTextureFloatLinearImpl;
+
+}
+class OesTextureFloatLinearImpl extends OesTextureFloatLinear implements js_library.JSObjectInterfacesDom {
+  OesTextureFloatLinearImpl.internal_() : super.internal_();
+  get runtimeType => OesTextureFloatLinear;
+  toString() => super.toString();
+}
+patch class DebugShaders {
+  static Type get instanceRuntimeType => DebugShadersImpl;
+
+}
+class DebugShadersImpl extends DebugShaders implements js_library.JSObjectInterfacesDom {
+  DebugShadersImpl.internal_() : super.internal_();
+  get runtimeType => DebugShaders;
+  toString() => super.toString();
+}
+patch class Program {
+  static Type get instanceRuntimeType => ProgramImpl;
+
+}
+class ProgramImpl extends Program implements js_library.JSObjectInterfacesDom {
+  ProgramImpl.internal_() : super.internal_();
+  get runtimeType => Program;
+  toString() => super.toString();
+}
+patch class ContextEvent {
+  static Type get instanceRuntimeType => ContextEventImpl;
+
+}
+class ContextEventImpl extends ContextEvent implements js_library.JSObjectInterfacesDom {
+  ContextEventImpl.internal_() : super.internal_();
+  get runtimeType => ContextEvent;
+  toString() => super.toString();
+}
+patch class AngleInstancedArrays {
+  static Type get instanceRuntimeType => AngleInstancedArraysImpl;
+
+}
+class AngleInstancedArraysImpl extends AngleInstancedArrays implements js_library.JSObjectInterfacesDom {
+  AngleInstancedArraysImpl.internal_() : super.internal_();
+  get runtimeType => AngleInstancedArrays;
+  toString() => super.toString();
+}
+patch class DebugRendererInfo {
+  static Type get instanceRuntimeType => DebugRendererInfoImpl;
+
+}
+class DebugRendererInfoImpl extends DebugRendererInfo implements js_library.JSObjectInterfacesDom {
+  DebugRendererInfoImpl.internal_() : super.internal_();
+  get runtimeType => DebugRendererInfo;
+  toString() => super.toString();
+}
+patch class CompressedTextureAtc {
+  static Type get instanceRuntimeType => CompressedTextureAtcImpl;
+
+}
+class CompressedTextureAtcImpl extends CompressedTextureAtc implements js_library.JSObjectInterfacesDom {
+  CompressedTextureAtcImpl.internal_() : super.internal_();
+  get runtimeType => CompressedTextureAtc;
+  toString() => super.toString();
+}
+patch class OesElementIndexUint {
+  static Type get instanceRuntimeType => OesElementIndexUintImpl;
+
+}
+class OesElementIndexUintImpl extends OesElementIndexUint implements js_library.JSObjectInterfacesDom {
+  OesElementIndexUintImpl.internal_() : super.internal_();
+  get runtimeType => OesElementIndexUint;
+  toString() => super.toString();
+}
+patch class CompressedTextureETC1 {
+  static Type get instanceRuntimeType => CompressedTextureETC1Impl;
+
+}
+class CompressedTextureETC1Impl extends CompressedTextureETC1 implements js_library.JSObjectInterfacesDom {
+  CompressedTextureETC1Impl.internal_() : super.internal_();
+  get runtimeType => CompressedTextureETC1;
+  toString() => super.toString();
+}
+patch class LoseContext {
+  static Type get instanceRuntimeType => LoseContextImpl;
+
+}
+class LoseContextImpl extends LoseContext implements js_library.JSObjectInterfacesDom {
+  LoseContextImpl.internal_() : super.internal_();
+  get runtimeType => LoseContext;
+  toString() => super.toString();
+}
+patch class Renderbuffer {
+  static Type get instanceRuntimeType => RenderbufferImpl;
+
+}
+class RenderbufferImpl extends Renderbuffer implements js_library.JSObjectInterfacesDom {
+  RenderbufferImpl.internal_() : super.internal_();
+  get runtimeType => Renderbuffer;
+  toString() => super.toString();
+}
+patch class RenderingContext2 {
+  static Type get instanceRuntimeType => RenderingContext2Impl;
+
+}
+class RenderingContext2Impl extends RenderingContext2 implements js_library.JSObjectInterfacesDom {
+  RenderingContext2Impl.internal_() : super.internal_();
+  get runtimeType => RenderingContext2;
+  toString() => super.toString();
+}
+patch class EXTsRgb {
+  static Type get instanceRuntimeType => EXTsRgbImpl;
+
+}
+class EXTsRgbImpl extends EXTsRgb implements js_library.JSObjectInterfacesDom {
+  EXTsRgbImpl.internal_() : super.internal_();
+  get runtimeType => EXTsRgb;
+  toString() => super.toString();
+}
+
+"""],"dart:web_sql": ["dart:web_sql", "dart:web_sql_js_interop_patch.dart", """import 'dart:js' as js_library;
+
+/**
+ * Placeholder object for cases where we need to determine exactly how many
+ * args were passed to a function.
+ */
+const _UNDEFINED_JS_CONST = const Object();
+
+patch class SqlError {
+  static Type get instanceRuntimeType => SqlErrorImpl;
+
+}
+class SqlErrorImpl extends SqlError implements js_library.JSObjectInterfacesDom {
+  SqlErrorImpl.internal_() : super.internal_();
+  get runtimeType => SqlError;
+  toString() => super.toString();
+}
+patch class SqlResultSet {
+  static Type get instanceRuntimeType => SqlResultSetImpl;
+
+}
+class SqlResultSetImpl extends SqlResultSet implements js_library.JSObjectInterfacesDom {
+  SqlResultSetImpl.internal_() : super.internal_();
+  get runtimeType => SqlResultSet;
+  toString() => super.toString();
+}
+patch class SqlResultSetRowList {
+  static Type get instanceRuntimeType => SqlResultSetRowListImpl;
+
+}
+class SqlResultSetRowListImpl extends SqlResultSetRowList implements js_library.JSObjectInterfacesDom {
+  SqlResultSetRowListImpl.internal_() : super.internal_();
+  get runtimeType => SqlResultSetRowList;
+  toString() => super.toString();
+}
+patch class SqlDatabase {
+  static Type get instanceRuntimeType => SqlDatabaseImpl;
+
+}
+class SqlDatabaseImpl extends SqlDatabase implements js_library.JSObjectInterfacesDom {
+  SqlDatabaseImpl.internal_() : super.internal_();
+  get runtimeType => SqlDatabase;
+  toString() => super.toString();
+}
+patch class SqlTransaction {
+  static Type get instanceRuntimeType => SqlTransactionImpl;
+
+}
+class SqlTransactionImpl extends SqlTransaction implements js_library.JSObjectInterfacesDom {
+  SqlTransactionImpl.internal_() : super.internal_();
+  get runtimeType => SqlTransaction;
+  toString() => super.toString();
+}
+
+"""],"dart:svg": ["dart:svg", "dart:svg_js_interop_patch.dart", """import 'dart:js' as js_library;
+
+/**
+ * Placeholder object for cases where we need to determine exactly how many
+ * args were passed to a function.
+ */
+const _UNDEFINED_JS_CONST = const Object();
+
+patch class AnimatedString {
+  static Type get instanceRuntimeType => AnimatedStringImpl;
+
+}
+class AnimatedStringImpl extends AnimatedString implements js_library.JSObjectInterfacesDom {
+  AnimatedStringImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedString;
+  toString() => super.toString();
+}
+patch class FilterElement {
+  static Type get instanceRuntimeType => FilterElementImpl;
+
+}
+class FilterElementImpl extends FilterElement implements js_library.JSObjectInterfacesDom {
+  FilterElementImpl.internal_() : super.internal_();
+  get runtimeType => FilterElement;
+  toString() => super.toString();
+}
+patch class FilterPrimitiveStandardAttributes {
+  static Type get instanceRuntimeType => FilterPrimitiveStandardAttributesImpl;
+
+}
+class FilterPrimitiveStandardAttributesImpl extends FilterPrimitiveStandardAttributes implements js_library.JSObjectInterfacesDom {
+  FilterPrimitiveStandardAttributesImpl.internal_() : super.internal_();
+  get runtimeType => FilterPrimitiveStandardAttributes;
+  toString() => super.toString();
+}
+patch class PathSegLinetoRel {
+  static Type get instanceRuntimeType => PathSegLinetoRelImpl;
+
+}
+class PathSegLinetoRelImpl extends PathSegLinetoRel implements js_library.JSObjectInterfacesDom {
+  PathSegLinetoRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegLinetoRel;
+  toString() => super.toString();
+}
+patch class UriReference {
+  static Type get instanceRuntimeType => UriReferenceImpl;
+
+}
+class UriReferenceImpl extends UriReference implements js_library.JSObjectInterfacesDom {
+  UriReferenceImpl.internal_() : super.internal_();
+  get runtimeType => UriReference;
+  toString() => super.toString();
+}
+patch class ImageElement {
+  static Type get instanceRuntimeType => ImageElementImpl;
+
+}
+class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
+  ImageElementImpl.internal_() : super.internal_();
+  get runtimeType => ImageElement;
+  toString() => super.toString();
+}
+patch class StyleElement {
+  static Type get instanceRuntimeType => StyleElementImpl;
+
+}
+class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
+  StyleElementImpl.internal_() : super.internal_();
+  get runtimeType => StyleElement;
+  toString() => super.toString();
+}
+patch class AnimatedPreserveAspectRatio {
+  static Type get instanceRuntimeType => AnimatedPreserveAspectRatioImpl;
+
+}
+class AnimatedPreserveAspectRatioImpl extends AnimatedPreserveAspectRatio implements js_library.JSObjectInterfacesDom {
+  AnimatedPreserveAspectRatioImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedPreserveAspectRatio;
+  toString() => super.toString();
+}
+patch class TextElement {
+  static Type get instanceRuntimeType => TextElementImpl;
+
+}
+class TextElementImpl extends TextElement implements js_library.JSObjectInterfacesDom {
+  TextElementImpl.internal_() : super.internal_();
+  get runtimeType => TextElement;
+  toString() => super.toString();
+}
+patch class DefsElement {
+  static Type get instanceRuntimeType => DefsElementImpl;
+
+}
+class DefsElementImpl extends DefsElement implements js_library.JSObjectInterfacesDom {
+  DefsElementImpl.internal_() : super.internal_();
+  get runtimeType => DefsElement;
+  toString() => super.toString();
+}
+patch class FEDiffuseLightingElement {
+  static Type get instanceRuntimeType => FEDiffuseLightingElementImpl;
+
+}
+class FEDiffuseLightingElementImpl extends FEDiffuseLightingElement implements js_library.JSObjectInterfacesDom {
+  FEDiffuseLightingElementImpl.internal_() : super.internal_();
+  get runtimeType => FEDiffuseLightingElement;
+  toString() => super.toString();
+}
+patch class FETileElement {
+  static Type get instanceRuntimeType => FETileElementImpl;
+
+}
+class FETileElementImpl extends FETileElement implements js_library.JSObjectInterfacesDom {
+  FETileElementImpl.internal_() : super.internal_();
+  get runtimeType => FETileElement;
+  toString() => super.toString();
+}
+patch class PathSegLinetoHorizontalAbs {
+  static Type get instanceRuntimeType => PathSegLinetoHorizontalAbsImpl;
+
+}
+class PathSegLinetoHorizontalAbsImpl extends PathSegLinetoHorizontalAbs implements js_library.JSObjectInterfacesDom {
+  PathSegLinetoHorizontalAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegLinetoHorizontalAbs;
+  toString() => super.toString();
+}
+patch class PathSegMovetoRel {
+  static Type get instanceRuntimeType => PathSegMovetoRelImpl;
+
+}
+class PathSegMovetoRelImpl extends PathSegMovetoRel implements js_library.JSObjectInterfacesDom {
+  PathSegMovetoRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegMovetoRel;
+  toString() => super.toString();
+}
+patch class _SVGFEDropShadowElement {
+  static Type get instanceRuntimeType => _SVGFEDropShadowElementImpl;
+
+}
+class _SVGFEDropShadowElementImpl extends _SVGFEDropShadowElement implements js_library.JSObjectInterfacesDom {
+  _SVGFEDropShadowElementImpl.internal_() : super.internal_();
+  get runtimeType => _SVGFEDropShadowElement;
+  toString() => super.toString();
+}
+patch class Transform {
+  static Type get instanceRuntimeType => TransformImpl;
+
+}
+class TransformImpl extends Transform implements js_library.JSObjectInterfacesDom {
+  TransformImpl.internal_() : super.internal_();
+  get runtimeType => Transform;
+  toString() => super.toString();
+}
+patch class PathSegArcRel {
+  static Type get instanceRuntimeType => PathSegArcRelImpl;
+
+}
+class PathSegArcRelImpl extends PathSegArcRel implements js_library.JSObjectInterfacesDom {
+  PathSegArcRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegArcRel;
+  toString() => super.toString();
+}
+patch class AnimateElement {
+  static Type get instanceRuntimeType => AnimateElementImpl;
+
+}
+class AnimateElementImpl extends AnimateElement implements js_library.JSObjectInterfacesDom {
+  AnimateElementImpl.internal_() : super.internal_();
+  get runtimeType => AnimateElement;
+  toString() => super.toString();
+}
+patch class PolylineElement {
+  static Type get instanceRuntimeType => PolylineElementImpl;
+
+}
+class PolylineElementImpl extends PolylineElement implements js_library.JSObjectInterfacesDom {
+  PolylineElementImpl.internal_() : super.internal_();
+  get runtimeType => PolylineElement;
+  toString() => super.toString();
+}
+patch class AnimatedRect {
+  static Type get instanceRuntimeType => AnimatedRectImpl;
+
+}
+class AnimatedRectImpl extends AnimatedRect implements js_library.JSObjectInterfacesDom {
+  AnimatedRectImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedRect;
+  toString() => super.toString();
+}
+patch class GraphicsElement {
+  static Type get instanceRuntimeType => GraphicsElementImpl;
+
+}
+class GraphicsElementImpl extends GraphicsElement implements js_library.JSObjectInterfacesDom {
+  GraphicsElementImpl.internal_() : super.internal_();
+  get runtimeType => GraphicsElement;
+  toString() => super.toString();
+}
+patch class TransformList {
+  static Type get instanceRuntimeType => TransformListImpl;
+
+}
+class TransformListImpl extends TransformList implements js_library.JSObjectInterfacesDom {
+  TransformListImpl.internal_() : super.internal_();
+  get runtimeType => TransformList;
+  toString() => super.toString();
+}
+patch class EllipseElement {
+  static Type get instanceRuntimeType => EllipseElementImpl;
+
+}
+class EllipseElementImpl extends EllipseElement implements js_library.JSObjectInterfacesDom {
+  EllipseElementImpl.internal_() : super.internal_();
+  get runtimeType => EllipseElement;
+  toString() => super.toString();
+}
+patch class FEFuncGElement {
+  static Type get instanceRuntimeType => FEFuncGElementImpl;
+
+}
+class FEFuncGElementImpl extends FEFuncGElement implements js_library.JSObjectInterfacesDom {
+  FEFuncGElementImpl.internal_() : super.internal_();
+  get runtimeType => FEFuncGElement;
+  toString() => super.toString();
+}
+patch class PointList {
+  static Type get instanceRuntimeType => PointListImpl;
+
+}
+class PointListImpl extends PointList implements js_library.JSObjectInterfacesDom {
+  PointListImpl.internal_() : super.internal_();
+  get runtimeType => PointList;
+  toString() => super.toString();
+}
+patch class FEMergeElement {
+  static Type get instanceRuntimeType => FEMergeElementImpl;
+
+}
+class FEMergeElementImpl extends FEMergeElement implements js_library.JSObjectInterfacesDom {
+  FEMergeElementImpl.internal_() : super.internal_();
+  get runtimeType => FEMergeElement;
+  toString() => super.toString();
+}
+patch class CircleElement {
+  static Type get instanceRuntimeType => CircleElementImpl;
+
+}
+class CircleElementImpl extends CircleElement implements js_library.JSObjectInterfacesDom {
+  CircleElementImpl.internal_() : super.internal_();
+  get runtimeType => CircleElement;
+  toString() => super.toString();
+}
+patch class AnimatedNumberList {
+  static Type get instanceRuntimeType => AnimatedNumberListImpl;
+
+}
+class AnimatedNumberListImpl extends AnimatedNumberList implements js_library.JSObjectInterfacesDom {
+  AnimatedNumberListImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedNumberList;
+  toString() => super.toString();
+}
+patch class SwitchElement {
+  static Type get instanceRuntimeType => SwitchElementImpl;
+
+}
+class SwitchElementImpl extends SwitchElement implements js_library.JSObjectInterfacesDom {
+  SwitchElementImpl.internal_() : super.internal_();
+  get runtimeType => SwitchElement;
+  toString() => super.toString();
+}
+patch class RadialGradientElement {
+  static Type get instanceRuntimeType => RadialGradientElementImpl;
+
+}
+class RadialGradientElementImpl extends RadialGradientElement implements js_library.JSObjectInterfacesDom {
+  RadialGradientElementImpl.internal_() : super.internal_();
+  get runtimeType => RadialGradientElement;
+  toString() => super.toString();
+}
+patch class FEDistantLightElement {
+  static Type get instanceRuntimeType => FEDistantLightElementImpl;
+
+}
+class FEDistantLightElementImpl extends FEDistantLightElement implements js_library.JSObjectInterfacesDom {
+  FEDistantLightElementImpl.internal_() : super.internal_();
+  get runtimeType => FEDistantLightElement;
+  toString() => super.toString();
+}
+patch class LinearGradientElement {
+  static Type get instanceRuntimeType => LinearGradientElementImpl;
+
+}
+class LinearGradientElementImpl extends LinearGradientElement implements js_library.JSObjectInterfacesDom {
+  LinearGradientElementImpl.internal_() : super.internal_();
+  get runtimeType => LinearGradientElement;
+  toString() => super.toString();
+}
+patch class TextPositioningElement {
+  static Type get instanceRuntimeType => TextPositioningElementImpl;
+
+}
+class TextPositioningElementImpl extends TextPositioningElement implements js_library.JSObjectInterfacesDom {
+  TextPositioningElementImpl.internal_() : super.internal_();
+  get runtimeType => TextPositioningElement;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticRel {
+  static Type get instanceRuntimeType => PathSegCurvetoQuadraticRelImpl;
+
+}
+class PathSegCurvetoQuadraticRelImpl extends PathSegCurvetoQuadraticRel implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoQuadraticRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoQuadraticRel;
+  toString() => super.toString();
+}
+patch class PathSegLinetoHorizontalRel {
+  static Type get instanceRuntimeType => PathSegLinetoHorizontalRelImpl;
+
+}
+class PathSegLinetoHorizontalRelImpl extends PathSegLinetoHorizontalRel implements js_library.JSObjectInterfacesDom {
+  PathSegLinetoHorizontalRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegLinetoHorizontalRel;
+  toString() => super.toString();
+}
+patch class StringList {
+  static Type get instanceRuntimeType => StringListImpl;
+
+}
+class StringListImpl extends StringList implements js_library.JSObjectInterfacesDom {
+  StringListImpl.internal_() : super.internal_();
+  get runtimeType => StringList;
+  toString() => super.toString();
+}
+patch class TextContentElement {
+  static Type get instanceRuntimeType => TextContentElementImpl;
+
+}
+class TextContentElementImpl extends TextContentElement implements js_library.JSObjectInterfacesDom {
+  TextContentElementImpl.internal_() : super.internal_();
+  get runtimeType => TextContentElement;
+  toString() => super.toString();
+}
+patch class FEConvolveMatrixElement {
+  static Type get instanceRuntimeType => FEConvolveMatrixElementImpl;
+
+}
+class FEConvolveMatrixElementImpl extends FEConvolveMatrixElement implements js_library.JSObjectInterfacesDom {
+  FEConvolveMatrixElementImpl.internal_() : super.internal_();
+  get runtimeType => FEConvolveMatrixElement;
+  toString() => super.toString();
+}
+patch class PathSegLinetoAbs {
+  static Type get instanceRuntimeType => PathSegLinetoAbsImpl;
+
+}
+class PathSegLinetoAbsImpl extends PathSegLinetoAbs implements js_library.JSObjectInterfacesDom {
+  PathSegLinetoAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegLinetoAbs;
+  toString() => super.toString();
+}
+patch class FESpecularLightingElement {
+  static Type get instanceRuntimeType => FESpecularLightingElementImpl;
+
+}
+class FESpecularLightingElementImpl extends FESpecularLightingElement implements js_library.JSObjectInterfacesDom {
+  FESpecularLightingElementImpl.internal_() : super.internal_();
+  get runtimeType => FESpecularLightingElement;
+  toString() => super.toString();
+}
+patch class AnimatedTransformList {
+  static Type get instanceRuntimeType => AnimatedTransformListImpl;
+
+}
+class AnimatedTransformListImpl extends AnimatedTransformList implements js_library.JSObjectInterfacesDom {
+  AnimatedTransformListImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedTransformList;
+  toString() => super.toString();
+}
+patch class FEGaussianBlurElement {
+  static Type get instanceRuntimeType => FEGaussianBlurElementImpl;
+
+}
+class FEGaussianBlurElementImpl extends FEGaussianBlurElement implements js_library.JSObjectInterfacesDom {
+  FEGaussianBlurElementImpl.internal_() : super.internal_();
+  get runtimeType => FEGaussianBlurElement;
+  toString() => super.toString();
+}
+patch class Number {
+  static Type get instanceRuntimeType => NumberImpl;
+
+}
+class NumberImpl extends Number implements js_library.JSObjectInterfacesDom {
+  NumberImpl.internal_() : super.internal_();
+  get runtimeType => Number;
+  toString() => super.toString();
+}
+patch class ZoomEvent {
+  static Type get instanceRuntimeType => ZoomEventImpl;
+
+}
+class ZoomEventImpl extends ZoomEvent implements js_library.JSObjectInterfacesDom {
+  ZoomEventImpl.internal_() : super.internal_();
+  get runtimeType => ZoomEvent;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoCubicSmoothAbs {
+  static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothAbsImpl;
+
+}
+class PathSegCurvetoCubicSmoothAbsImpl extends PathSegCurvetoCubicSmoothAbs implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoCubicSmoothAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoCubicSmoothAbs;
+  toString() => super.toString();
+}
+patch class AnimatedNumber {
+  static Type get instanceRuntimeType => AnimatedNumberImpl;
+
+}
+class AnimatedNumberImpl extends AnimatedNumber implements js_library.JSObjectInterfacesDom {
+  AnimatedNumberImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedNumber;
+  toString() => super.toString();
+}
+patch class MaskElement {
+  static Type get instanceRuntimeType => MaskElementImpl;
+
+}
+class MaskElementImpl extends MaskElement implements js_library.JSObjectInterfacesDom {
+  MaskElementImpl.internal_() : super.internal_();
+  get runtimeType => MaskElement;
+  toString() => super.toString();
+}
+patch class Angle {
+  static Type get instanceRuntimeType => AngleImpl;
+
+}
+class AngleImpl extends Angle implements js_library.JSObjectInterfacesDom {
+  AngleImpl.internal_() : super.internal_();
+  get runtimeType => Angle;
+  toString() => super.toString();
+}
+patch class SymbolElement {
+  static Type get instanceRuntimeType => SymbolElementImpl;
+
+}
+class SymbolElementImpl extends SymbolElement implements js_library.JSObjectInterfacesDom {
+  SymbolElementImpl.internal_() : super.internal_();
+  get runtimeType => SymbolElement;
+  toString() => super.toString();
+}
+patch class PathSegArcAbs {
+  static Type get instanceRuntimeType => PathSegArcAbsImpl;
+
+}
+class PathSegArcAbsImpl extends PathSegArcAbs implements js_library.JSObjectInterfacesDom {
+  PathSegArcAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegArcAbs;
+  toString() => super.toString();
+}
+patch class RectElement {
+  static Type get instanceRuntimeType => RectElementImpl;
+
+}
+class RectElementImpl extends RectElement implements js_library.JSObjectInterfacesDom {
+  RectElementImpl.internal_() : super.internal_();
+  get runtimeType => RectElement;
+  toString() => super.toString();
+}
+patch class FEFloodElement {
+  static Type get instanceRuntimeType => FEFloodElementImpl;
+
+}
+class FEFloodElementImpl extends FEFloodElement implements js_library.JSObjectInterfacesDom {
+  FEFloodElementImpl.internal_() : super.internal_();
+  get runtimeType => FEFloodElement;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticAbs {
+  static Type get instanceRuntimeType => PathSegCurvetoQuadraticAbsImpl;
+
+}
+class PathSegCurvetoQuadraticAbsImpl extends PathSegCurvetoQuadraticAbs implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoQuadraticAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoQuadraticAbs;
+  toString() => super.toString();
+}
+patch class ScriptElement {
+  static Type get instanceRuntimeType => ScriptElementImpl;
+
+}
+class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
+  ScriptElementImpl.internal_() : super.internal_();
+  get runtimeType => ScriptElement;
+  toString() => super.toString();
+}
+patch class AnimatedInteger {
+  static Type get instanceRuntimeType => AnimatedIntegerImpl;
+
+}
+class AnimatedIntegerImpl extends AnimatedInteger implements js_library.JSObjectInterfacesDom {
+  AnimatedIntegerImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedInteger;
+  toString() => super.toString();
+}
+patch class Tests {
+  static Type get instanceRuntimeType => TestsImpl;
+
+}
+class TestsImpl extends Tests implements js_library.JSObjectInterfacesDom {
+  TestsImpl.internal_() : super.internal_();
+  get runtimeType => Tests;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoCubicSmoothRel {
+  static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothRelImpl;
+
+}
+class PathSegCurvetoCubicSmoothRelImpl extends PathSegCurvetoCubicSmoothRel implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoCubicSmoothRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoCubicSmoothRel;
+  toString() => super.toString();
+}
+patch class PathSeg {
+  static Type get instanceRuntimeType => PathSegImpl;
+
+}
+class PathSegImpl extends PathSeg implements js_library.JSObjectInterfacesDom {
+  PathSegImpl.internal_() : super.internal_();
+  get runtimeType => PathSeg;
+  toString() => super.toString();
+}
+patch class GElement {
+  static Type get instanceRuntimeType => GElementImpl;
+
+}
+class GElementImpl extends GElement implements js_library.JSObjectInterfacesDom {
+  GElementImpl.internal_() : super.internal_();
+  get runtimeType => GElement;
+  toString() => super.toString();
+}
+patch class PathSegMovetoAbs {
+  static Type get instanceRuntimeType => PathSegMovetoAbsImpl;
+
+}
+class PathSegMovetoAbsImpl extends PathSegMovetoAbs implements js_library.JSObjectInterfacesDom {
+  PathSegMovetoAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegMovetoAbs;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoCubicAbs {
+  static Type get instanceRuntimeType => PathSegCurvetoCubicAbsImpl;
+
+}
+class PathSegCurvetoCubicAbsImpl extends PathSegCurvetoCubicAbs implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoCubicAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoCubicAbs;
+  toString() => super.toString();
+}
+patch class AnimatedEnumeration {
+  static Type get instanceRuntimeType => AnimatedEnumerationImpl;
+
+}
+class AnimatedEnumerationImpl extends AnimatedEnumeration implements js_library.JSObjectInterfacesDom {
+  AnimatedEnumerationImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedEnumeration;
+  toString() => super.toString();
+}
+patch class TitleElement {
+  static Type get instanceRuntimeType => TitleElementImpl;
+
+}
+class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
+  TitleElementImpl.internal_() : super.internal_();
+  get runtimeType => TitleElement;
+  toString() => super.toString();
+}
+patch class MetadataElement {
+  static Type get instanceRuntimeType => MetadataElementImpl;
+
+}
+class MetadataElementImpl extends MetadataElement implements js_library.JSObjectInterfacesDom {
+  MetadataElementImpl.internal_() : super.internal_();
+  get runtimeType => MetadataElement;
+  toString() => super.toString();
+}
+patch class AElement {
+  static Type get instanceRuntimeType => AElementImpl;
+
+}
+class AElementImpl extends AElement implements js_library.JSObjectInterfacesDom {
+  AElementImpl.internal_() : super.internal_();
+  get runtimeType => AElement;
+  toString() => super.toString();
+}
+patch class _GradientElement {
+  static Type get instanceRuntimeType => _GradientElementImpl;
+
+}
+class _GradientElementImpl extends _GradientElement implements js_library.JSObjectInterfacesDom {
+  _GradientElementImpl.internal_() : super.internal_();
+  get runtimeType => _GradientElement;
+  toString() => super.toString();
+}
+patch class FEImageElement {
+  static Type get instanceRuntimeType => FEImageElementImpl;
+
+}
+class FEImageElementImpl extends FEImageElement implements js_library.JSObjectInterfacesDom {
+  FEImageElementImpl.internal_() : super.internal_();
+  get runtimeType => FEImageElement;
+  toString() => super.toString();
+}
+patch class _SVGComponentTransferFunctionElement {
+  static Type get instanceRuntimeType => _SVGComponentTransferFunctionElementImpl;
+
+}
+class _SVGComponentTransferFunctionElementImpl extends _SVGComponentTransferFunctionElement implements js_library.JSObjectInterfacesDom {
+  _SVGComponentTransferFunctionElementImpl.internal_() : super.internal_();
+  get runtimeType => _SVGComponentTransferFunctionElement;
+  toString() => super.toString();
+}
+patch class PathSegLinetoVerticalRel {
+  static Type get instanceRuntimeType => PathSegLinetoVerticalRelImpl;
+
+}
+class PathSegLinetoVerticalRelImpl extends PathSegLinetoVerticalRel implements js_library.JSObjectInterfacesDom {
+  PathSegLinetoVerticalRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegLinetoVerticalRel;
+  toString() => super.toString();
+}
+patch class AnimatedLengthList {
+  static Type get instanceRuntimeType => AnimatedLengthListImpl;
+
+}
+class AnimatedLengthListImpl extends AnimatedLengthList implements js_library.JSObjectInterfacesDom {
+  AnimatedLengthListImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedLengthList;
+  toString() => super.toString();
+}
+patch class FEMorphologyElement {
+  static Type get instanceRuntimeType => FEMorphologyElementImpl;
+
+}
+class FEMorphologyElementImpl extends FEMorphologyElement implements js_library.JSObjectInterfacesDom {
+  FEMorphologyElementImpl.internal_() : super.internal_();
+  get runtimeType => FEMorphologyElement;
+  toString() => super.toString();
+}
+patch class PolygonElement {
+  static Type get instanceRuntimeType => PolygonElementImpl;
+
+}
+class PolygonElementImpl extends PolygonElement implements js_library.JSObjectInterfacesDom {
+  PolygonElementImpl.internal_() : super.internal_();
+  get runtimeType => PolygonElement;
+  toString() => super.toString();
+}
+patch class UseElement {
+  static Type get instanceRuntimeType => UseElementImpl;
+
+}
+class UseElementImpl extends UseElement implements js_library.JSObjectInterfacesDom {
+  UseElementImpl.internal_() : super.internal_();
+  get runtimeType => UseElement;
+  toString() => super.toString();
+}
+patch class Point {
+  static Type get instanceRuntimeType => PointImpl;
+
+}
+class PointImpl extends Point implements js_library.JSObjectInterfacesDom {
+  PointImpl.internal_() : super.internal_();
+  get runtimeType => Point;
+  toString() => super.toString();
+}
+patch class Rect {
+  static Type get instanceRuntimeType => RectImpl;
+
+}
+class RectImpl extends Rect implements js_library.JSObjectInterfacesDom {
+  RectImpl.internal_() : super.internal_();
+  get runtimeType => Rect;
+  toString() => super.toString();
+}
+patch class AnimatedBoolean {
+  static Type get instanceRuntimeType => AnimatedBooleanImpl;
+
+}
+class AnimatedBooleanImpl extends AnimatedBoolean implements js_library.JSObjectInterfacesDom {
+  AnimatedBooleanImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedBoolean;
+  toString() => super.toString();
+}
+patch class FETurbulenceElement {
+  static Type get instanceRuntimeType => FETurbulenceElementImpl;
+
+}
+class FETurbulenceElementImpl extends FETurbulenceElement implements js_library.JSObjectInterfacesDom {
+  FETurbulenceElementImpl.internal_() : super.internal_();
+  get runtimeType => FETurbulenceElement;
+  toString() => super.toString();
+}
+patch class NumberList {
+  static Type get instanceRuntimeType => NumberListImpl;
+
+}
+class NumberListImpl extends NumberList implements js_library.JSObjectInterfacesDom {
+  NumberListImpl.internal_() : super.internal_();
+  get runtimeType => NumberList;
+  toString() => super.toString();
+}
+patch class AnimationElement {
+  static Type get instanceRuntimeType => AnimationElementImpl;
+
+}
+class AnimationElementImpl extends AnimationElement implements js_library.JSObjectInterfacesDom {
+  AnimationElementImpl.internal_() : super.internal_();
+  get runtimeType => AnimationElement;
+  toString() => super.toString();
+}
+patch class MarkerElement {
+  static Type get instanceRuntimeType => MarkerElementImpl;
+
+}
+class MarkerElementImpl extends MarkerElement implements js_library.JSObjectInterfacesDom {
+  MarkerElementImpl.internal_() : super.internal_();
+  get runtimeType => MarkerElement;
+  toString() => super.toString();
+}
+patch class FECompositeElement {
+  static Type get instanceRuntimeType => FECompositeElementImpl;
+
+}
+class FECompositeElementImpl extends FECompositeElement implements js_library.JSObjectInterfacesDom {
+  FECompositeElementImpl.internal_() : super.internal_();
+  get runtimeType => FECompositeElement;
+  toString() => super.toString();
+}
+patch class PathSegList {
+  static Type get instanceRuntimeType => PathSegListImpl;
+
+}
+class PathSegListImpl extends PathSegList implements js_library.JSObjectInterfacesDom {
+  PathSegListImpl.internal_() : super.internal_();
+  get runtimeType => PathSegList;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticSmoothRel {
+  static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothRelImpl;
+
+}
+class PathSegCurvetoQuadraticSmoothRelImpl extends PathSegCurvetoQuadraticSmoothRel implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoQuadraticSmoothRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoQuadraticSmoothRel;
+  toString() => super.toString();
+}
+patch class FEFuncRElement {
+  static Type get instanceRuntimeType => FEFuncRElementImpl;
+
+}
+class FEFuncRElementImpl extends FEFuncRElement implements js_library.JSObjectInterfacesDom {
+  FEFuncRElementImpl.internal_() : super.internal_();
+  get runtimeType => FEFuncRElement;
+  toString() => super.toString();
+}
+patch class FEFuncBElement {
+  static Type get instanceRuntimeType => FEFuncBElementImpl;
+
+}
+class FEFuncBElementImpl extends FEFuncBElement implements js_library.JSObjectInterfacesDom {
+  FEFuncBElementImpl.internal_() : super.internal_();
+  get runtimeType => FEFuncBElement;
+  toString() => super.toString();
+}
+patch class FEBlendElement {
+  static Type get instanceRuntimeType => FEBlendElementImpl;
+
+}
+class FEBlendElementImpl extends FEBlendElement implements js_library.JSObjectInterfacesDom {
+  FEBlendElementImpl.internal_() : super.internal_();
+  get runtimeType => FEBlendElement;
+  toString() => super.toString();
+}
+patch class AnimatedAngle {
+  static Type get instanceRuntimeType => AnimatedAngleImpl;
+
+}
+class AnimatedAngleImpl extends AnimatedAngle implements js_library.JSObjectInterfacesDom {
+  AnimatedAngleImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedAngle;
+  toString() => super.toString();
+}
+patch class TSpanElement {
+  static Type get instanceRuntimeType => TSpanElementImpl;
+
+}
+class TSpanElementImpl extends TSpanElement implements js_library.JSObjectInterfacesDom {
+  TSpanElementImpl.internal_() : super.internal_();
+  get runtimeType => TSpanElement;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoCubicRel {
+  static Type get instanceRuntimeType => PathSegCurvetoCubicRelImpl;
+
+}
+class PathSegCurvetoCubicRelImpl extends PathSegCurvetoCubicRel implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoCubicRelImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoCubicRel;
+  toString() => super.toString();
+}
+patch class AnimateMotionElement {
+  static Type get instanceRuntimeType => AnimateMotionElementImpl;
+
+}
+class AnimateMotionElementImpl extends AnimateMotionElement implements js_library.JSObjectInterfacesDom {
+  AnimateMotionElementImpl.internal_() : super.internal_();
+  get runtimeType => AnimateMotionElement;
+  toString() => super.toString();
+}
+patch class GeometryElement {
+  static Type get instanceRuntimeType => GeometryElementImpl;
+
+}
+class GeometryElementImpl extends GeometryElement implements js_library.JSObjectInterfacesDom {
+  GeometryElementImpl.internal_() : super.internal_();
+  get runtimeType => GeometryElement;
+  toString() => super.toString();
+}
+patch class AnimateTransformElement {
+  static Type get instanceRuntimeType => AnimateTransformElementImpl;
+
+}
+class AnimateTransformElementImpl extends AnimateTransformElement implements js_library.JSObjectInterfacesDom {
+  AnimateTransformElementImpl.internal_() : super.internal_();
+  get runtimeType => AnimateTransformElement;
+  toString() => super.toString();
+}
+patch class PreserveAspectRatio {
+  static Type get instanceRuntimeType => PreserveAspectRatioImpl;
+
+}
+class PreserveAspectRatioImpl extends PreserveAspectRatio implements js_library.JSObjectInterfacesDom {
+  PreserveAspectRatioImpl.internal_() : super.internal_();
+  get runtimeType => PreserveAspectRatio;
+  toString() => super.toString();
+}
+patch class PathElement {
+  static Type get instanceRuntimeType => PathElementImpl;
+
+}
+class PathElementImpl extends PathElement implements js_library.JSObjectInterfacesDom {
+  PathElementImpl.internal_() : super.internal_();
+  get runtimeType => PathElement;
+  toString() => super.toString();
+}
+patch class FEColorMatrixElement {
+  static Type get instanceRuntimeType => FEColorMatrixElementImpl;
+
+}
+class FEColorMatrixElementImpl extends FEColorMatrixElement implements js_library.JSObjectInterfacesDom {
+  FEColorMatrixElementImpl.internal_() : super.internal_();
+  get runtimeType => FEColorMatrixElement;
+  toString() => super.toString();
+}
+patch class PatternElement {
+  static Type get instanceRuntimeType => PatternElementImpl;
+
+}
+class PatternElementImpl extends PatternElement implements js_library.JSObjectInterfacesDom {
+  PatternElementImpl.internal_() : super.internal_();
+  get runtimeType => PatternElement;
+  toString() => super.toString();
+}
+patch class Length {
+  static Type get instanceRuntimeType => LengthImpl;
+
+}
+class LengthImpl extends Length implements js_library.JSObjectInterfacesDom {
+  LengthImpl.internal_() : super.internal_();
+  get runtimeType => Length;
+  toString() => super.toString();
+}
+patch class FESpotLightElement {
+  static Type get instanceRuntimeType => FESpotLightElementImpl;
+
+}
+class FESpotLightElementImpl extends FESpotLightElement implements js_library.JSObjectInterfacesDom {
+  FESpotLightElementImpl.internal_() : super.internal_();
+  get runtimeType => FESpotLightElement;
+  toString() => super.toString();
+}
+patch class LineElement {
+  static Type get instanceRuntimeType => LineElementImpl;
+
+}
+class LineElementImpl extends LineElement implements js_library.JSObjectInterfacesDom {
+  LineElementImpl.internal_() : super.internal_();
+  get runtimeType => LineElement;
+  toString() => super.toString();
+}
+patch class Matrix {
+  static Type get instanceRuntimeType => MatrixImpl;
+
+}
+class MatrixImpl extends Matrix implements js_library.JSObjectInterfacesDom {
+  MatrixImpl.internal_() : super.internal_();
+  get runtimeType => Matrix;
+  toString() => super.toString();
+}
+patch class SvgSvgElement {
+  static Type get instanceRuntimeType => SvgSvgElementImpl;
+
+}
+class SvgSvgElementImpl extends SvgSvgElement implements js_library.JSObjectInterfacesDom {
+  SvgSvgElementImpl.internal_() : super.internal_();
+  get runtimeType => SvgSvgElement;
+  toString() => super.toString();
+}
+patch class FitToViewBox {
+  static Type get instanceRuntimeType => FitToViewBoxImpl;
+
+}
+class FitToViewBoxImpl extends FitToViewBox implements js_library.JSObjectInterfacesDom {
+  FitToViewBoxImpl.internal_() : super.internal_();
+  get runtimeType => FitToViewBox;
+  toString() => super.toString();
+}
+patch class _SVGMPathElement {
+  static Type get instanceRuntimeType => _SVGMPathElementImpl;
+
+}
+class _SVGMPathElementImpl extends _SVGMPathElement implements js_library.JSObjectInterfacesDom {
+  _SVGMPathElementImpl.internal_() : super.internal_();
+  get runtimeType => _SVGMPathElement;
+  toString() => super.toString();
+}
+patch class FEDisplacementMapElement {
+  static Type get instanceRuntimeType => FEDisplacementMapElementImpl;
+
+}
+class FEDisplacementMapElementImpl extends FEDisplacementMapElement implements js_library.JSObjectInterfacesDom {
+  FEDisplacementMapElementImpl.internal_() : super.internal_();
+  get runtimeType => FEDisplacementMapElement;
+  toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticSmoothAbs {
+  static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothAbsImpl;
+
+}
+class PathSegCurvetoQuadraticSmoothAbsImpl extends PathSegCurvetoQuadraticSmoothAbs implements js_library.JSObjectInterfacesDom {
+  PathSegCurvetoQuadraticSmoothAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegCurvetoQuadraticSmoothAbs;
+  toString() => super.toString();
+}
+patch class PathSegClosePath {
+  static Type get instanceRuntimeType => PathSegClosePathImpl;
+
+}
+class PathSegClosePathImpl extends PathSegClosePath implements js_library.JSObjectInterfacesDom {
+  PathSegClosePathImpl.internal_() : super.internal_();
+  get runtimeType => PathSegClosePath;
+  toString() => super.toString();
+}
+patch class AnimatedLength {
+  static Type get instanceRuntimeType => AnimatedLengthImpl;
+
+}
+class AnimatedLengthImpl extends AnimatedLength implements js_library.JSObjectInterfacesDom {
+  AnimatedLengthImpl.internal_() : super.internal_();
+  get runtimeType => AnimatedLength;
+  toString() => super.toString();
+}
+patch class ClipPathElement {
+  static Type get instanceRuntimeType => ClipPathElementImpl;
+
+}
+class ClipPathElementImpl extends ClipPathElement implements js_library.JSObjectInterfacesDom {
+  ClipPathElementImpl.internal_() : super.internal_();
+  get runtimeType => ClipPathElement;
+  toString() => super.toString();
+}
+patch class StopElement {
+  static Type get instanceRuntimeType => StopElementImpl;
+
+}
+class StopElementImpl extends StopElement implements js_library.JSObjectInterfacesDom {
+  StopElementImpl.internal_() : super.internal_();
+  get runtimeType => StopElement;
+  toString() => super.toString();
+}
+patch class ViewSpec {
+  static Type get instanceRuntimeType => ViewSpecImpl;
+
+}
+class ViewSpecImpl extends ViewSpec implements js_library.JSObjectInterfacesDom {
+  ViewSpecImpl.internal_() : super.internal_();
+  get runtimeType => ViewSpec;
+  toString() => super.toString();
+}
+patch class LengthList {
+  static Type get instanceRuntimeType => LengthListImpl;
+
+}
+class LengthListImpl extends LengthList implements js_library.JSObjectInterfacesDom {
+  LengthListImpl.internal_() : super.internal_();
+  get runtimeType => LengthList;
+  toString() => super.toString();
+}
+patch class _SVGCursorElement {
+  static Type get instanceRuntimeType => _SVGCursorElementImpl;
+
+}
+class _SVGCursorElementImpl extends _SVGCursorElement implements js_library.JSObjectInterfacesDom {
+  _SVGCursorElementImpl.internal_() : super.internal_();
+  get runtimeType => _SVGCursorElement;
+  toString() => super.toString();
+}
+patch class ForeignObjectElement {
+  static Type get instanceRuntimeType => ForeignObjectElementImpl;
+
+}
+class ForeignObjectElementImpl extends ForeignObjectElement implements js_library.JSObjectInterfacesDom {
+  ForeignObjectElementImpl.internal_() : super.internal_();
+  get runtimeType => ForeignObjectElement;
+  toString() => super.toString();
+}
+patch class SetElement {
+  static Type get instanceRuntimeType => SetElementImpl;
+
+}
+class SetElementImpl extends SetElement implements js_library.JSObjectInterfacesDom {
+  SetElementImpl.internal_() : super.internal_();
+  get runtimeType => SetElement;
+  toString() => super.toString();
+}
+patch class SvgElement {
+  static Type get instanceRuntimeType => SvgElementImpl;
+
+}
+class SvgElementImpl extends SvgElement implements js_library.JSObjectInterfacesDom {
+  SvgElementImpl.internal_() : super.internal_();
+  get runtimeType => SvgElement;
+  toString() => super.toString();
+}
+patch class UnitTypes {
+  static Type get instanceRuntimeType => UnitTypesImpl;
+
+}
+class UnitTypesImpl extends UnitTypes implements js_library.JSObjectInterfacesDom {
+  UnitTypesImpl.internal_() : super.internal_();
+  get runtimeType => UnitTypes;
+  toString() => super.toString();
+}
+patch class FEComponentTransferElement {
+  static Type get instanceRuntimeType => FEComponentTransferElementImpl;
+
+}
+class FEComponentTransferElementImpl extends FEComponentTransferElement implements js_library.JSObjectInterfacesDom {
+  FEComponentTransferElementImpl.internal_() : super.internal_();
+  get runtimeType => FEComponentTransferElement;
+  toString() => super.toString();
+}
+patch class PathSegLinetoVerticalAbs {
+  static Type get instanceRuntimeType => PathSegLinetoVerticalAbsImpl;
+
+}
+class PathSegLinetoVerticalAbsImpl extends PathSegLinetoVerticalAbs implements js_library.JSObjectInterfacesDom {
+  PathSegLinetoVerticalAbsImpl.internal_() : super.internal_();
+  get runtimeType => PathSegLinetoVerticalAbs;
+  toString() => super.toString();
+}
+patch class DescElement {
+  static Type get instanceRuntimeType => DescElementImpl;
+
+}
+class DescElementImpl extends DescElement implements js_library.JSObjectInterfacesDom {
+  DescElementImpl.internal_() : super.internal_();
+  get runtimeType => DescElement;
+  toString() => super.toString();
+}
+patch class DiscardElement {
+  static Type get instanceRuntimeType => DiscardElementImpl;
+
+}
+class DiscardElementImpl extends DiscardElement implements js_library.JSObjectInterfacesDom {
+  DiscardElementImpl.internal_() : super.internal_();
+  get runtimeType => DiscardElement;
+  toString() => super.toString();
+}
+patch class FEMergeNodeElement {
+  static Type get instanceRuntimeType => FEMergeNodeElementImpl;
+
+}
+class FEMergeNodeElementImpl extends FEMergeNodeElement implements js_library.JSObjectInterfacesDom {
+  FEMergeNodeElementImpl.internal_() : super.internal_();
+  get runtimeType => FEMergeNodeElement;
+  toString() => super.toString();
+}
+patch class TextPathElement {
+  static Type get instanceRuntimeType => TextPathElementImpl;
+
+}
+class TextPathElementImpl extends TextPathElement implements js_library.JSObjectInterfacesDom {
+  TextPathElementImpl.internal_() : super.internal_();
+  get runtimeType => TextPathElement;
+  toString() => super.toString();
+}
+patch class FEOffsetElement {
+  static Type get instanceRuntimeType => FEOffsetElementImpl;
+
+}
+class FEOffsetElementImpl extends FEOffsetElement implements js_library.JSObjectInterfacesDom {
+  FEOffsetElementImpl.internal_() : super.internal_();
+  get runtimeType => FEOffsetElement;
+  toString() => super.toString();
+}
+patch class ZoomAndPan {
+  static Type get instanceRuntimeType => ZoomAndPanImpl;
+
+}
+class ZoomAndPanImpl extends ZoomAndPan implements js_library.JSObjectInterfacesDom {
+  ZoomAndPanImpl.internal_() : super.internal_();
+  get runtimeType => ZoomAndPan;
+  toString() => super.toString();
+}
+patch class ViewElement {
+  static Type get instanceRuntimeType => ViewElementImpl;
+
+}
+class ViewElementImpl extends ViewElement implements js_library.JSObjectInterfacesDom {
+  ViewElementImpl.internal_() : super.internal_();
+  get runtimeType => ViewElement;
+  toString() => super.toString();
+}
+patch class FEPointLightElement {
+  static Type get instanceRuntimeType => FEPointLightElementImpl;
+
+}
+class FEPointLightElementImpl extends FEPointLightElement implements js_library.JSObjectInterfacesDom {
+  FEPointLightElementImpl.internal_() : super.internal_();
+  get runtimeType => FEPointLightElement;
+  toString() => super.toString();
+}
+patch class FEFuncAElement {
+  static Type get instanceRuntimeType => FEFuncAElementImpl;
+
+}
+class FEFuncAElementImpl extends FEFuncAElement implements js_library.JSObjectInterfacesDom {
+  FEFuncAElementImpl.internal_() : super.internal_();
+  get runtimeType => FEFuncAElement;
+  toString() => super.toString();
+}
+
+"""],"dart:web_audio": ["dart:web_audio", "dart:web_audio_js_interop_patch.dart", """import 'dart:js' as js_library;
+
+/**
+ * Placeholder object for cases where we need to determine exactly how many
+ * args were passed to a function.
+ */
+const _UNDEFINED_JS_CONST = const Object();
+
+patch class GainNode {
+  static Type get instanceRuntimeType => GainNodeImpl;
+
+}
+class GainNodeImpl extends GainNode implements js_library.JSObjectInterfacesDom {
+  GainNodeImpl.internal_() : super.internal_();
+  get runtimeType => GainNode;
+  toString() => super.toString();
+}
+patch class MediaStreamAudioDestinationNode {
+  static Type get instanceRuntimeType => MediaStreamAudioDestinationNodeImpl;
+
+}
+class MediaStreamAudioDestinationNodeImpl extends MediaStreamAudioDestinationNode implements js_library.JSObjectInterfacesDom {
+  MediaStreamAudioDestinationNodeImpl.internal_() : super.internal_();
+  get runtimeType => MediaStreamAudioDestinationNode;
+  toString() => super.toString();
+}
+patch class AudioProcessingEvent {
+  static Type get instanceRuntimeType => AudioProcessingEventImpl;
+
+}
+class AudioProcessingEventImpl extends AudioProcessingEvent implements js_library.JSObjectInterfacesDom {
+  AudioProcessingEventImpl.internal_() : super.internal_();
+  get runtimeType => AudioProcessingEvent;
+  toString() => super.toString();
+}
+patch class StereoPannerNode {
+  static Type get instanceRuntimeType => StereoPannerNodeImpl;
+
+}
+class StereoPannerNodeImpl extends StereoPannerNode implements js_library.JSObjectInterfacesDom {
+  StereoPannerNodeImpl.internal_() : super.internal_();
+  get runtimeType => StereoPannerNode;
+  toString() => super.toString();
+}
+patch class DynamicsCompressorNode {
+  static Type get instanceRuntimeType => DynamicsCompressorNodeImpl;
+
+}
+class DynamicsCompressorNodeImpl extends DynamicsCompressorNode implements js_library.JSObjectInterfacesDom {
+  DynamicsCompressorNodeImpl.internal_() : super.internal_();
+  get runtimeType => DynamicsCompressorNode;
+  toString() => super.toString();
+}
+patch class PeriodicWave {
+  static Type get instanceRuntimeType => PeriodicWaveImpl;
+
+}
+class PeriodicWaveImpl extends PeriodicWave implements js_library.JSObjectInterfacesDom {
+  PeriodicWaveImpl.internal_() : super.internal_();
+  get runtimeType => PeriodicWave;
+  toString() => super.toString();
+}
+patch class MediaStreamAudioSourceNode {
+  static Type get instanceRuntimeType => MediaStreamAudioSourceNodeImpl;
+
+}
+class MediaStreamAudioSourceNodeImpl extends MediaStreamAudioSourceNode implements js_library.JSObjectInterfacesDom {
+  MediaStreamAudioSourceNodeImpl.internal_() : super.internal_();
+  get runtimeType => MediaStreamAudioSourceNode;
+  toString() => super.toString();
+}
+patch class PannerNode {
+  static Type get instanceRuntimeType => PannerNodeImpl;
+
+}
+class PannerNodeImpl extends PannerNode implements js_library.JSObjectInterfacesDom {
+  PannerNodeImpl.internal_() : super.internal_();
+  get runtimeType => PannerNode;
+  toString() => super.toString();
+}
+patch class OfflineAudioContext {
+  static Type get instanceRuntimeType => OfflineAudioContextImpl;
+
+}
+class OfflineAudioContextImpl extends OfflineAudioContext implements js_library.JSObjectInterfacesDom {
+  OfflineAudioContextImpl.internal_() : super.internal_();
+  get runtimeType => OfflineAudioContext;
+  toString() => super.toString();
+}
+patch class AudioParam {
+  static Type get instanceRuntimeType => AudioParamImpl;
+
+}
+class AudioParamImpl extends AudioParam implements js_library.JSObjectInterfacesDom {
+  AudioParamImpl.internal_() : super.internal_();
+  get runtimeType => AudioParam;
+  toString() => super.toString();
+}
+patch class AnalyserNode {
+  static Type get instanceRuntimeType => AnalyserNodeImpl;
+
+}
+class AnalyserNodeImpl extends AnalyserNode implements js_library.JSObjectInterfacesDom {
+  AnalyserNodeImpl.internal_() : super.internal_();
+  get runtimeType => AnalyserNode;
+  toString() => super.toString();
+}
+patch class ConvolverNode {
+  static Type get instanceRuntimeType => ConvolverNodeImpl;
+
+}
+class ConvolverNodeImpl extends ConvolverNode implements js_library.JSObjectInterfacesDom {
+  ConvolverNodeImpl.internal_() : super.internal_();
+  get runtimeType => ConvolverNode;
+  toString() => super.toString();
+}
+patch class AudioNode {
+  static Type get instanceRuntimeType => AudioNodeImpl;
+
+}
+class AudioNodeImpl extends AudioNode implements js_library.JSObjectInterfacesDom {
+  AudioNodeImpl.internal_() : super.internal_();
+  get runtimeType => AudioNode;
+  toString() => super.toString();
+}
+patch class AudioDestinationNode {
+  static Type get instanceRuntimeType => AudioDestinationNodeImpl;
+
+}
+class AudioDestinationNodeImpl extends AudioDestinationNode implements js_library.JSObjectInterfacesDom {
+  AudioDestinationNodeImpl.internal_() : super.internal_();
+  get runtimeType => AudioDestinationNode;
+  toString() => super.toString();
+}
+patch class WaveShaperNode {
+  static Type get instanceRuntimeType => WaveShaperNodeImpl;
+
+}
+class WaveShaperNodeImpl extends WaveShaperNode implements js_library.JSObjectInterfacesDom {
+  WaveShaperNodeImpl.internal_() : super.internal_();
+  get runtimeType => WaveShaperNode;
+  toString() => super.toString();
+}
+patch class ScriptProcessorNode {
+  static Type get instanceRuntimeType => ScriptProcessorNodeImpl;
+
+}
+class ScriptProcessorNodeImpl extends ScriptProcessorNode implements js_library.JSObjectInterfacesDom {
+  ScriptProcessorNodeImpl.internal_() : super.internal_();
+  get runtimeType => ScriptProcessorNode;
+  toString() => super.toString();
+}
+patch class MediaElementAudioSourceNode {
+  static Type get instanceRuntimeType => MediaElementAudioSourceNodeImpl;
+
+}
+class MediaElementAudioSourceNodeImpl extends MediaElementAudioSourceNode implements js_library.JSObjectInterfacesDom {
+  MediaElementAudioSourceNodeImpl.internal_() : super.internal_();
+  get runtimeType => MediaElementAudioSourceNode;
+  toString() => super.toString();
+}
+patch class AudioBufferSourceNode {
+  static Type get instanceRuntimeType => AudioBufferSourceNodeImpl;
+
+}
+class AudioBufferSourceNodeImpl extends AudioBufferSourceNode implements js_library.JSObjectInterfacesDom {
+  AudioBufferSourceNodeImpl.internal_() : super.internal_();
+  get runtimeType => AudioBufferSourceNode;
+  toString() => super.toString();
+}
+patch class AudioContext {
+  static Type get instanceRuntimeType => AudioContextImpl;
+
+}
+class AudioContextImpl extends AudioContext implements js_library.JSObjectInterfacesDom {
+  AudioContextImpl.internal_() : super.internal_();
+  get runtimeType => AudioContext;
+  toString() => super.toString();
+}
+patch class ChannelSplitterNode {
+  static Type get instanceRuntimeType => ChannelSplitterNodeImpl;
+
+}
+class ChannelSplitterNodeImpl extends ChannelSplitterNode implements js_library.JSObjectInterfacesDom {
+  ChannelSplitterNodeImpl.internal_() : super.internal_();
+  get runtimeType => ChannelSplitterNode;
+  toString() => super.toString();
+}
+patch class DelayNode {
+  static Type get instanceRuntimeType => DelayNodeImpl;
+
+}
+class DelayNodeImpl extends DelayNode implements js_library.JSObjectInterfacesDom {
+  DelayNodeImpl.internal_() : super.internal_();
+  get runtimeType => DelayNode;
+  toString() => super.toString();
+}
+patch class OfflineAudioCompletionEvent {
+  static Type get instanceRuntimeType => OfflineAudioCompletionEventImpl;
+
+}
+class OfflineAudioCompletionEventImpl extends OfflineAudioCompletionEvent implements js_library.JSObjectInterfacesDom {
+  OfflineAudioCompletionEventImpl.internal_() : super.internal_();
+  get runtimeType => OfflineAudioCompletionEvent;
+  toString() => super.toString();
+}
+patch class OscillatorNode {
+  static Type get instanceRuntimeType => OscillatorNodeImpl;
+
+}
+class OscillatorNodeImpl extends OscillatorNode implements js_library.JSObjectInterfacesDom {
+  OscillatorNodeImpl.internal_() : super.internal_();
+  get runtimeType => OscillatorNode;
+  toString() => super.toString();
+}
+patch class BiquadFilterNode {
+  static Type get instanceRuntimeType => BiquadFilterNodeImpl;
+
+}
+class BiquadFilterNodeImpl extends BiquadFilterNode implements js_library.JSObjectInterfacesDom {
+  BiquadFilterNodeImpl.internal_() : super.internal_();
+  get runtimeType => BiquadFilterNode;
+  toString() => super.toString();
+}
+patch class AudioBuffer {
+  static Type get instanceRuntimeType => AudioBufferImpl;
+
+}
+class AudioBufferImpl extends AudioBuffer implements js_library.JSObjectInterfacesDom {
+  AudioBufferImpl.internal_() : super.internal_();
+  get runtimeType => AudioBuffer;
+  toString() => super.toString();
+}
+patch class ChannelMergerNode {
+  static Type get instanceRuntimeType => ChannelMergerNodeImpl;
+
+}
+class ChannelMergerNodeImpl extends ChannelMergerNode implements js_library.JSObjectInterfacesDom {
+  ChannelMergerNodeImpl.internal_() : super.internal_();
+  get runtimeType => ChannelMergerNode;
+  toString() => super.toString();
+}
+patch class AudioSourceNode {
+  static Type get instanceRuntimeType => AudioSourceNodeImpl;
+
+}
+class AudioSourceNodeImpl extends AudioSourceNode implements js_library.JSObjectInterfacesDom {
+  AudioSourceNodeImpl.internal_() : super.internal_();
+  get runtimeType => AudioSourceNode;
+  toString() => super.toString();
+}
+patch class AudioListener {
+  static Type get instanceRuntimeType => AudioListenerImpl;
+
+}
+class AudioListenerImpl extends AudioListener implements js_library.JSObjectInterfacesDom {
+  AudioListenerImpl.internal_() : super.internal_();
+  get runtimeType => AudioListener;
+  toString() => super.toString();
+}
+
+"""],};
+// END_OF_CACHED_PATCHES
diff --git a/sdk/lib/js/dartium/js_dartium.dart b/sdk/lib/js/dartium/js_dartium.dart
index 070baf7..610ec22 100644
--- a/sdk/lib/js/dartium/js_dartium.dart
+++ b/sdk/lib/js/dartium/js_dartium.dart
@@ -92,9 +92,13 @@
 import 'dart:math' as math;
 import 'dart:mirrors' as mirrors;
 import 'dart:html' as html;
+import 'dart:_blink' as _blink;
 import 'dart:html_common' as html_common;
 import 'dart:indexed_db' as indexed_db;
 import 'dart:typed_data';
+import 'dart:core';
+
+import 'cached_patches.dart';
 
 // Pretend we are always in checked mode as we aren't interested in users
 // running Dartium code outside of checked mode.
@@ -117,7 +121,7 @@
       varArgs[mirrors.MirrorSystem.getName(symbol)] = val;
     });
     return invocation.positionalArguments.toList()
-      ..add(maybeWrapTypedInterop(new JsObject.jsify(varArgs)));
+      ..add(JsNative.jsify(varArgs));
   }
 }
 
@@ -278,13 +282,52 @@
 
 _finalizeJsInterfaces() native "Js_finalizeJsInterfaces";
 
+// Create the files for the generated Dart files from IDLs.  These only change
+// when browser's Dart files change (dart:*).
+@Deprecated("Internal Use Only")
+String createCachedPatchesFile() {
+  var patches = _generateInteropPatchFiles(['dart:html',
+                                            'dart:indexed_db',
+                                            'dart:web_gl',
+                                            'dart:web_sql',
+                                            'dart:svg',
+                                            'dart:web_audio']);
+  var sb = new StringBuffer();
+
+  sb.write("""
+
+// START_OF_CACHED_PATCHES
+// 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.
+
+// DO NOT EDIT GENERATED FILE.
+
+library cached_patches;
+
+var cached_patches = {""");
+
+  for (var baseIndex = 0; baseIndex < patches.length; baseIndex += 3) {
+    var uri = patches[baseIndex + 0];
+    var uri_js_interop = patches[baseIndex + 1];
+    var source = patches[baseIndex + 2];
+
+    if (uri != 'dart:js') {
+      sb.write('"$uri": ["$uri", "$uri_js_interop", """$source"""],');
+    }
+  }
+
+  sb.write("""};
+// END_OF_CACHED_PATCHES
+  """);
+
+  return "$sb";
+}
+
 String _getJsName(mirrors.DeclarationMirror mirror) {
-  for (var annotation in mirror.metadata) {
-    if (mirrors.MirrorSystem.getName(annotation.type.simpleName) == "JS") {
-      mirrors.LibraryMirror library = annotation.type.owner;
-      var uri = library.uri;
-      // make sure the annotation is from package://js
-      if (uri.scheme == 'package' && uri.path == 'js/js.dart') {
+  if (_atJsType != null) {
+    for (var annotation in mirror.metadata) {
+      if (annotation.type.reflectedType == _atJsType) {
         try {
           var name = annotation.reflectee.name;
           return name != null ? name : "";
@@ -312,6 +355,8 @@
 
 bool _hasJsName(mirrors.DeclarationMirror mirror) => _getJsName(mirror) != null;
 
+var _domNameType;
+
 bool hasDomName(mirrors.DeclarationMirror mirror) {
   var location = mirror.location;
   if (location == null || location.sourceUri.scheme != 'dart') return false;
@@ -357,12 +402,21 @@
   return sb.toString();
 }
 
+// TODO(jacobr): remove these helpers and add JsNative.setPropertyDotted,
+// getPropertyDotted, and callMethodDotted helpers that would be simpler
+// and more efficient.
 String _accessJsPathSetter(String path) {
   var parts = path.split(".");
   return "${_JS_LIBRARY_PREFIX}.JsNative.setProperty(${_accessJsPathHelper(parts.getRange(0, parts.length - 1))
       }, '${parts.last}', v)";
 }
 
+String _accessJsPathCallMethodHelper(String path) {
+  var parts = path.split(".");
+  return "${_JS_LIBRARY_PREFIX}.JsNative.callMethod(${_accessJsPathHelper(parts.getRange(0, parts.length - 1))
+      }, '${parts.last}',";
+}
+
 @Deprecated("Internal Use Only")
 void addMemberHelper(
     mirrors.MethodMirror declaration, String path, StringBuffer sb,
@@ -382,11 +436,11 @@
   sb.write(" ");
   if (declaration.isGetter) {
     sb.write(
-        "get $name => ${_JS_LIBRARY_PREFIX}.maybeWrapTypedInterop(${_accessJsPath(path)});");
+        "get $name => ${_accessJsPath(path)};");
   } else if (declaration.isSetter) {
     sb.write("set $name(v) {\n"
         "  ${_JS_LIBRARY_PREFIX}.safeForTypedInterop(v);\n"
-        "  return ${_JS_LIBRARY_PREFIX}.maybeWrapTypedInterop(${_accessJsPathSetter(path)});\n"
+        "  return ${_accessJsPathSetter(path)};\n"
         "}\n");
   } else {
     sb.write("$name(");
@@ -419,19 +473,19 @@
     for (var arg in args) {
       sb.write("  ${_JS_LIBRARY_PREFIX}.safeForTypedInterop($arg);\n");
     }
-    sb.write("  return ${_JS_LIBRARY_PREFIX}.maybeWrapTypedInterop(");
+    sb.write("  return ");
     if (declaration.isConstructor) {
-      sb.write("new ${_JS_LIBRARY_PREFIX}.JsObject(");
+      sb.write("${_JS_LIBRARY_PREFIX}.JsNative.callConstructor(");
+      sb..write(_accessJsPath(path))..write(",");
+    } else {
+      sb.write(_accessJsPathCallMethodHelper(path));
     }
-    sb
-      ..write(_accessJsPath(path))
-      ..write(declaration.isConstructor ? "," : ".apply(")
-      ..write("[${args.join(",")}]");
+    sb.write("[${args.join(",")}]");
 
     if (hasOptional) {
       sb.write(".takeWhile((i) => i != ${_UNDEFINED_VAR}).toList()");
     }
-    sb.write("));");
+    sb.write(");");
     sb.write("}\n");
   }
   sb.write("\n");
@@ -445,9 +499,37 @@
   return false;
 }
 
-List<String> _generateExternalMethods() {
+List<String> _generateExternalMethods(List<String> libraryPaths) {
   var staticCodegen = <String>[];
-  mirrors.currentMirrorSystem().libraries.forEach((uri, library) {
+
+  if (libraryPaths.length == 0) {
+    mirrors.currentMirrorSystem().libraries.forEach((uri, library) {
+      var library_name = "${uri.scheme}:${uri.path}";
+      if (cached_patches.containsKey(library_name)) {
+        var patch = cached_patches[library_name];
+        staticCodegen.addAll(patch);
+      } else {
+        _generateLibraryCodegen(uri, library, staticCodegen);
+      }
+    });    // End of library foreach
+  } else {
+    // Used to generate cached_patches.dart file for all IDL generated dart:
+    // files to the WebKit DOM.
+    for (var library_name in libraryPaths) {
+      var parts = library_name.split(':');
+      var uri = new Uri(scheme: parts[0], path: parts[1]);
+      var library = mirrors.currentMirrorSystem().libraries[uri];
+      _generateLibraryCodegen(uri, library, staticCodegen);
+    }
+  }
+
+  return staticCodegen;
+}
+
+_generateLibraryCodegen(uri, library, staticCodegen) {
+    // Is it a dart generated library?
+    var dartLibrary = uri.scheme == 'dart';  
+
     var sb = new StringBuffer();
     String jsLibraryName = _getJsName(library);
     library.declarations.forEach((name, declaration) {
@@ -458,7 +540,7 @@
         }
       } else if (declaration is mirrors.ClassMirror) {
         mirrors.ClassMirror clazz = declaration;
-        var isDom = hasDomName(clazz);
+        var isDom = dartLibrary ? hasDomName(clazz) : false;
         var isJsInterop = _hasJsName(clazz);
         if (isDom || isJsInterop) {
           // TODO(jacobr): verify class implements JavaScriptObject.
@@ -490,7 +572,7 @@
                     ..write('}');
                 }
                 sbPatch.write(") {\n"
-                    "    var ret = new ${_JS_LIBRARY_PREFIX}.JsObject.jsify({});\n");
+                    "    var ret = ${_JS_LIBRARY_PREFIX}.JsNative.newObject();\n");
                 i = 0;
                 for (var p in declaration.parameters) {
                   assert(p.isNamed); // TODO(jacobr): throw.
@@ -499,14 +581,14 @@
                       mirrors.MirrorSystem.getName(p.simpleName));
                   sbPatch.write("    if($name != ${_UNDEFINED_VAR}) {\n"
                       "      ${_JS_LIBRARY_PREFIX}.safeForTypedInterop($name);\n"
-                      "      ret['$jsName'] = $name;\n"
+                      "      ${_JS_LIBRARY_PREFIX}.JsNative.setProperty(ret, '$jsName', $name);\n"
                       "    }\n");
                   i++;
                 }
 
                 sbPatch.write(
-                    "    return new ${_JS_LIBRARY_PREFIX}.JSObject.create(ret);\n"
-                    "  }\n");
+                  "  return ret;"
+                  "}\n");
               } else if (declaration.isConstructor ||
                   declaration.isFactoryConstructor) {
                 sbPatch.write("  ");
@@ -519,7 +601,7 @@
                     isStatic: true,
                     memberName: className);
               }
-            });
+            });   // End of clazz.declarations.forEach 
 
             clazz.staticMembers.forEach((memberName, member) {
               if (_isExternal(member)) {
@@ -535,8 +617,7 @@
             });
           }
           if (isDom) {
-            sbPatch.write("  factory ${className}._internalWrap() => "
-                "new ${classNameImpl}.internal_();\n");
+            sbPatch.write("  static Type get instanceRuntimeType => ${classNameImpl};\n");
           }
           if (sbPatch.isNotEmpty) {
             var typeVariablesClause = '';
@@ -578,18 +659,32 @@
 ${sb}
 """);
     }
-  });
-
-  return staticCodegen;
 }
 
+// Remember the @JS type to compare annotation type.
+var _atJsType = -1;
+
 /**
  * Generates part files defining source code for JSObjectImpl, all DOM classes
  * classes. This codegen  is needed so that type checks for all registered
  * JavaScript interop classes pass.
  */
-List<String> _generateInteropPatchFiles() {
-  var ret = _generateExternalMethods();
+List<String> _generateInteropPatchFiles(List<String> libraryPaths) {
+  // Cache the @JS Type.
+  if (_atJsType == -1) {
+    var uri = new Uri(scheme: "package", path: "js/js.dart");
+    var jsLibrary = mirrors.currentMirrorSystem().libraries[uri];
+    if (jsLibrary != null) {
+      // @ JS used somewhere.
+      var jsDeclaration = jsLibrary.declarations[new Symbol("JS")];
+      _atJsType = jsDeclaration.reflectedType;
+    } else {
+      // @ JS not used in any library.
+      _atJsType = null;
+    }
+  }
+
+  var ret = _generateExternalMethods(libraryPaths);
   var libraryPrefixes = new Map<mirrors.LibraryMirror, String>();
   var prefixNames = new Set<String>();
   var sb = new StringBuffer();
@@ -671,27 +766,15 @@
 }
 
 patch class JSObject {
-  factory JSObject.create(JsObject jsObject) {
-    var ret = new JSObjectImpl.internal()..blink_jsObject = jsObject;
-    jsObject._dartHtmlWrapper = ret;
-    return ret;
-  }
+  static Type get instanceRuntimeType => JSObjectImpl;
 }
 
 patch class JSFunction {
-  factory JSFunction.create(JsObject jsObject) {
-    var ret = new JSFunctionImpl.internal()..blink_jsObject = jsObject;
-    jsObject._dartHtmlWrapper = ret;
-    return ret;
-  }
+  static Type get instanceRuntimeType => JSFunctionImpl;
 }
 
 patch class JSArray {
-  factory JSArray.create(JsObject jsObject) {
-    var ret = new JSArrayImpl.internal()..blink_jsObject = jsObject;
-    jsObject._dartHtmlWrapper = ret;
-    return ret;
-  }
+  static Type get instanceRuntimeType => JSArrayImpl;
 }
 
 _registerAllJsInterfaces() {
@@ -873,49 +956,44 @@
   return _cachedContext;
 }
 
-@Deprecated("Internal Use Only")
-maybeWrapTypedInterop(o) => html_common.wrap_jso_no_SerializedScriptvalue(o);
-
-_maybeWrap(o) {
-  var wrapped = html_common.wrap_jso_no_SerializedScriptvalue(o);
-  if (identical(wrapped, o)) return o;
-  return (wrapped is html.Blob ||
-      wrapped is html.Event ||
-      wrapped is indexed_db.KeyRange ||
-      wrapped is html.ImageData ||
-      wrapped is html.Node ||
-      wrapped is TypedData ||
-      wrapped is html.Window) ? wrapped : o;
+_lookupType(o, bool isCrossFrame, bool isElement) {
+  try {
+   var type = html_common.lookupType(o, isElement);
+   var typeMirror = mirrors.reflectType(type);
+   var legacyInteropConvertToNative = typeMirror.isSubtypeOf(mirrors.reflectType(html.Blob)) ||
+        typeMirror.isSubtypeOf(mirrors.reflectType(html.Event)) ||
+        typeMirror.isSubtypeOf(mirrors.reflectType(indexed_db.KeyRange)) ||
+        typeMirror.isSubtypeOf(mirrors.reflectType(html.ImageData)) ||
+        typeMirror.isSubtypeOf(mirrors.reflectType(html.Node)) ||
+//        TypedData is removed from this list as it is converted directly
+//        rather than flowing through the interceptor code path.
+//        typeMirror.isSubtypeOf(mirrors.reflectType(typed_data.TypedData)) ||
+        typeMirror.isSubtypeOf(mirrors.reflectType(html.Window));
+    if (isCrossFrame && !typeMirror.isSubtypeOf(mirrors.reflectType(html.Window))) {
+      // TODO(jacobr): evaluate using the true cross frame Window class, etc.
+      // as well as triggering that legacy JS Interop returns raw JsObject
+      // instances.
+      legacyInteropConvertToNative = false;
+    }
+    return [type, legacyInteropConvertToNative];
+  } catch (e) { }
+  return [JSObject.instanceRuntimeType, false];
 }
 
 /**
- * Get the dart wrapper object for object. Top-level so we
- * we can access it from other libraries without it being
- * a public instance field on JsObject.
+ * Base class for both the legacy JsObject class and the modern JSObject class.
+ * This allows the JsNative utility class tobehave identically whether it is
+ * called on a JsObject or a JSObject.
  */
-@Deprecated("Internal Use Only")
-getDartHtmlWrapperFor(JsObject object) => object._dartHtmlWrapper;
+class _JSObjectBase extends NativeFieldWrapperClass2 {
+  String _toString() native "JSObject_toString";
+  _callMethod(String name, List args) native "JSObject_callMethod";
+  _operator_getter(String property) native "JSObject_[]";
+  _operator_setter(String property, value) native "JSObject_[]=";
+  bool _hasProperty(String property) native "JsObject_hasProperty";
+  bool _instanceof(/*JsFunction|JSFunction*/ type) native "JsObject_instanceof";
 
-/**
- * Set the dart wrapper object for object. Top-level so we
- * we can access it from other libraries without it being
- * a public instance field on JsObject.
- */
-@Deprecated("Internal Use Only")
-void setDartHtmlWrapperFor(JsObject object, wrapper) {
-  object._dartHtmlWrapper = wrapper;
-}
-
-/**
- * Used by callMethod to get the JS object for each argument passed if the
- * argument is a Dart class instance that delegates to a DOM object.  See
- * wrap_jso defined in dart:html.
- */
-@Deprecated("Internal Use Only")
-unwrap_jso(dartClass_instance) {
-  if (dartClass_instance is JSObject &&
-      dartClass_instance is! JsObject) return dartClass_instance.blink_jsObject;
-  else return dartClass_instance;
+  int get hashCode native "JSObject_hashCode";
 }
 
 /**
@@ -924,22 +1002,16 @@
  * The properties of the JavaScript object are accessible via the `[]` and
  * `[]=` operators. Methods are callable via [callMethod].
  */
-class JsObject extends NativeFieldWrapperClass2 {
+class JsObject extends _JSObjectBase {
   JsObject.internal();
 
   /**
-   * If this JsObject is wrapped, e.g. DOM objects, then we can save the
-   * wrapper here and preserve its identity.
-   */
-  var _dartHtmlWrapper;
-
-  /**
    * Constructs a new JavaScript object from [constructor] and returns a proxy
    * to it.
    */
   factory JsObject(JsFunction constructor, [List arguments]) {
     try {
-      return html_common.unwrap_jso(_create(constructor, arguments));
+      return _create(constructor, arguments);
     } catch (e) {
       // Re-throw any errors (returned as a string) as a DomException.
       throw new html.DomException.jsInterop(e);
@@ -964,6 +1036,7 @@
     if (object is num || object is String || object is bool || object == null) {
       throw new ArgumentError("object cannot be a num, string, bool, or null");
     }
+    if (object is JsObject) return object;
     return _fromBrowserObject(object);
   }
 
@@ -985,7 +1058,7 @@
 
   static JsObject _jsify(object) native "JsObject_jsify";
 
-  static JsObject _fromBrowserObject(object) => html_common.unwrap_jso(object);
+  static JsObject _fromBrowserObject(object) native "JsObject_fromBrowserObject";
 
   /**
    * Returns the value associated with [property] from the proxied JavaScript
@@ -995,14 +1068,14 @@
    */
   operator [](property) {
     try {
-      return _maybeWrap(_operator_getter(property));
+      return _operator_getterLegacy(property);
     } catch (e) {
       // Re-throw any errors (returned as a string) as a DomException.
       throw new html.DomException.jsInterop(e);
     }
   }
 
-  _operator_getter(property) native "JsObject_[]";
+  _operator_getterLegacy(property) native "JsObject_[]Legacy";
 
   /**
    * Sets the value associated with [property] on the proxied JavaScript
@@ -1012,27 +1085,23 @@
    */
   operator []=(property, value) {
     try {
-      _operator_setter(property, value);
+      _operator_setterLegacy(property, value);
     } catch (e) {
       // Re-throw any errors (returned as a string) as a DomException.
       throw new html.DomException.jsInterop(e);
     }
   }
 
-  _operator_setter(property, value) native "JsObject_[]=";
+  _operator_setterLegacy(property, value) native "JsObject_[]=Legacy";
 
   int get hashCode native "JsObject_hashCode";
 
   operator ==(other) {
-    var is_JsObject = other is JsObject;
-    if (!is_JsObject) {
-      other = html_common.unwrap_jso(other);
-      is_JsObject = other is JsObject;
-    }
-    return is_JsObject && _identityEquality(this, other);
+    if (other is! JsObject && other is! JSObject) return false;
+    return _identityEquality(this, other);
   }
 
-  static bool _identityEquality(JsObject a, JsObject b)
+  static bool _identityEquality(a, b)
       native "JsObject_identityEquality";
 
   /**
@@ -1041,7 +1110,7 @@
    *
    * This is the equivalent of the `in` operator in JavaScript.
    */
-  bool hasProperty(String property) native "JsObject_hasProperty";
+  bool hasProperty(String property) => _hasProperty(property);
 
   /**
    * Removes [property] from the JavaScript object.
@@ -1055,7 +1124,7 @@
    *
    * This is the equivalent of the `instanceof` operator in JavaScript.
    */
-  bool instanceof(JsFunction type) native "JsObject_instanceof";
+  bool instanceof(JsFunction type) => _instanceof(type);
 
   /**
    * Returns the result of the JavaScript objects `toString` method.
@@ -1078,7 +1147,7 @@
    */
   callMethod(String method, [List args]) {
     try {
-      return _maybeWrap(_callMethod(method, args));
+      return _callMethodLegacy(method, args);
     } catch (e) {
       if (hasProperty(method)) {
         // Return a DomException if DOM call returned an error.
@@ -1089,19 +1158,26 @@
     }
   }
 
-  _callMethod(String name, List args) native "JsObject_callMethod";
+  _callMethodLegacy(String name, List args) native "JsObject_callMethodLegacy";
 }
 
+
 /// Base class for all JS objects used through dart:html and typed JS interop.
 @Deprecated("Internal Use Only")
-class JSObject {
+class JSObject extends _JSObjectBase {
   JSObject.internal() {}
-  external factory JSObject.create(JsObject jsObject);
+  external static Type get instanceRuntimeType;
 
-  @Deprecated("Internal Use Only")
-  JsObject blink_jsObject;
-
-  String toString() => blink_jsObject.toString();
+  /**
+   * Returns the result of the JavaScript objects `toString` method.
+   */
+  String toString() {
+    try {
+      return _toString();
+    } catch (e) {
+      return super.toString();
+    }
+  }
 
   noSuchMethod(Invocation invocation) {
     throwError() {
@@ -1118,7 +1194,7 @@
             !_allowedMethods.containsKey(invocation.memberName)) {
           throwError();
         }
-        var ret = maybeWrapTypedInterop(blink_jsObject._operator_getter(name));
+        var ret = _operator_getter(name);
         if (matches != null) return ret;
         if (ret is Function ||
             (ret is JsFunction /* shouldn't be needed in the future*/) &&
@@ -1127,7 +1203,7 @@
         throwError();
       } else {
         // TODO(jacobr): should we throw if the JavaScript object doesn't have the property?
-        return maybeWrapTypedInterop(blink_jsObject._operator_getter(name));
+        return _operator_getter(name);
       }
     } else if (invocation.isSetter) {
       if (CHECK_JS_INVOCATIONS) {
@@ -1137,8 +1213,7 @@
       }
       assert(name.endsWith("="));
       name = name.substring(0, name.length - 1);
-      return maybeWrapTypedInterop(blink_jsObject._operator_setter(
-          name, invocation.positionalArguments.first));
+      return _operator_setter(name, invocation.positionalArguments.first);
     } else {
       // TODO(jacobr): also allow calling getters that look like functions.
       var matches;
@@ -1147,8 +1222,7 @@
         if (matches == null ||
             !matches.checkInvocation(invocation)) throwError();
       }
-      var ret = maybeWrapTypedInterop(
-          blink_jsObject._callMethod(name, _buildArgs(invocation)));
+      var ret = _callMethod(name, _buildArgs(invocation));
       if (CHECK_JS_INVOCATIONS) {
         if (!matches._checkReturnType(ret)) {
           html.window.console.error("Return value for method: ${name} is "
@@ -1164,21 +1238,56 @@
 @Deprecated("Internal Use Only")
 class JSArray extends JSObject with ListMixin {
   JSArray.internal() : super.internal();
-  external factory JSArray.create(JsObject jsObject);
-  operator [](int index) =>
-      maybeWrapTypedInterop(JsNative.getArrayIndex(blink_jsObject, index));
+  external static Type get instanceRuntimeType;
 
-  operator []=(int index, value) => blink_jsObject[index] = value;
+  // Reuse JsArray_length as length behavior is unchanged.
+  int get length native "JsArray_length";
 
-  int get length => blink_jsObject.length;
-  set length(int newLength) => blink_jsObject.length = newLength;
+  set length(int length) {
+    _operator_setter('length', length);
+  }
+
+  _checkIndex(int index, {bool insert: false}) {
+    int length = insert ? this.length + 1 : this.length;
+    if (index is int && (index < 0 || index >= length)) {
+      throw new RangeError.range(index, 0, length);
+    }
+  }
+
+  _checkRange(int start, int end) {
+    int cachedLength = this.length;
+    if (start < 0 || start > cachedLength) {
+      throw new RangeError.range(start, 0, cachedLength);
+    }
+    if (end < start || end > cachedLength) {
+      throw new RangeError.range(end, start, cachedLength);
+    }
+  }
+
+  _indexed_getter(int index) native "JSArray_indexed_getter";
+  _indexed_setter(int index, o) native "JSArray_indexed_setter";
+
+  // Methods required by ListMixin
+
+  operator [](index) {
+    if (index is int) {
+      _checkIndex(index);
+    }
+
+    return _indexed_getter(index);
+  }
+
+  void operator []=(int index, value) {
+    _checkIndex(index);
+    _indexed_setter(index, value);
+  }
 }
 
 @Deprecated("Internal Use Only")
 class JSFunction extends JSObject implements Function {
   JSFunction.internal() : super.internal();
 
-  external factory JSFunction.create(JsObject jsObject);
+  external static Type get instanceRuntimeType;
 
   call(
       [a1 = _UNDEFINED,
@@ -1191,48 +1300,49 @@
       a8 = _UNDEFINED,
       a9 = _UNDEFINED,
       a10 = _UNDEFINED]) {
-    return maybeWrapTypedInterop(blink_jsObject
-        .apply(_stripUndefinedArgs([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10])));
+    return _apply(_stripUndefinedArgs([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]));
   }
 
   noSuchMethod(Invocation invocation) {
     if (invocation.isMethod && invocation.memberName == #call) {
-      return maybeWrapTypedInterop(
-          blink_jsObject.apply(_buildArgs(invocation)));
+      return _apply(_buildArgs(invocation));
     }
     return super.noSuchMethod(invocation);
   }
+
+  dynamic _apply(List args, {thisArg}) native "JSFunction_apply";
+
+  static JSFunction _createWithThis(Function f) native "JSFunction_createWithThis";
+  static JSFunction _create(Function f) native "JSFunction_create";
 }
 
 // JavaScript interop methods that do not automatically wrap to dart:html types.
 // Warning: this API is not exposed to dart:js.
+// TODO(jacobr): rename to JSNative and make at least part of this API public.
 @Deprecated("Internal Use Only")
 class JsNative {
-  static getProperty(o, name) {
-    o = unwrap_jso(o);
-    return o != null ? o._operator_getter(name) : null;
-  }
+  static JSObject jsify(object) native "JSObject_jsify";
+  static JSObject newObject() native "JSObject_newObject";
+  static JSArray newArray() native "JSObject_newArray";
 
-  static setProperty(o, name, value) {
-    return unwrap_jso(o)._operator_setter(name, value);
-  }
+  static hasProperty(_JSObjectBase o, name) => o._hasProperty(name);
+  static getProperty(_JSObjectBase o, name) => o._operator_getter(name);
+  static setProperty(_JSObjectBase o, name, value) => o._operator_setter(name, value);
+  static callMethod(_JSObjectBase o, String method, List args) => o._callMethod(method, args);
+  static instanceof(_JSObjectBase o, /*JsFunction|JSFunction*/ type) => o._instanceof(type);
+  static callConstructor0(_JSObjectBase constructor) native "JSNative_callConstructor0";
+  static callConstructor(_JSObjectBase constructor, List args) native "JSNative_callConstructor";
 
-  static callMethod(o, String method, List args) {
-    return unwrap_jso(o)._callMethod(method, args);
-  }
-
-  static getArrayIndex(JsArray array, int index) {
-    array._checkIndex(index);
-    return getProperty(array, index);
-  }
+  static toTypedObject(JsObject o) native "JSNative_toTypedObject";
 
   /**
    * Same behavior as new JsFunction.withThis except that JavaScript "this" is not
    * wrapped.
    */
-  static JsFunction withThis(Function f) native "JsFunction_withThisNoWrap";
+  static JSFunction withThis(Function f) native "JsFunction_withThisNoWrap";
 }
 
+
 /**
  * Proxies a JavaScript Function object.
  */
@@ -1250,7 +1360,7 @@
    * supplied it is the value of `this` for the invocation.
    */
   dynamic apply(List args, {thisArg}) =>
-      _maybeWrap(_apply(args, thisArg: thisArg));
+      _apply(args, thisArg: thisArg);
 
   dynamic _apply(List args, {thisArg}) native "JsFunction_apply";
 
@@ -1402,15 +1512,6 @@
   }
 }
 
-List _stripAndWrapArgs(Iterable args) {
-  var ret = [];
-  for (var arg in args) {
-    if (arg == _UNDEFINED) break;
-    ret.add(maybeWrapTypedInterop(arg));
-  }
-  return ret;
-}
-
 /**
  * Returns a method that can be called with an arbitrary number (for n less
  * than 11) of arguments without violating Dart type checks.
@@ -1429,90 +1530,6 @@
     jsFunction._applyDebuggerOnly(
         _stripUndefinedArgs([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]));
 
-/// This helper is purely a hack so we can reuse JsFunction.withThis even when
-/// we don't care about passing JS "this". In an ideal world we would implement
-/// helpers in C++ that directly implement allowInterop and
-/// allowInteropCaptureThis.
-class _CreateDartFunctionForInteropIgnoreThis implements Function {
-  Function _fn;
-
-  _CreateDartFunctionForInteropIgnoreThis(this._fn);
-
-  call(
-      [ignoredThis = _UNDEFINED,
-      a1 = _UNDEFINED,
-      a2 = _UNDEFINED,
-      a3 = _UNDEFINED,
-      a4 = _UNDEFINED,
-      a5 = _UNDEFINED,
-      a6 = _UNDEFINED,
-      a7 = _UNDEFINED,
-      a8 = _UNDEFINED,
-      a9 = _UNDEFINED,
-      a10 = _UNDEFINED]) {
-    var ret = Function.apply(
-        _fn, _stripAndWrapArgs([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]));
-    safeForTypedInterop(ret);
-    return ret;
-  }
-
-  noSuchMethod(Invocation invocation) {
-    if (invocation.isMethod && invocation.memberName == #call) {
-      // Named arguments not yet supported.
-      if (invocation.namedArguments.isNotEmpty) return;
-      var ret = Function.apply(
-          _fn, _stripAndWrapArgs(invocation.positionalArguments.skip(1)));
-      // TODO(jacobr): it would be nice to check that the return value is safe
-      // for interop but we don't want to break existing addEventListener users.
-      // safeForTypedInterop(ret);
-      safeForTypedInterop(ret);
-      return ret;
-    }
-    return super.noSuchMethod(invocation);
-  }
-}
-
-/// See comment for [_CreateDartFunctionForInteropIgnoreThis].
-/// This Function exists purely because JsObject doesn't have the DOM type
-/// conversion semantics we want for JS typed interop.
-class _CreateDartFunctionForInterop implements Function {
-  Function _fn;
-
-  _CreateDartFunctionForInterop(this._fn);
-
-  call(
-      [a1 = _UNDEFINED,
-      a2 = _UNDEFINED,
-      a3 = _UNDEFINED,
-      a4 = _UNDEFINED,
-      a5 = _UNDEFINED,
-      a6 = _UNDEFINED,
-      a7 = _UNDEFINED,
-      a8 = _UNDEFINED,
-      a9 = _UNDEFINED,
-      a10 = _UNDEFINED]) {
-    var ret = Function.apply(
-        _fn, _stripAndWrapArgs([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]));
-    safeForTypedInterop(ret);
-    return ret;
-  }
-
-  noSuchMethod(Invocation invocation) {
-    if (invocation.isMethod && invocation.memberName == #call) {
-      // Named arguments not yet supported.
-      if (invocation.namedArguments.isNotEmpty) return;
-      var ret = Function.apply(
-          _fn, _stripAndWrapArgs(invocation.positionalArguments));
-      safeForTypedInterop(ret);
-      return ret;
-    }
-    return super.noSuchMethod(invocation);
-  }
-}
-
-/// Cached JSFunction associated with the Dart Function.
-Expando<JSFunction> _interopExpando = new Expando<JSFunction>();
-
 /// Returns a wrapper around function [f] that can be called from JavaScript
 /// using the package:js Dart-JavaScript interop.
 ///
@@ -1529,14 +1546,7 @@
     // The function is already a JSFunction... no need to do anything.
     return f;
   } else {
-    var ret = _interopExpando[f];
-    if (ret == null) {
-      // TODO(jacobr): we could optimize this.
-      ret = new JSFunction.create(new JsFunction.withThis(
-          new _CreateDartFunctionForInteropIgnoreThis(f)));
-      _interopExpando[f] = ret;
-    }
-    return ret;
+    return JSFunction._create(f);
   }
 }
 
@@ -1560,10 +1570,11 @@
     var ret = _interopCaptureThisExpando[f];
     if (ret == null) {
       // TODO(jacobr): we could optimize this.
-      ret = new JSFunction.create(
-          new JsFunction.withThis(new _CreateDartFunctionForInterop(f)));
+      ret = JSFunction._createWithThis(f);
       _interopCaptureThisExpando[f] = ret;
     }
     return ret;
   }
 }
+
+debugPrint(_) {}
\ No newline at end of file
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 1e7f276..72bce94 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -26,261 +26,133 @@
 // FIXME: Can we make this private?
 @Deprecated("Internal Use Only")
 final svgBlinkMap = {
-  'SVGAElement': () => AElement,
-  'SVGAngle': () => Angle,
-  'SVGAnimateElement': () => AnimateElement,
-  'SVGAnimateMotionElement': () => AnimateMotionElement,
-  'SVGAnimateTransformElement': () => AnimateTransformElement,
-  'SVGAnimatedAngle': () => AnimatedAngle,
-  'SVGAnimatedBoolean': () => AnimatedBoolean,
-  'SVGAnimatedEnumeration': () => AnimatedEnumeration,
-  'SVGAnimatedInteger': () => AnimatedInteger,
-  'SVGAnimatedLength': () => AnimatedLength,
-  'SVGAnimatedLengthList': () => AnimatedLengthList,
-  'SVGAnimatedNumber': () => AnimatedNumber,
-  'SVGAnimatedNumberList': () => AnimatedNumberList,
-  'SVGAnimatedPreserveAspectRatio': () => AnimatedPreserveAspectRatio,
-  'SVGAnimatedRect': () => AnimatedRect,
-  'SVGAnimatedString': () => AnimatedString,
-  'SVGAnimatedTransformList': () => AnimatedTransformList,
-  'SVGAnimationElement': () => AnimationElement,
-  'SVGCircleElement': () => CircleElement,
-  'SVGClipPathElement': () => ClipPathElement,
-  'SVGComponentTransferFunctionElement': () => _SVGComponentTransferFunctionElement,
-  'SVGCursorElement': () => _SVGCursorElement,
-  'SVGDefsElement': () => DefsElement,
-  'SVGDescElement': () => DescElement,
-  'SVGDiscardElement': () => DiscardElement,
-  'SVGElement': () => SvgElement,
-  'SVGEllipseElement': () => EllipseElement,
-  'SVGFEBlendElement': () => FEBlendElement,
-  'SVGFEColorMatrixElement': () => FEColorMatrixElement,
-  'SVGFEComponentTransferElement': () => FEComponentTransferElement,
-  'SVGFECompositeElement': () => FECompositeElement,
-  'SVGFEConvolveMatrixElement': () => FEConvolveMatrixElement,
-  'SVGFEDiffuseLightingElement': () => FEDiffuseLightingElement,
-  'SVGFEDisplacementMapElement': () => FEDisplacementMapElement,
-  'SVGFEDistantLightElement': () => FEDistantLightElement,
-  'SVGFEDropShadowElement': () => _SVGFEDropShadowElement,
-  'SVGFEFloodElement': () => FEFloodElement,
-  'SVGFEFuncAElement': () => FEFuncAElement,
-  'SVGFEFuncBElement': () => FEFuncBElement,
-  'SVGFEFuncGElement': () => FEFuncGElement,
-  'SVGFEFuncRElement': () => FEFuncRElement,
-  'SVGFEGaussianBlurElement': () => FEGaussianBlurElement,
-  'SVGFEImageElement': () => FEImageElement,
-  'SVGFEMergeElement': () => FEMergeElement,
-  'SVGFEMergeNodeElement': () => FEMergeNodeElement,
-  'SVGFEMorphologyElement': () => FEMorphologyElement,
-  'SVGFEOffsetElement': () => FEOffsetElement,
-  'SVGFEPointLightElement': () => FEPointLightElement,
-  'SVGFESpecularLightingElement': () => FESpecularLightingElement,
-  'SVGFESpotLightElement': () => FESpotLightElement,
-  'SVGFETileElement': () => FETileElement,
-  'SVGFETurbulenceElement': () => FETurbulenceElement,
-  'SVGFilterElement': () => FilterElement,
-  'SVGFilterPrimitiveStandardAttributes': () => FilterPrimitiveStandardAttributes,
-  'SVGFitToViewBox': () => FitToViewBox,
-  'SVGForeignObjectElement': () => ForeignObjectElement,
-  'SVGGElement': () => GElement,
-  'SVGGeometryElement': () => GeometryElement,
-  'SVGGradientElement': () => _GradientElement,
-  'SVGGraphicsElement': () => GraphicsElement,
-  'SVGImageElement': () => ImageElement,
-  'SVGLength': () => Length,
-  'SVGLengthList': () => LengthList,
-  'SVGLineElement': () => LineElement,
-  'SVGLinearGradientElement': () => LinearGradientElement,
-  'SVGMPathElement': () => _SVGMPathElement,
-  'SVGMarkerElement': () => MarkerElement,
-  'SVGMaskElement': () => MaskElement,
-  'SVGMatrix': () => Matrix,
-  'SVGMetadataElement': () => MetadataElement,
-  'SVGNumber': () => Number,
-  'SVGNumberList': () => NumberList,
-  'SVGPathElement': () => PathElement,
-  'SVGPathSeg': () => PathSeg,
-  'SVGPathSegArcAbs': () => PathSegArcAbs,
-  'SVGPathSegArcRel': () => PathSegArcRel,
-  'SVGPathSegClosePath': () => PathSegClosePath,
-  'SVGPathSegCurvetoCubicAbs': () => PathSegCurvetoCubicAbs,
-  'SVGPathSegCurvetoCubicRel': () => PathSegCurvetoCubicRel,
-  'SVGPathSegCurvetoCubicSmoothAbs': () => PathSegCurvetoCubicSmoothAbs,
-  'SVGPathSegCurvetoCubicSmoothRel': () => PathSegCurvetoCubicSmoothRel,
-  'SVGPathSegCurvetoQuadraticAbs': () => PathSegCurvetoQuadraticAbs,
-  'SVGPathSegCurvetoQuadraticRel': () => PathSegCurvetoQuadraticRel,
-  'SVGPathSegCurvetoQuadraticSmoothAbs': () => PathSegCurvetoQuadraticSmoothAbs,
-  'SVGPathSegCurvetoQuadraticSmoothRel': () => PathSegCurvetoQuadraticSmoothRel,
-  'SVGPathSegLinetoAbs': () => PathSegLinetoAbs,
-  'SVGPathSegLinetoHorizontalAbs': () => PathSegLinetoHorizontalAbs,
-  'SVGPathSegLinetoHorizontalRel': () => PathSegLinetoHorizontalRel,
-  'SVGPathSegLinetoRel': () => PathSegLinetoRel,
-  'SVGPathSegLinetoVerticalAbs': () => PathSegLinetoVerticalAbs,
-  'SVGPathSegLinetoVerticalRel': () => PathSegLinetoVerticalRel,
-  'SVGPathSegList': () => PathSegList,
-  'SVGPathSegMovetoAbs': () => PathSegMovetoAbs,
-  'SVGPathSegMovetoRel': () => PathSegMovetoRel,
-  'SVGPatternElement': () => PatternElement,
-  'SVGPoint': () => Point,
-  'SVGPointList': () => PointList,
-  'SVGPolygonElement': () => PolygonElement,
-  'SVGPolylineElement': () => PolylineElement,
-  'SVGPreserveAspectRatio': () => PreserveAspectRatio,
-  'SVGRadialGradientElement': () => RadialGradientElement,
-  'SVGRect': () => Rect,
-  'SVGRectElement': () => RectElement,
-  'SVGSVGElement': () => SvgSvgElement,
-  'SVGScriptElement': () => ScriptElement,
-  'SVGSetElement': () => SetElement,
-  'SVGStopElement': () => StopElement,
-  'SVGStringList': () => StringList,
-  'SVGStyleElement': () => StyleElement,
-  'SVGSwitchElement': () => SwitchElement,
-  'SVGSymbolElement': () => SymbolElement,
-  'SVGTSpanElement': () => TSpanElement,
-  'SVGTests': () => Tests,
-  'SVGTextContentElement': () => TextContentElement,
-  'SVGTextElement': () => TextElement,
-  'SVGTextPathElement': () => TextPathElement,
-  'SVGTextPositioningElement': () => TextPositioningElement,
-  'SVGTitleElement': () => TitleElement,
-  'SVGTransform': () => Transform,
-  'SVGTransformList': () => TransformList,
-  'SVGURIReference': () => UriReference,
-  'SVGUnitTypes': () => UnitTypes,
-  'SVGUseElement': () => UseElement,
-  'SVGViewElement': () => ViewElement,
-  'SVGViewSpec': () => ViewSpec,
-  'SVGZoomAndPan': () => ZoomAndPan,
-  'SVGZoomEvent': () => ZoomEvent,
-
-};
-
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final svgBlinkFunctionMap = {
-  'SVGAElement': () => AElement.internalCreateAElement,
-  'SVGAngle': () => Angle.internalCreateAngle,
-  'SVGAnimateElement': () => AnimateElement.internalCreateAnimateElement,
-  'SVGAnimateMotionElement': () => AnimateMotionElement.internalCreateAnimateMotionElement,
-  'SVGAnimateTransformElement': () => AnimateTransformElement.internalCreateAnimateTransformElement,
-  'SVGAnimatedAngle': () => AnimatedAngle.internalCreateAnimatedAngle,
-  'SVGAnimatedBoolean': () => AnimatedBoolean.internalCreateAnimatedBoolean,
-  'SVGAnimatedEnumeration': () => AnimatedEnumeration.internalCreateAnimatedEnumeration,
-  'SVGAnimatedInteger': () => AnimatedInteger.internalCreateAnimatedInteger,
-  'SVGAnimatedLength': () => AnimatedLength.internalCreateAnimatedLength,
-  'SVGAnimatedLengthList': () => AnimatedLengthList.internalCreateAnimatedLengthList,
-  'SVGAnimatedNumber': () => AnimatedNumber.internalCreateAnimatedNumber,
-  'SVGAnimatedNumberList': () => AnimatedNumberList.internalCreateAnimatedNumberList,
-  'SVGAnimatedPreserveAspectRatio': () => AnimatedPreserveAspectRatio.internalCreateAnimatedPreserveAspectRatio,
-  'SVGAnimatedRect': () => AnimatedRect.internalCreateAnimatedRect,
-  'SVGAnimatedString': () => AnimatedString.internalCreateAnimatedString,
-  'SVGAnimatedTransformList': () => AnimatedTransformList.internalCreateAnimatedTransformList,
-  'SVGAnimationElement': () => AnimationElement.internalCreateAnimationElement,
-  'SVGCircleElement': () => CircleElement.internalCreateCircleElement,
-  'SVGClipPathElement': () => ClipPathElement.internalCreateClipPathElement,
-  'SVGComponentTransferFunctionElement': () => _SVGComponentTransferFunctionElement.internalCreate_SVGComponentTransferFunctionElement,
-  'SVGCursorElement': () => _SVGCursorElement.internalCreate_SVGCursorElement,
-  'SVGDefsElement': () => DefsElement.internalCreateDefsElement,
-  'SVGDescElement': () => DescElement.internalCreateDescElement,
-  'SVGDiscardElement': () => DiscardElement.internalCreateDiscardElement,
-  'SVGElement': () => SvgElement.internalCreateSvgElement,
-  'SVGEllipseElement': () => EllipseElement.internalCreateEllipseElement,
-  'SVGFEBlendElement': () => FEBlendElement.internalCreateFEBlendElement,
-  'SVGFEColorMatrixElement': () => FEColorMatrixElement.internalCreateFEColorMatrixElement,
-  'SVGFEComponentTransferElement': () => FEComponentTransferElement.internalCreateFEComponentTransferElement,
-  'SVGFECompositeElement': () => FECompositeElement.internalCreateFECompositeElement,
-  'SVGFEConvolveMatrixElement': () => FEConvolveMatrixElement.internalCreateFEConvolveMatrixElement,
-  'SVGFEDiffuseLightingElement': () => FEDiffuseLightingElement.internalCreateFEDiffuseLightingElement,
-  'SVGFEDisplacementMapElement': () => FEDisplacementMapElement.internalCreateFEDisplacementMapElement,
-  'SVGFEDistantLightElement': () => FEDistantLightElement.internalCreateFEDistantLightElement,
-  'SVGFEDropShadowElement': () => _SVGFEDropShadowElement.internalCreate_SVGFEDropShadowElement,
-  'SVGFEFloodElement': () => FEFloodElement.internalCreateFEFloodElement,
-  'SVGFEFuncAElement': () => FEFuncAElement.internalCreateFEFuncAElement,
-  'SVGFEFuncBElement': () => FEFuncBElement.internalCreateFEFuncBElement,
-  'SVGFEFuncGElement': () => FEFuncGElement.internalCreateFEFuncGElement,
-  'SVGFEFuncRElement': () => FEFuncRElement.internalCreateFEFuncRElement,
-  'SVGFEGaussianBlurElement': () => FEGaussianBlurElement.internalCreateFEGaussianBlurElement,
-  'SVGFEImageElement': () => FEImageElement.internalCreateFEImageElement,
-  'SVGFEMergeElement': () => FEMergeElement.internalCreateFEMergeElement,
-  'SVGFEMergeNodeElement': () => FEMergeNodeElement.internalCreateFEMergeNodeElement,
-  'SVGFEMorphologyElement': () => FEMorphologyElement.internalCreateFEMorphologyElement,
-  'SVGFEOffsetElement': () => FEOffsetElement.internalCreateFEOffsetElement,
-  'SVGFEPointLightElement': () => FEPointLightElement.internalCreateFEPointLightElement,
-  'SVGFESpecularLightingElement': () => FESpecularLightingElement.internalCreateFESpecularLightingElement,
-  'SVGFESpotLightElement': () => FESpotLightElement.internalCreateFESpotLightElement,
-  'SVGFETileElement': () => FETileElement.internalCreateFETileElement,
-  'SVGFETurbulenceElement': () => FETurbulenceElement.internalCreateFETurbulenceElement,
-  'SVGFilterElement': () => FilterElement.internalCreateFilterElement,
-  'SVGForeignObjectElement': () => ForeignObjectElement.internalCreateForeignObjectElement,
-  'SVGGElement': () => GElement.internalCreateGElement,
-  'SVGGeometryElement': () => GeometryElement.internalCreateGeometryElement,
-  'SVGGradientElement': () => _GradientElement.internalCreate_GradientElement,
-  'SVGGraphicsElement': () => GraphicsElement.internalCreateGraphicsElement,
-  'SVGImageElement': () => ImageElement.internalCreateImageElement,
-  'SVGLength': () => Length.internalCreateLength,
-  'SVGLengthList': () => LengthList.internalCreateLengthList,
-  'SVGLineElement': () => LineElement.internalCreateLineElement,
-  'SVGLinearGradientElement': () => LinearGradientElement.internalCreateLinearGradientElement,
-  'SVGMPathElement': () => _SVGMPathElement.internalCreate_SVGMPathElement,
-  'SVGMarkerElement': () => MarkerElement.internalCreateMarkerElement,
-  'SVGMaskElement': () => MaskElement.internalCreateMaskElement,
-  'SVGMatrix': () => Matrix.internalCreateMatrix,
-  'SVGMetadataElement': () => MetadataElement.internalCreateMetadataElement,
-  'SVGNumber': () => Number.internalCreateNumber,
-  'SVGNumberList': () => NumberList.internalCreateNumberList,
-  'SVGPathElement': () => PathElement.internalCreatePathElement,
-  'SVGPathSeg': () => PathSeg.internalCreatePathSeg,
-  'SVGPathSegArcAbs': () => PathSegArcAbs.internalCreatePathSegArcAbs,
-  'SVGPathSegArcRel': () => PathSegArcRel.internalCreatePathSegArcRel,
-  'SVGPathSegClosePath': () => PathSegClosePath.internalCreatePathSegClosePath,
-  'SVGPathSegCurvetoCubicAbs': () => PathSegCurvetoCubicAbs.internalCreatePathSegCurvetoCubicAbs,
-  'SVGPathSegCurvetoCubicRel': () => PathSegCurvetoCubicRel.internalCreatePathSegCurvetoCubicRel,
-  'SVGPathSegCurvetoCubicSmoothAbs': () => PathSegCurvetoCubicSmoothAbs.internalCreatePathSegCurvetoCubicSmoothAbs,
-  'SVGPathSegCurvetoCubicSmoothRel': () => PathSegCurvetoCubicSmoothRel.internalCreatePathSegCurvetoCubicSmoothRel,
-  'SVGPathSegCurvetoQuadraticAbs': () => PathSegCurvetoQuadraticAbs.internalCreatePathSegCurvetoQuadraticAbs,
-  'SVGPathSegCurvetoQuadraticRel': () => PathSegCurvetoQuadraticRel.internalCreatePathSegCurvetoQuadraticRel,
-  'SVGPathSegCurvetoQuadraticSmoothAbs': () => PathSegCurvetoQuadraticSmoothAbs.internalCreatePathSegCurvetoQuadraticSmoothAbs,
-  'SVGPathSegCurvetoQuadraticSmoothRel': () => PathSegCurvetoQuadraticSmoothRel.internalCreatePathSegCurvetoQuadraticSmoothRel,
-  'SVGPathSegLinetoAbs': () => PathSegLinetoAbs.internalCreatePathSegLinetoAbs,
-  'SVGPathSegLinetoHorizontalAbs': () => PathSegLinetoHorizontalAbs.internalCreatePathSegLinetoHorizontalAbs,
-  'SVGPathSegLinetoHorizontalRel': () => PathSegLinetoHorizontalRel.internalCreatePathSegLinetoHorizontalRel,
-  'SVGPathSegLinetoRel': () => PathSegLinetoRel.internalCreatePathSegLinetoRel,
-  'SVGPathSegLinetoVerticalAbs': () => PathSegLinetoVerticalAbs.internalCreatePathSegLinetoVerticalAbs,
-  'SVGPathSegLinetoVerticalRel': () => PathSegLinetoVerticalRel.internalCreatePathSegLinetoVerticalRel,
-  'SVGPathSegList': () => PathSegList.internalCreatePathSegList,
-  'SVGPathSegMovetoAbs': () => PathSegMovetoAbs.internalCreatePathSegMovetoAbs,
-  'SVGPathSegMovetoRel': () => PathSegMovetoRel.internalCreatePathSegMovetoRel,
-  'SVGPatternElement': () => PatternElement.internalCreatePatternElement,
-  'SVGPoint': () => Point.internalCreatePoint,
-  'SVGPointList': () => PointList.internalCreatePointList,
-  'SVGPolygonElement': () => PolygonElement.internalCreatePolygonElement,
-  'SVGPolylineElement': () => PolylineElement.internalCreatePolylineElement,
-  'SVGPreserveAspectRatio': () => PreserveAspectRatio.internalCreatePreserveAspectRatio,
-  'SVGRadialGradientElement': () => RadialGradientElement.internalCreateRadialGradientElement,
-  'SVGRect': () => Rect.internalCreateRect,
-  'SVGRectElement': () => RectElement.internalCreateRectElement,
-  'SVGSVGElement': () => SvgSvgElement.internalCreateSvgSvgElement,
-  'SVGScriptElement': () => ScriptElement.internalCreateScriptElement,
-  'SVGSetElement': () => SetElement.internalCreateSetElement,
-  'SVGStopElement': () => StopElement.internalCreateStopElement,
-  'SVGStringList': () => StringList.internalCreateStringList,
-  'SVGStyleElement': () => StyleElement.internalCreateStyleElement,
-  'SVGSwitchElement': () => SwitchElement.internalCreateSwitchElement,
-  'SVGSymbolElement': () => SymbolElement.internalCreateSymbolElement,
-  'SVGTSpanElement': () => TSpanElement.internalCreateTSpanElement,
-  'SVGTextContentElement': () => TextContentElement.internalCreateTextContentElement,
-  'SVGTextElement': () => TextElement.internalCreateTextElement,
-  'SVGTextPathElement': () => TextPathElement.internalCreateTextPathElement,
-  'SVGTextPositioningElement': () => TextPositioningElement.internalCreateTextPositioningElement,
-  'SVGTitleElement': () => TitleElement.internalCreateTitleElement,
-  'SVGTransform': () => Transform.internalCreateTransform,
-  'SVGTransformList': () => TransformList.internalCreateTransformList,
-  'SVGUnitTypes': () => UnitTypes.internalCreateUnitTypes,
-  'SVGUseElement': () => UseElement.internalCreateUseElement,
-  'SVGViewElement': () => ViewElement.internalCreateViewElement,
-  'SVGViewSpec': () => ViewSpec.internalCreateViewSpec,
-  'SVGZoomEvent': () => ZoomEvent.internalCreateZoomEvent,
+  'SVGAElement': () => AElement.instanceRuntimeType,
+  'SVGAngle': () => Angle.instanceRuntimeType,
+  'SVGAnimateElement': () => AnimateElement.instanceRuntimeType,
+  'SVGAnimateMotionElement': () => AnimateMotionElement.instanceRuntimeType,
+  'SVGAnimateTransformElement': () => AnimateTransformElement.instanceRuntimeType,
+  'SVGAnimatedAngle': () => AnimatedAngle.instanceRuntimeType,
+  'SVGAnimatedBoolean': () => AnimatedBoolean.instanceRuntimeType,
+  'SVGAnimatedEnumeration': () => AnimatedEnumeration.instanceRuntimeType,
+  'SVGAnimatedInteger': () => AnimatedInteger.instanceRuntimeType,
+  'SVGAnimatedLength': () => AnimatedLength.instanceRuntimeType,
+  'SVGAnimatedLengthList': () => AnimatedLengthList.instanceRuntimeType,
+  'SVGAnimatedNumber': () => AnimatedNumber.instanceRuntimeType,
+  'SVGAnimatedNumberList': () => AnimatedNumberList.instanceRuntimeType,
+  'SVGAnimatedPreserveAspectRatio': () => AnimatedPreserveAspectRatio.instanceRuntimeType,
+  'SVGAnimatedRect': () => AnimatedRect.instanceRuntimeType,
+  'SVGAnimatedString': () => AnimatedString.instanceRuntimeType,
+  'SVGAnimatedTransformList': () => AnimatedTransformList.instanceRuntimeType,
+  'SVGAnimationElement': () => AnimationElement.instanceRuntimeType,
+  'SVGCircleElement': () => CircleElement.instanceRuntimeType,
+  'SVGClipPathElement': () => ClipPathElement.instanceRuntimeType,
+  'SVGComponentTransferFunctionElement': () => _SVGComponentTransferFunctionElement.instanceRuntimeType,
+  'SVGCursorElement': () => _SVGCursorElement.instanceRuntimeType,
+  'SVGDefsElement': () => DefsElement.instanceRuntimeType,
+  'SVGDescElement': () => DescElement.instanceRuntimeType,
+  'SVGDiscardElement': () => DiscardElement.instanceRuntimeType,
+  'SVGElement': () => SvgElement.instanceRuntimeType,
+  'SVGEllipseElement': () => EllipseElement.instanceRuntimeType,
+  'SVGFEBlendElement': () => FEBlendElement.instanceRuntimeType,
+  'SVGFEColorMatrixElement': () => FEColorMatrixElement.instanceRuntimeType,
+  'SVGFEComponentTransferElement': () => FEComponentTransferElement.instanceRuntimeType,
+  'SVGFECompositeElement': () => FECompositeElement.instanceRuntimeType,
+  'SVGFEConvolveMatrixElement': () => FEConvolveMatrixElement.instanceRuntimeType,
+  'SVGFEDiffuseLightingElement': () => FEDiffuseLightingElement.instanceRuntimeType,
+  'SVGFEDisplacementMapElement': () => FEDisplacementMapElement.instanceRuntimeType,
+  'SVGFEDistantLightElement': () => FEDistantLightElement.instanceRuntimeType,
+  'SVGFEDropShadowElement': () => _SVGFEDropShadowElement.instanceRuntimeType,
+  'SVGFEFloodElement': () => FEFloodElement.instanceRuntimeType,
+  'SVGFEFuncAElement': () => FEFuncAElement.instanceRuntimeType,
+  'SVGFEFuncBElement': () => FEFuncBElement.instanceRuntimeType,
+  'SVGFEFuncGElement': () => FEFuncGElement.instanceRuntimeType,
+  'SVGFEFuncRElement': () => FEFuncRElement.instanceRuntimeType,
+  'SVGFEGaussianBlurElement': () => FEGaussianBlurElement.instanceRuntimeType,
+  'SVGFEImageElement': () => FEImageElement.instanceRuntimeType,
+  'SVGFEMergeElement': () => FEMergeElement.instanceRuntimeType,
+  'SVGFEMergeNodeElement': () => FEMergeNodeElement.instanceRuntimeType,
+  'SVGFEMorphologyElement': () => FEMorphologyElement.instanceRuntimeType,
+  'SVGFEOffsetElement': () => FEOffsetElement.instanceRuntimeType,
+  'SVGFEPointLightElement': () => FEPointLightElement.instanceRuntimeType,
+  'SVGFESpecularLightingElement': () => FESpecularLightingElement.instanceRuntimeType,
+  'SVGFESpotLightElement': () => FESpotLightElement.instanceRuntimeType,
+  'SVGFETileElement': () => FETileElement.instanceRuntimeType,
+  'SVGFETurbulenceElement': () => FETurbulenceElement.instanceRuntimeType,
+  'SVGFilterElement': () => FilterElement.instanceRuntimeType,
+  'SVGFilterPrimitiveStandardAttributes': () => FilterPrimitiveStandardAttributes.instanceRuntimeType,
+  'SVGFitToViewBox': () => FitToViewBox.instanceRuntimeType,
+  'SVGForeignObjectElement': () => ForeignObjectElement.instanceRuntimeType,
+  'SVGGElement': () => GElement.instanceRuntimeType,
+  'SVGGeometryElement': () => GeometryElement.instanceRuntimeType,
+  'SVGGradientElement': () => _GradientElement.instanceRuntimeType,
+  'SVGGraphicsElement': () => GraphicsElement.instanceRuntimeType,
+  'SVGImageElement': () => ImageElement.instanceRuntimeType,
+  'SVGLength': () => Length.instanceRuntimeType,
+  'SVGLengthList': () => LengthList.instanceRuntimeType,
+  'SVGLineElement': () => LineElement.instanceRuntimeType,
+  'SVGLinearGradientElement': () => LinearGradientElement.instanceRuntimeType,
+  'SVGMPathElement': () => _SVGMPathElement.instanceRuntimeType,
+  'SVGMarkerElement': () => MarkerElement.instanceRuntimeType,
+  'SVGMaskElement': () => MaskElement.instanceRuntimeType,
+  'SVGMatrix': () => Matrix.instanceRuntimeType,
+  'SVGMetadataElement': () => MetadataElement.instanceRuntimeType,
+  'SVGNumber': () => Number.instanceRuntimeType,
+  'SVGNumberList': () => NumberList.instanceRuntimeType,
+  'SVGPathElement': () => PathElement.instanceRuntimeType,
+  'SVGPathSeg': () => PathSeg.instanceRuntimeType,
+  'SVGPathSegArcAbs': () => PathSegArcAbs.instanceRuntimeType,
+  'SVGPathSegArcRel': () => PathSegArcRel.instanceRuntimeType,
+  'SVGPathSegClosePath': () => PathSegClosePath.instanceRuntimeType,
+  'SVGPathSegCurvetoCubicAbs': () => PathSegCurvetoCubicAbs.instanceRuntimeType,
+  'SVGPathSegCurvetoCubicRel': () => PathSegCurvetoCubicRel.instanceRuntimeType,
+  'SVGPathSegCurvetoCubicSmoothAbs': () => PathSegCurvetoCubicSmoothAbs.instanceRuntimeType,
+  'SVGPathSegCurvetoCubicSmoothRel': () => PathSegCurvetoCubicSmoothRel.instanceRuntimeType,
+  'SVGPathSegCurvetoQuadraticAbs': () => PathSegCurvetoQuadraticAbs.instanceRuntimeType,
+  'SVGPathSegCurvetoQuadraticRel': () => PathSegCurvetoQuadraticRel.instanceRuntimeType,
+  'SVGPathSegCurvetoQuadraticSmoothAbs': () => PathSegCurvetoQuadraticSmoothAbs.instanceRuntimeType,
+  'SVGPathSegCurvetoQuadraticSmoothRel': () => PathSegCurvetoQuadraticSmoothRel.instanceRuntimeType,
+  'SVGPathSegLinetoAbs': () => PathSegLinetoAbs.instanceRuntimeType,
+  'SVGPathSegLinetoHorizontalAbs': () => PathSegLinetoHorizontalAbs.instanceRuntimeType,
+  'SVGPathSegLinetoHorizontalRel': () => PathSegLinetoHorizontalRel.instanceRuntimeType,
+  'SVGPathSegLinetoRel': () => PathSegLinetoRel.instanceRuntimeType,
+  'SVGPathSegLinetoVerticalAbs': () => PathSegLinetoVerticalAbs.instanceRuntimeType,
+  'SVGPathSegLinetoVerticalRel': () => PathSegLinetoVerticalRel.instanceRuntimeType,
+  'SVGPathSegList': () => PathSegList.instanceRuntimeType,
+  'SVGPathSegMovetoAbs': () => PathSegMovetoAbs.instanceRuntimeType,
+  'SVGPathSegMovetoRel': () => PathSegMovetoRel.instanceRuntimeType,
+  'SVGPatternElement': () => PatternElement.instanceRuntimeType,
+  'SVGPoint': () => Point.instanceRuntimeType,
+  'SVGPointList': () => PointList.instanceRuntimeType,
+  'SVGPolygonElement': () => PolygonElement.instanceRuntimeType,
+  'SVGPolylineElement': () => PolylineElement.instanceRuntimeType,
+  'SVGPreserveAspectRatio': () => PreserveAspectRatio.instanceRuntimeType,
+  'SVGRadialGradientElement': () => RadialGradientElement.instanceRuntimeType,
+  'SVGRect': () => Rect.instanceRuntimeType,
+  'SVGRectElement': () => RectElement.instanceRuntimeType,
+  'SVGSVGElement': () => SvgSvgElement.instanceRuntimeType,
+  'SVGScriptElement': () => ScriptElement.instanceRuntimeType,
+  'SVGSetElement': () => SetElement.instanceRuntimeType,
+  'SVGStopElement': () => StopElement.instanceRuntimeType,
+  'SVGStringList': () => StringList.instanceRuntimeType,
+  'SVGStyleElement': () => StyleElement.instanceRuntimeType,
+  'SVGSwitchElement': () => SwitchElement.instanceRuntimeType,
+  'SVGSymbolElement': () => SymbolElement.instanceRuntimeType,
+  'SVGTSpanElement': () => TSpanElement.instanceRuntimeType,
+  'SVGTests': () => Tests.instanceRuntimeType,
+  'SVGTextContentElement': () => TextContentElement.instanceRuntimeType,
+  'SVGTextElement': () => TextElement.instanceRuntimeType,
+  'SVGTextPathElement': () => TextPathElement.instanceRuntimeType,
+  'SVGTextPositioningElement': () => TextPositioningElement.instanceRuntimeType,
+  'SVGTitleElement': () => TitleElement.instanceRuntimeType,
+  'SVGTransform': () => Transform.instanceRuntimeType,
+  'SVGTransformList': () => TransformList.instanceRuntimeType,
+  'SVGURIReference': () => UriReference.instanceRuntimeType,
+  'SVGUnitTypes': () => UnitTypes.instanceRuntimeType,
+  'SVGUseElement': () => UseElement.instanceRuntimeType,
+  'SVGViewElement': () => ViewElement.instanceRuntimeType,
+  'SVGViewSpec': () => ViewSpec.instanceRuntimeType,
+  'SVGZoomAndPan': () => ZoomAndPan.instanceRuntimeType,
+  'SVGZoomEvent': () => ZoomEvent.instanceRuntimeType,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -315,11 +187,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AElement internalCreateAElement() {
-    return new AElement._internalWrap();
-  }
-
-  external factory AElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AElement.internal_() : super.internal_();
@@ -333,11 +201,11 @@
 
   @DomName('SVGAElement.target')
   @DocsEditable()
-  AnimatedString get target => wrap_jso(_blink.BlinkSVGAElement.instance.target_Getter_(unwrap_jso(this)));
+  AnimatedString get target => _blink.BlinkSVGAElement.instance.target_Getter_(this);
   
   @DomName('SVGAElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGAElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGAElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -354,21 +222,13 @@
   // To suppress missing implicit constructor warnings.
   factory Angle._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Angle internalCreateAngle() {
-    return new Angle._internalWrap();
-  }
 
-  factory Angle._internalWrap() {
-    return new Angle.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Angle.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAngle.SVG_ANGLETYPE_DEG')
   @DocsEditable()
   static const int SVG_ANGLETYPE_DEG = 2;
@@ -391,39 +251,39 @@
 
   @DomName('SVGAngle.unitType')
   @DocsEditable()
-  int get unitType => _blink.BlinkSVGAngle.instance.unitType_Getter_(unwrap_jso(this));
+  int get unitType => _blink.BlinkSVGAngle.instance.unitType_Getter_(this);
   
   @DomName('SVGAngle.value')
   @DocsEditable()
-  num get value => _blink.BlinkSVGAngle.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkSVGAngle.instance.value_Getter_(this);
   
   @DomName('SVGAngle.value')
   @DocsEditable()
-  set value(num value) => _blink.BlinkSVGAngle.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkSVGAngle.instance.value_Setter_(this, value);
   
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.BlinkSVGAngle.instance.valueAsString_Getter_(unwrap_jso(this));
+  String get valueAsString => _blink.BlinkSVGAngle.instance.valueAsString_Getter_(this);
   
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  set valueAsString(String value) => _blink.BlinkSVGAngle.instance.valueAsString_Setter_(unwrap_jso(this), value);
+  set valueAsString(String value) => _blink.BlinkSVGAngle.instance.valueAsString_Setter_(this, value);
   
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Getter_(unwrap_jso(this));
+  num get valueInSpecifiedUnits => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Getter_(this);
   
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Setter_(unwrap_jso(this), value);
+  set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Setter_(this, value);
   
   @DomName('SVGAngle.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGAngle.instance.convertToSpecifiedUnits_Callback_1_(unwrap_jso(this), unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGAngle.instance.convertToSpecifiedUnits_Callback_1_(this, unitType);
   
   @DomName('SVGAngle.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGAngle.instance.newValueSpecifiedUnits_Callback_2_(unwrap_jso(this), unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGAngle.instance.newValueSpecifiedUnits_Callback_2_(this, unitType, valueInSpecifiedUnits);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -449,11 +309,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AnimateElement internalCreateAnimateElement() {
-    return new AnimateElement._internalWrap();
-  }
-
-  external factory AnimateElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimateElement.internal_() : super.internal_();
@@ -492,11 +348,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AnimateMotionElement internalCreateAnimateMotionElement() {
-    return new AnimateMotionElement._internalWrap();
-  }
-
-  external factory AnimateMotionElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimateMotionElement.internal_() : super.internal_();
@@ -535,11 +387,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AnimateTransformElement internalCreateAnimateTransformElement() {
-    return new AnimateTransformElement._internalWrap();
-  }
-
-  external factory AnimateTransformElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimateTransformElement.internal_() : super.internal_();
@@ -569,28 +417,20 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedAngle._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedAngle internalCreateAnimatedAngle() {
-    return new AnimatedAngle._internalWrap();
-  }
 
-  factory AnimatedAngle._internalWrap() {
-    return new AnimatedAngle.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedAngle.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedAngle.animVal')
   @DocsEditable()
-  Angle get animVal => wrap_jso(_blink.BlinkSVGAnimatedAngle.instance.animVal_Getter_(unwrap_jso(this)));
+  Angle get animVal => _blink.BlinkSVGAnimatedAngle.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedAngle.baseVal')
   @DocsEditable()
-  Angle get baseVal => wrap_jso(_blink.BlinkSVGAnimatedAngle.instance.baseVal_Getter_(unwrap_jso(this)));
+  Angle get baseVal => _blink.BlinkSVGAnimatedAngle.instance.baseVal_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -607,32 +447,24 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedBoolean._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedBoolean internalCreateAnimatedBoolean() {
-    return new AnimatedBoolean._internalWrap();
-  }
 
-  factory AnimatedBoolean._internalWrap() {
-    return new AnimatedBoolean.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedBoolean.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedBoolean.animVal')
   @DocsEditable()
-  bool get animVal => _blink.BlinkSVGAnimatedBoolean.instance.animVal_Getter_(unwrap_jso(this));
+  bool get animVal => _blink.BlinkSVGAnimatedBoolean.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  bool get baseVal => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Getter_(unwrap_jso(this));
+  bool get baseVal => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Getter_(this);
   
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -649,32 +481,24 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedEnumeration._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedEnumeration internalCreateAnimatedEnumeration() {
-    return new AnimatedEnumeration._internalWrap();
-  }
 
-  factory AnimatedEnumeration._internalWrap() {
-    return new AnimatedEnumeration.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedEnumeration.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedEnumeration.animVal')
   @DocsEditable()
-  int get animVal => _blink.BlinkSVGAnimatedEnumeration.instance.animVal_Getter_(unwrap_jso(this));
+  int get animVal => _blink.BlinkSVGAnimatedEnumeration.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Getter_(unwrap_jso(this));
+  int get baseVal => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Getter_(this);
   
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -691,32 +515,24 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedInteger._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedInteger internalCreateAnimatedInteger() {
-    return new AnimatedInteger._internalWrap();
-  }
 
-  factory AnimatedInteger._internalWrap() {
-    return new AnimatedInteger.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedInteger.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedInteger.animVal')
   @DocsEditable()
-  int get animVal => _blink.BlinkSVGAnimatedInteger.instance.animVal_Getter_(unwrap_jso(this));
+  int get animVal => _blink.BlinkSVGAnimatedInteger.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Getter_(unwrap_jso(this));
+  int get baseVal => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Getter_(this);
   
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -733,28 +549,20 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedLength._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedLength internalCreateAnimatedLength() {
-    return new AnimatedLength._internalWrap();
-  }
 
-  factory AnimatedLength._internalWrap() {
-    return new AnimatedLength.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedLength.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedLength.animVal')
   @DocsEditable()
-  Length get animVal => wrap_jso(_blink.BlinkSVGAnimatedLength.instance.animVal_Getter_(unwrap_jso(this)));
+  Length get animVal => _blink.BlinkSVGAnimatedLength.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedLength.baseVal')
   @DocsEditable()
-  Length get baseVal => wrap_jso(_blink.BlinkSVGAnimatedLength.instance.baseVal_Getter_(unwrap_jso(this)));
+  Length get baseVal => _blink.BlinkSVGAnimatedLength.instance.baseVal_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -771,28 +579,20 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedLengthList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedLengthList internalCreateAnimatedLengthList() {
-    return new AnimatedLengthList._internalWrap();
-  }
 
-  factory AnimatedLengthList._internalWrap() {
-    return new AnimatedLengthList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedLengthList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedLengthList.animVal')
   @DocsEditable()
-  LengthList get animVal => wrap_jso(_blink.BlinkSVGAnimatedLengthList.instance.animVal_Getter_(unwrap_jso(this)));
+  LengthList get animVal => _blink.BlinkSVGAnimatedLengthList.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedLengthList.baseVal')
   @DocsEditable()
-  LengthList get baseVal => wrap_jso(_blink.BlinkSVGAnimatedLengthList.instance.baseVal_Getter_(unwrap_jso(this)));
+  LengthList get baseVal => _blink.BlinkSVGAnimatedLengthList.instance.baseVal_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -809,32 +609,24 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumber._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedNumber internalCreateAnimatedNumber() {
-    return new AnimatedNumber._internalWrap();
-  }
 
-  factory AnimatedNumber._internalWrap() {
-    return new AnimatedNumber.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedNumber.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  num get animVal => _blink.BlinkSVGAnimatedNumber.instance.animVal_Getter_(unwrap_jso(this));
+  num get animVal => _blink.BlinkSVGAnimatedNumber.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  num get baseVal => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Getter_(unwrap_jso(this));
+  num get baseVal => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Getter_(this);
   
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -851,28 +643,20 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumberList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedNumberList internalCreateAnimatedNumberList() {
-    return new AnimatedNumberList._internalWrap();
-  }
 
-  factory AnimatedNumberList._internalWrap() {
-    return new AnimatedNumberList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedNumberList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedNumberList.animVal')
   @DocsEditable()
-  NumberList get animVal => wrap_jso(_blink.BlinkSVGAnimatedNumberList.instance.animVal_Getter_(unwrap_jso(this)));
+  NumberList get animVal => _blink.BlinkSVGAnimatedNumberList.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedNumberList.baseVal')
   @DocsEditable()
-  NumberList get baseVal => wrap_jso(_blink.BlinkSVGAnimatedNumberList.instance.baseVal_Getter_(unwrap_jso(this)));
+  NumberList get baseVal => _blink.BlinkSVGAnimatedNumberList.instance.baseVal_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -889,28 +673,20 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedPreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedPreserveAspectRatio internalCreateAnimatedPreserveAspectRatio() {
-    return new AnimatedPreserveAspectRatio._internalWrap();
-  }
 
-  factory AnimatedPreserveAspectRatio._internalWrap() {
-    return new AnimatedPreserveAspectRatio.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedPreserveAspectRatio.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   @DocsEditable()
-  PreserveAspectRatio get animVal => wrap_jso(_blink.BlinkSVGAnimatedPreserveAspectRatio.instance.animVal_Getter_(unwrap_jso(this)));
+  PreserveAspectRatio get animVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
   @DocsEditable()
-  PreserveAspectRatio get baseVal => wrap_jso(_blink.BlinkSVGAnimatedPreserveAspectRatio.instance.baseVal_Getter_(unwrap_jso(this)));
+  PreserveAspectRatio get baseVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.instance.baseVal_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -927,28 +703,20 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedRect._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedRect internalCreateAnimatedRect() {
-    return new AnimatedRect._internalWrap();
-  }
 
-  factory AnimatedRect._internalWrap() {
-    return new AnimatedRect.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedRect.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedRect.animVal')
   @DocsEditable()
-  Rect get animVal => wrap_jso(_blink.BlinkSVGAnimatedRect.instance.animVal_Getter_(unwrap_jso(this)));
+  Rect get animVal => _blink.BlinkSVGAnimatedRect.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedRect.baseVal')
   @DocsEditable()
-  Rect get baseVal => wrap_jso(_blink.BlinkSVGAnimatedRect.instance.baseVal_Getter_(unwrap_jso(this)));
+  Rect get baseVal => _blink.BlinkSVGAnimatedRect.instance.baseVal_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -965,32 +733,24 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedString._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedString internalCreateAnimatedString() {
-    return new AnimatedString._internalWrap();
-  }
 
-  factory AnimatedString._internalWrap() {
-    return new AnimatedString.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedString.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedString.animVal')
   @DocsEditable()
-  String get animVal => _blink.BlinkSVGAnimatedString.instance.animVal_Getter_(unwrap_jso(this));
+  String get animVal => _blink.BlinkSVGAnimatedString.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  String get baseVal => _blink.BlinkSVGAnimatedString.instance.baseVal_Getter_(unwrap_jso(this));
+  String get baseVal => _blink.BlinkSVGAnimatedString.instance.baseVal_Getter_(this);
   
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  set baseVal(String value) => _blink.BlinkSVGAnimatedString.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(String value) => _blink.BlinkSVGAnimatedString.instance.baseVal_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1007,28 +767,20 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedTransformList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AnimatedTransformList internalCreateAnimatedTransformList() {
-    return new AnimatedTransformList._internalWrap();
-  }
 
-  factory AnimatedTransformList._internalWrap() {
-    return new AnimatedTransformList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimatedTransformList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGAnimatedTransformList.animVal')
   @DocsEditable()
-  TransformList get animVal => wrap_jso(_blink.BlinkSVGAnimatedTransformList.instance.animVal_Getter_(unwrap_jso(this)));
+  TransformList get animVal => _blink.BlinkSVGAnimatedTransformList.instance.animVal_Getter_(this);
   
   @DomName('SVGAnimatedTransformList.baseVal')
   @DocsEditable()
-  TransformList get baseVal => wrap_jso(_blink.BlinkSVGAnimatedTransformList.instance.baseVal_Getter_(unwrap_jso(this)));
+  TransformList get baseVal => _blink.BlinkSVGAnimatedTransformList.instance.baseVal_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1051,11 +803,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AnimationElement internalCreateAnimationElement() {
-    return new AnimationElement._internalWrap();
-  }
-
-  external factory AnimationElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnimationElement.internal_() : super.internal_();
@@ -1069,51 +817,51 @@
 
   @DomName('SVGAnimationElement.targetElement')
   @DocsEditable()
-  SvgElement get targetElement => wrap_jso(_blink.BlinkSVGAnimationElement.instance.targetElement_Getter_(unwrap_jso(this)));
+  SvgElement get targetElement => _blink.BlinkSVGAnimationElement.instance.targetElement_Getter_(this);
   
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
-  void beginElement() => _blink.BlinkSVGAnimationElement.instance.beginElement_Callback_0_(unwrap_jso(this));
+  void beginElement() => _blink.BlinkSVGAnimationElement.instance.beginElement_Callback_0_(this);
   
   @DomName('SVGAnimationElement.beginElementAt')
   @DocsEditable()
-  void beginElementAt(num offset) => _blink.BlinkSVGAnimationElement.instance.beginElementAt_Callback_1_(unwrap_jso(this), offset);
+  void beginElementAt(num offset) => _blink.BlinkSVGAnimationElement.instance.beginElementAt_Callback_1_(this, offset);
   
   @DomName('SVGAnimationElement.endElement')
   @DocsEditable()
-  void endElement() => _blink.BlinkSVGAnimationElement.instance.endElement_Callback_0_(unwrap_jso(this));
+  void endElement() => _blink.BlinkSVGAnimationElement.instance.endElement_Callback_0_(this);
   
   @DomName('SVGAnimationElement.endElementAt')
   @DocsEditable()
-  void endElementAt(num offset) => _blink.BlinkSVGAnimationElement.instance.endElementAt_Callback_1_(unwrap_jso(this), offset);
+  void endElementAt(num offset) => _blink.BlinkSVGAnimationElement.instance.endElementAt_Callback_1_(this, offset);
   
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  num getCurrentTime() => _blink.BlinkSVGAnimationElement.instance.getCurrentTime_Callback_0_(unwrap_jso(this));
+  num getCurrentTime() => _blink.BlinkSVGAnimationElement.instance.getCurrentTime_Callback_0_(this);
   
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  num getSimpleDuration() => _blink.BlinkSVGAnimationElement.instance.getSimpleDuration_Callback_0_(unwrap_jso(this));
+  num getSimpleDuration() => _blink.BlinkSVGAnimationElement.instance.getSimpleDuration_Callback_0_(this);
   
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  num getStartTime() => _blink.BlinkSVGAnimationElement.instance.getStartTime_Callback_0_(unwrap_jso(this));
+  num getStartTime() => _blink.BlinkSVGAnimationElement.instance.getStartTime_Callback_0_(this);
   
   @DomName('SVGAnimationElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGAnimationElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
+  StringList get requiredExtensions => _blink.BlinkSVGAnimationElement.instance.requiredExtensions_Getter_(this);
   
   @DomName('SVGAnimationElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGAnimationElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
+  StringList get requiredFeatures => _blink.BlinkSVGAnimationElement.instance.requiredFeatures_Getter_(this);
   
   @DomName('SVGAnimationElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGAnimationElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
+  StringList get systemLanguage => _blink.BlinkSVGAnimationElement.instance.systemLanguage_Getter_(this);
   
   @DomName('SVGAnimationElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGAnimationElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGAnimationElement.instance.hasExtension_Callback_1_(this, extension);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1136,11 +884,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static CircleElement internalCreateCircleElement() {
-    return new CircleElement._internalWrap();
-  }
-
-  external factory CircleElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CircleElement.internal_() : super.internal_();
@@ -1154,15 +898,15 @@
 
   @DomName('SVGCircleElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => wrap_jso(_blink.BlinkSVGCircleElement.instance.cx_Getter_(unwrap_jso(this)));
+  AnimatedLength get cx => _blink.BlinkSVGCircleElement.instance.cx_Getter_(this);
   
   @DomName('SVGCircleElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => wrap_jso(_blink.BlinkSVGCircleElement.instance.cy_Getter_(unwrap_jso(this)));
+  AnimatedLength get cy => _blink.BlinkSVGCircleElement.instance.cy_Getter_(this);
   
   @DomName('SVGCircleElement.r')
   @DocsEditable()
-  AnimatedLength get r => wrap_jso(_blink.BlinkSVGCircleElement.instance.r_Getter_(unwrap_jso(this)));
+  AnimatedLength get r => _blink.BlinkSVGCircleElement.instance.r_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1185,11 +929,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ClipPathElement internalCreateClipPathElement() {
-    return new ClipPathElement._internalWrap();
-  }
-
-  external factory ClipPathElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ClipPathElement.internal_() : super.internal_();
@@ -1203,7 +943,7 @@
 
   @DomName('SVGClipPathElement.clipPathUnits')
   @DocsEditable()
-  AnimatedEnumeration get clipPathUnits => wrap_jso(_blink.BlinkSVGClipPathElement.instance.clipPathUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get clipPathUnits => _blink.BlinkSVGClipPathElement.instance.clipPathUnits_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1226,11 +966,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DefsElement internalCreateDefsElement() {
-    return new DefsElement._internalWrap();
-  }
-
-  external factory DefsElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DefsElement.internal_() : super.internal_();
@@ -1263,11 +999,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DescElement internalCreateDescElement() {
-    return new DescElement._internalWrap();
-  }
-
-  external factory DescElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DescElement.internal_() : super.internal_();
@@ -1296,11 +1028,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DiscardElement internalCreateDiscardElement() {
-    return new DiscardElement._internalWrap();
-  }
-
-  external factory DiscardElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DiscardElement.internal_() : super.internal_();
@@ -1333,11 +1061,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static EllipseElement internalCreateEllipseElement() {
-    return new EllipseElement._internalWrap();
-  }
-
-  external factory EllipseElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   EllipseElement.internal_() : super.internal_();
@@ -1351,19 +1075,19 @@
 
   @DomName('SVGEllipseElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => wrap_jso(_blink.BlinkSVGEllipseElement.instance.cx_Getter_(unwrap_jso(this)));
+  AnimatedLength get cx => _blink.BlinkSVGEllipseElement.instance.cx_Getter_(this);
   
   @DomName('SVGEllipseElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => wrap_jso(_blink.BlinkSVGEllipseElement.instance.cy_Getter_(unwrap_jso(this)));
+  AnimatedLength get cy => _blink.BlinkSVGEllipseElement.instance.cy_Getter_(this);
   
   @DomName('SVGEllipseElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => wrap_jso(_blink.BlinkSVGEllipseElement.instance.rx_Getter_(unwrap_jso(this)));
+  AnimatedLength get rx => _blink.BlinkSVGEllipseElement.instance.rx_Getter_(this);
   
   @DomName('SVGEllipseElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => wrap_jso(_blink.BlinkSVGEllipseElement.instance.ry_Getter_(unwrap_jso(this)));
+  AnimatedLength get ry => _blink.BlinkSVGEllipseElement.instance.ry_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1390,11 +1114,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEBlendElement internalCreateFEBlendElement() {
-    return new FEBlendElement._internalWrap();
-  }
-
-  external factory FEBlendElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEBlendElement.internal_() : super.internal_();
@@ -1435,35 +1155,35 @@
 
   @DomName('SVGFEBlendElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEBlendElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEBlendElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.in2_Getter_(unwrap_jso(this)));
+  AnimatedString get in2 => _blink.BlinkSVGFEBlendElement.instance.in2_Getter_(this);
   
   @DomName('SVGFEBlendElement.mode')
   @DocsEditable()
-  AnimatedEnumeration get mode => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.mode_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get mode => _blink.BlinkSVGFEBlendElement.instance.mode_Getter_(this);
   
   @DomName('SVGFEBlendElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEBlendElement.instance.height_Getter_(this);
   
   @DomName('SVGFEBlendElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEBlendElement.instance.result_Getter_(this);
   
   @DomName('SVGFEBlendElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEBlendElement.instance.width_Getter_(this);
   
   @DomName('SVGFEBlendElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEBlendElement.instance.x_Getter_(this);
   
   @DomName('SVGFEBlendElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEBlendElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEBlendElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1490,11 +1210,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEColorMatrixElement internalCreateFEColorMatrixElement() {
-    return new FEColorMatrixElement._internalWrap();
-  }
-
-  external factory FEColorMatrixElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEColorMatrixElement.internal_() : super.internal_();
@@ -1531,35 +1247,35 @@
 
   @DomName('SVGFEColorMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEColorMatrixElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEColorMatrixElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.type_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get type => _blink.BlinkSVGFEColorMatrixElement.instance.type_Getter_(this);
   
   @DomName('SVGFEColorMatrixElement.values')
   @DocsEditable()
-  AnimatedNumberList get values => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.values_Getter_(unwrap_jso(this)));
+  AnimatedNumberList get values => _blink.BlinkSVGFEColorMatrixElement.instance.values_Getter_(this);
   
   @DomName('SVGFEColorMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEColorMatrixElement.instance.height_Getter_(this);
   
   @DomName('SVGFEColorMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEColorMatrixElement.instance.result_Getter_(this);
   
   @DomName('SVGFEColorMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEColorMatrixElement.instance.width_Getter_(this);
   
   @DomName('SVGFEColorMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEColorMatrixElement.instance.x_Getter_(this);
   
   @DomName('SVGFEColorMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEColorMatrixElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEColorMatrixElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1586,11 +1302,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEComponentTransferElement internalCreateFEComponentTransferElement() {
-    return new FEComponentTransferElement._internalWrap();
-  }
-
-  external factory FEComponentTransferElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEComponentTransferElement.internal_() : super.internal_();
@@ -1607,27 +1319,27 @@
 
   @DomName('SVGFEComponentTransferElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEComponentTransferElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEComponentTransferElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEComponentTransferElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEComponentTransferElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEComponentTransferElement.instance.height_Getter_(this);
   
   @DomName('SVGFEComponentTransferElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEComponentTransferElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEComponentTransferElement.instance.result_Getter_(this);
   
   @DomName('SVGFEComponentTransferElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEComponentTransferElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEComponentTransferElement.instance.width_Getter_(this);
   
   @DomName('SVGFEComponentTransferElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEComponentTransferElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEComponentTransferElement.instance.x_Getter_(this);
   
   @DomName('SVGFEComponentTransferElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEComponentTransferElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEComponentTransferElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1646,11 +1358,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FECompositeElement internalCreateFECompositeElement() {
-    return new FECompositeElement._internalWrap();
-  }
-
-  external factory FECompositeElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FECompositeElement.internal_() : super.internal_();
@@ -1692,51 +1400,51 @@
 
   @DomName('SVGFECompositeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFECompositeElement.instance.in1_Getter_(this);
   
   @DomName('SVGFECompositeElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.in2_Getter_(unwrap_jso(this)));
+  AnimatedString get in2 => _blink.BlinkSVGFECompositeElement.instance.in2_Getter_(this);
   
   @DomName('SVGFECompositeElement.k1')
   @DocsEditable()
-  AnimatedNumber get k1 => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.k1_Getter_(unwrap_jso(this)));
+  AnimatedNumber get k1 => _blink.BlinkSVGFECompositeElement.instance.k1_Getter_(this);
   
   @DomName('SVGFECompositeElement.k2')
   @DocsEditable()
-  AnimatedNumber get k2 => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.k2_Getter_(unwrap_jso(this)));
+  AnimatedNumber get k2 => _blink.BlinkSVGFECompositeElement.instance.k2_Getter_(this);
   
   @DomName('SVGFECompositeElement.k3')
   @DocsEditable()
-  AnimatedNumber get k3 => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.k3_Getter_(unwrap_jso(this)));
+  AnimatedNumber get k3 => _blink.BlinkSVGFECompositeElement.instance.k3_Getter_(this);
   
   @DomName('SVGFECompositeElement.k4')
   @DocsEditable()
-  AnimatedNumber get k4 => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.k4_Getter_(unwrap_jso(this)));
+  AnimatedNumber get k4 => _blink.BlinkSVGFECompositeElement.instance.k4_Getter_(this);
   
   @DomName('SVGFECompositeElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.operator_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get operator => _blink.BlinkSVGFECompositeElement.instance.operator_Getter_(this);
   
   @DomName('SVGFECompositeElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFECompositeElement.instance.height_Getter_(this);
   
   @DomName('SVGFECompositeElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFECompositeElement.instance.result_Getter_(this);
   
   @DomName('SVGFECompositeElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFECompositeElement.instance.width_Getter_(this);
   
   @DomName('SVGFECompositeElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFECompositeElement.instance.x_Getter_(this);
   
   @DomName('SVGFECompositeElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFECompositeElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFECompositeElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1763,11 +1471,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEConvolveMatrixElement internalCreateFEConvolveMatrixElement() {
-    return new FEConvolveMatrixElement._internalWrap();
-  }
-
-  external factory FEConvolveMatrixElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEConvolveMatrixElement.internal_() : super.internal_();
@@ -1800,71 +1504,71 @@
 
   @DomName('SVGFEConvolveMatrixElement.bias')
   @DocsEditable()
-  AnimatedNumber get bias => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.bias_Getter_(unwrap_jso(this)));
+  AnimatedNumber get bias => _blink.BlinkSVGFEConvolveMatrixElement.instance.bias_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.divisor')
   @DocsEditable()
-  AnimatedNumber get divisor => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.divisor_Getter_(unwrap_jso(this)));
+  AnimatedNumber get divisor => _blink.BlinkSVGFEConvolveMatrixElement.instance.divisor_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.edgeMode')
   @DocsEditable()
-  AnimatedEnumeration get edgeMode => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.edgeMode_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get edgeMode => _blink.BlinkSVGFEConvolveMatrixElement.instance.edgeMode_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEConvolveMatrixElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
   @DocsEditable()
-  AnimatedNumberList get kernelMatrix => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.kernelMatrix_Getter_(unwrap_jso(this)));
+  AnimatedNumberList get kernelMatrix => _blink.BlinkSVGFEConvolveMatrixElement.instance.kernelMatrix_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.kernelUnitLengthX_Getter_(unwrap_jso(this)));
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEConvolveMatrixElement.instance.kernelUnitLengthX_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.kernelUnitLengthY_Getter_(unwrap_jso(this)));
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEConvolveMatrixElement.instance.kernelUnitLengthY_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.orderX')
   @DocsEditable()
-  AnimatedInteger get orderX => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.orderX_Getter_(unwrap_jso(this)));
+  AnimatedInteger get orderX => _blink.BlinkSVGFEConvolveMatrixElement.instance.orderX_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.orderY')
   @DocsEditable()
-  AnimatedInteger get orderY => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.orderY_Getter_(unwrap_jso(this)));
+  AnimatedInteger get orderY => _blink.BlinkSVGFEConvolveMatrixElement.instance.orderY_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
   @DocsEditable()
-  AnimatedBoolean get preserveAlpha => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.preserveAlpha_Getter_(unwrap_jso(this)));
+  AnimatedBoolean get preserveAlpha => _blink.BlinkSVGFEConvolveMatrixElement.instance.preserveAlpha_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.targetX')
   @DocsEditable()
-  AnimatedInteger get targetX => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.targetX_Getter_(unwrap_jso(this)));
+  AnimatedInteger get targetX => _blink.BlinkSVGFEConvolveMatrixElement.instance.targetX_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.targetY')
   @DocsEditable()
-  AnimatedInteger get targetY => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.targetY_Getter_(unwrap_jso(this)));
+  AnimatedInteger get targetY => _blink.BlinkSVGFEConvolveMatrixElement.instance.targetY_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEConvolveMatrixElement.instance.height_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEConvolveMatrixElement.instance.result_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEConvolveMatrixElement.instance.width_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEConvolveMatrixElement.instance.x_Getter_(this);
   
   @DomName('SVGFEConvolveMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEConvolveMatrixElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEConvolveMatrixElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1891,11 +1595,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEDiffuseLightingElement internalCreateFEDiffuseLightingElement() {
-    return new FEDiffuseLightingElement._internalWrap();
-  }
-
-  external factory FEDiffuseLightingElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEDiffuseLightingElement.internal_() : super.internal_();
@@ -1912,43 +1612,43 @@
 
   @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   @DocsEditable()
-  AnimatedNumber get diffuseConstant => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.diffuseConstant_Getter_(unwrap_jso(this)));
+  AnimatedNumber get diffuseConstant => _blink.BlinkSVGFEDiffuseLightingElement.instance.diffuseConstant_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEDiffuseLightingElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.kernelUnitLengthX_Getter_(unwrap_jso(this)));
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEDiffuseLightingElement.instance.kernelUnitLengthX_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.kernelUnitLengthY_Getter_(unwrap_jso(this)));
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEDiffuseLightingElement.instance.kernelUnitLengthY_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.surfaceScale_Getter_(unwrap_jso(this)));
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFEDiffuseLightingElement.instance.surfaceScale_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEDiffuseLightingElement.instance.height_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEDiffuseLightingElement.instance.result_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEDiffuseLightingElement.instance.width_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEDiffuseLightingElement.instance.x_Getter_(this);
   
   @DomName('SVGFEDiffuseLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEDiffuseLightingElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEDiffuseLightingElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1975,11 +1675,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEDisplacementMapElement internalCreateFEDisplacementMapElement() {
-    return new FEDisplacementMapElement._internalWrap();
-  }
-
-  external factory FEDisplacementMapElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEDisplacementMapElement.internal_() : super.internal_();
@@ -2016,43 +1712,43 @@
 
   @DomName('SVGFEDisplacementMapElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEDisplacementMapElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.in2_Getter_(unwrap_jso(this)));
+  AnimatedString get in2 => _blink.BlinkSVGFEDisplacementMapElement.instance.in2_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.scale')
   @DocsEditable()
-  AnimatedNumber get scale => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.scale_Getter_(unwrap_jso(this)));
+  AnimatedNumber get scale => _blink.BlinkSVGFEDisplacementMapElement.instance.scale_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.xChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get xChannelSelector => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.xChannelSelector_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get xChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.instance.xChannelSelector_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.yChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get yChannelSelector => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.yChannelSelector_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get yChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.instance.yChannelSelector_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEDisplacementMapElement.instance.height_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEDisplacementMapElement.instance.result_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEDisplacementMapElement.instance.width_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEDisplacementMapElement.instance.x_Getter_(this);
   
   @DomName('SVGFEDisplacementMapElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEDisplacementMapElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEDisplacementMapElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2079,11 +1775,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEDistantLightElement internalCreateFEDistantLightElement() {
-    return new FEDistantLightElement._internalWrap();
-  }
-
-  external factory FEDistantLightElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEDistantLightElement.internal_() : super.internal_();
@@ -2100,11 +1792,11 @@
 
   @DomName('SVGFEDistantLightElement.azimuth')
   @DocsEditable()
-  AnimatedNumber get azimuth => wrap_jso(_blink.BlinkSVGFEDistantLightElement.instance.azimuth_Getter_(unwrap_jso(this)));
+  AnimatedNumber get azimuth => _blink.BlinkSVGFEDistantLightElement.instance.azimuth_Getter_(this);
   
   @DomName('SVGFEDistantLightElement.elevation')
   @DocsEditable()
-  AnimatedNumber get elevation => wrap_jso(_blink.BlinkSVGFEDistantLightElement.instance.elevation_Getter_(unwrap_jso(this)));
+  AnimatedNumber get elevation => _blink.BlinkSVGFEDistantLightElement.instance.elevation_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2131,11 +1823,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEFloodElement internalCreateFEFloodElement() {
-    return new FEFloodElement._internalWrap();
-  }
-
-  external factory FEFloodElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEFloodElement.internal_() : super.internal_();
@@ -2152,23 +1840,23 @@
 
   @DomName('SVGFEFloodElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEFloodElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEFloodElement.instance.height_Getter_(this);
   
   @DomName('SVGFEFloodElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEFloodElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEFloodElement.instance.result_Getter_(this);
   
   @DomName('SVGFEFloodElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEFloodElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEFloodElement.instance.width_Getter_(this);
   
   @DomName('SVGFEFloodElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEFloodElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEFloodElement.instance.x_Getter_(this);
   
   @DomName('SVGFEFloodElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEFloodElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEFloodElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2195,11 +1883,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEFuncAElement internalCreateFEFuncAElement() {
-    return new FEFuncAElement._internalWrap();
-  }
-
-  external factory FEFuncAElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEFuncAElement.internal_() : super.internal_();
@@ -2239,11 +1923,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEFuncBElement internalCreateFEFuncBElement() {
-    return new FEFuncBElement._internalWrap();
-  }
-
-  external factory FEFuncBElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEFuncBElement.internal_() : super.internal_();
@@ -2283,11 +1963,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEFuncGElement internalCreateFEFuncGElement() {
-    return new FEFuncGElement._internalWrap();
-  }
-
-  external factory FEFuncGElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEFuncGElement.internal_() : super.internal_();
@@ -2327,11 +2003,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEFuncRElement internalCreateFEFuncRElement() {
-    return new FEFuncRElement._internalWrap();
-  }
-
-  external factory FEFuncRElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEFuncRElement.internal_() : super.internal_();
@@ -2371,11 +2043,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEGaussianBlurElement internalCreateFEGaussianBlurElement() {
-    return new FEGaussianBlurElement._internalWrap();
-  }
-
-  external factory FEGaussianBlurElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEGaussianBlurElement.internal_() : super.internal_();
@@ -2392,39 +2060,39 @@
 
   @DomName('SVGFEGaussianBlurElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEGaussianBlurElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEGaussianBlurElement.stdDeviationX')
   @DocsEditable()
-  AnimatedNumber get stdDeviationX => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.stdDeviationX_Getter_(unwrap_jso(this)));
+  AnimatedNumber get stdDeviationX => _blink.BlinkSVGFEGaussianBlurElement.instance.stdDeviationX_Getter_(this);
   
   @DomName('SVGFEGaussianBlurElement.stdDeviationY')
   @DocsEditable()
-  AnimatedNumber get stdDeviationY => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.stdDeviationY_Getter_(unwrap_jso(this)));
+  AnimatedNumber get stdDeviationY => _blink.BlinkSVGFEGaussianBlurElement.instance.stdDeviationY_Getter_(this);
   
   @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   @DocsEditable()
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.BlinkSVGFEGaussianBlurElement.instance.setStdDeviation_Callback_2_(unwrap_jso(this), stdDeviationX, stdDeviationY);
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.BlinkSVGFEGaussianBlurElement.instance.setStdDeviation_Callback_2_(this, stdDeviationX, stdDeviationY);
   
   @DomName('SVGFEGaussianBlurElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEGaussianBlurElement.instance.height_Getter_(this);
   
   @DomName('SVGFEGaussianBlurElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEGaussianBlurElement.instance.result_Getter_(this);
   
   @DomName('SVGFEGaussianBlurElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEGaussianBlurElement.instance.width_Getter_(this);
   
   @DomName('SVGFEGaussianBlurElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEGaussianBlurElement.instance.x_Getter_(this);
   
   @DomName('SVGFEGaussianBlurElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEGaussianBlurElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEGaussianBlurElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2451,11 +2119,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEImageElement internalCreateFEImageElement() {
-    return new FEImageElement._internalWrap();
-  }
-
-  external factory FEImageElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEImageElement.internal_() : super.internal_();
@@ -2472,31 +2136,31 @@
 
   @DomName('SVGFEImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGFEImageElement.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFEImageElement.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGFEImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEImageElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEImageElement.instance.height_Getter_(this);
   
   @DomName('SVGFEImageElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEImageElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEImageElement.instance.result_Getter_(this);
   
   @DomName('SVGFEImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEImageElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEImageElement.instance.width_Getter_(this);
   
   @DomName('SVGFEImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEImageElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEImageElement.instance.x_Getter_(this);
   
   @DomName('SVGFEImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEImageElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEImageElement.instance.y_Getter_(this);
   
   @DomName('SVGFEImageElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGFEImageElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGFEImageElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2523,11 +2187,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEMergeElement internalCreateFEMergeElement() {
-    return new FEMergeElement._internalWrap();
-  }
-
-  external factory FEMergeElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEMergeElement.internal_() : super.internal_();
@@ -2544,23 +2204,23 @@
 
   @DomName('SVGFEMergeElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEMergeElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEMergeElement.instance.height_Getter_(this);
   
   @DomName('SVGFEMergeElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEMergeElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEMergeElement.instance.result_Getter_(this);
   
   @DomName('SVGFEMergeElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEMergeElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEMergeElement.instance.width_Getter_(this);
   
   @DomName('SVGFEMergeElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEMergeElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEMergeElement.instance.x_Getter_(this);
   
   @DomName('SVGFEMergeElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEMergeElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEMergeElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2587,11 +2247,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEMergeNodeElement internalCreateFEMergeNodeElement() {
-    return new FEMergeNodeElement._internalWrap();
-  }
-
-  external factory FEMergeNodeElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEMergeNodeElement.internal_() : super.internal_();
@@ -2608,7 +2264,7 @@
 
   @DomName('SVGFEMergeNodeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEMergeNodeElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEMergeNodeElement.instance.in1_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2631,11 +2287,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEMorphologyElement internalCreateFEMorphologyElement() {
-    return new FEMorphologyElement._internalWrap();
-  }
-
-  external factory FEMorphologyElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEMorphologyElement.internal_() : super.internal_();
@@ -2661,39 +2313,39 @@
 
   @DomName('SVGFEMorphologyElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEMorphologyElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.operator_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get operator => _blink.BlinkSVGFEMorphologyElement.instance.operator_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.radiusX')
   @DocsEditable()
-  AnimatedNumber get radiusX => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.radiusX_Getter_(unwrap_jso(this)));
+  AnimatedNumber get radiusX => _blink.BlinkSVGFEMorphologyElement.instance.radiusX_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.radiusY')
   @DocsEditable()
-  AnimatedNumber get radiusY => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.radiusY_Getter_(unwrap_jso(this)));
+  AnimatedNumber get radiusY => _blink.BlinkSVGFEMorphologyElement.instance.radiusY_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEMorphologyElement.instance.height_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEMorphologyElement.instance.result_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEMorphologyElement.instance.width_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEMorphologyElement.instance.x_Getter_(this);
   
   @DomName('SVGFEMorphologyElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEMorphologyElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEMorphologyElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2720,11 +2372,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEOffsetElement internalCreateFEOffsetElement() {
-    return new FEOffsetElement._internalWrap();
-  }
-
-  external factory FEOffsetElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEOffsetElement.internal_() : super.internal_();
@@ -2741,35 +2389,35 @@
 
   @DomName('SVGFEOffsetElement.dx')
   @DocsEditable()
-  AnimatedNumber get dx => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.dx_Getter_(unwrap_jso(this)));
+  AnimatedNumber get dx => _blink.BlinkSVGFEOffsetElement.instance.dx_Getter_(this);
   
   @DomName('SVGFEOffsetElement.dy')
   @DocsEditable()
-  AnimatedNumber get dy => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.dy_Getter_(unwrap_jso(this)));
+  AnimatedNumber get dy => _blink.BlinkSVGFEOffsetElement.instance.dy_Getter_(this);
   
   @DomName('SVGFEOffsetElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFEOffsetElement.instance.in1_Getter_(this);
   
   @DomName('SVGFEOffsetElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEOffsetElement.instance.height_Getter_(this);
   
   @DomName('SVGFEOffsetElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFEOffsetElement.instance.result_Getter_(this);
   
   @DomName('SVGFEOffsetElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFEOffsetElement.instance.width_Getter_(this);
   
   @DomName('SVGFEOffsetElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFEOffsetElement.instance.x_Getter_(this);
   
   @DomName('SVGFEOffsetElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEOffsetElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFEOffsetElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2796,11 +2444,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FEPointLightElement internalCreateFEPointLightElement() {
-    return new FEPointLightElement._internalWrap();
-  }
-
-  external factory FEPointLightElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FEPointLightElement.internal_() : super.internal_();
@@ -2817,15 +2461,15 @@
 
   @DomName('SVGFEPointLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => wrap_jso(_blink.BlinkSVGFEPointLightElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedNumber get x => _blink.BlinkSVGFEPointLightElement.instance.x_Getter_(this);
   
   @DomName('SVGFEPointLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => wrap_jso(_blink.BlinkSVGFEPointLightElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedNumber get y => _blink.BlinkSVGFEPointLightElement.instance.y_Getter_(this);
   
   @DomName('SVGFEPointLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => wrap_jso(_blink.BlinkSVGFEPointLightElement.instance.z_Getter_(unwrap_jso(this)));
+  AnimatedNumber get z => _blink.BlinkSVGFEPointLightElement.instance.z_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2852,11 +2496,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FESpecularLightingElement internalCreateFESpecularLightingElement() {
-    return new FESpecularLightingElement._internalWrap();
-  }
-
-  external factory FESpecularLightingElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FESpecularLightingElement.internal_() : super.internal_();
@@ -2873,49 +2513,49 @@
 
   @DomName('SVGFESpecularLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFESpecularLightingElement.instance.in1_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.kernelUnitLengthX')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedNumber get kernelUnitLengthX => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.kernelUnitLengthX_Getter_(unwrap_jso(this)));
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFESpecularLightingElement.instance.kernelUnitLengthX_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.kernelUnitLengthY')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedNumber get kernelUnitLengthY => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.kernelUnitLengthY_Getter_(unwrap_jso(this)));
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFESpecularLightingElement.instance.kernelUnitLengthY_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.specularConstant')
   @DocsEditable()
-  AnimatedNumber get specularConstant => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.specularConstant_Getter_(unwrap_jso(this)));
+  AnimatedNumber get specularConstant => _blink.BlinkSVGFESpecularLightingElement.instance.specularConstant_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.specularExponent_Getter_(unwrap_jso(this)));
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpecularLightingElement.instance.specularExponent_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.surfaceScale_Getter_(unwrap_jso(this)));
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFESpecularLightingElement.instance.surfaceScale_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFESpecularLightingElement.instance.height_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFESpecularLightingElement.instance.result_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFESpecularLightingElement.instance.width_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFESpecularLightingElement.instance.x_Getter_(this);
   
   @DomName('SVGFESpecularLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFESpecularLightingElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFESpecularLightingElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2942,11 +2582,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FESpotLightElement internalCreateFESpotLightElement() {
-    return new FESpotLightElement._internalWrap();
-  }
-
-  external factory FESpotLightElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FESpotLightElement.internal_() : super.internal_();
@@ -2963,35 +2599,35 @@
 
   @DomName('SVGFESpotLightElement.limitingConeAngle')
   @DocsEditable()
-  AnimatedNumber get limitingConeAngle => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.limitingConeAngle_Getter_(unwrap_jso(this)));
+  AnimatedNumber get limitingConeAngle => _blink.BlinkSVGFESpotLightElement.instance.limitingConeAngle_Getter_(this);
   
   @DomName('SVGFESpotLightElement.pointsAtX')
   @DocsEditable()
-  AnimatedNumber get pointsAtX => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.pointsAtX_Getter_(unwrap_jso(this)));
+  AnimatedNumber get pointsAtX => _blink.BlinkSVGFESpotLightElement.instance.pointsAtX_Getter_(this);
   
   @DomName('SVGFESpotLightElement.pointsAtY')
   @DocsEditable()
-  AnimatedNumber get pointsAtY => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.pointsAtY_Getter_(unwrap_jso(this)));
+  AnimatedNumber get pointsAtY => _blink.BlinkSVGFESpotLightElement.instance.pointsAtY_Getter_(this);
   
   @DomName('SVGFESpotLightElement.pointsAtZ')
   @DocsEditable()
-  AnimatedNumber get pointsAtZ => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.pointsAtZ_Getter_(unwrap_jso(this)));
+  AnimatedNumber get pointsAtZ => _blink.BlinkSVGFESpotLightElement.instance.pointsAtZ_Getter_(this);
   
   @DomName('SVGFESpotLightElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.specularExponent_Getter_(unwrap_jso(this)));
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpotLightElement.instance.specularExponent_Getter_(this);
   
   @DomName('SVGFESpotLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedNumber get x => _blink.BlinkSVGFESpotLightElement.instance.x_Getter_(this);
   
   @DomName('SVGFESpotLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedNumber get y => _blink.BlinkSVGFESpotLightElement.instance.y_Getter_(this);
   
   @DomName('SVGFESpotLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => wrap_jso(_blink.BlinkSVGFESpotLightElement.instance.z_Getter_(unwrap_jso(this)));
+  AnimatedNumber get z => _blink.BlinkSVGFESpotLightElement.instance.z_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3018,11 +2654,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FETileElement internalCreateFETileElement() {
-    return new FETileElement._internalWrap();
-  }
-
-  external factory FETileElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FETileElement.internal_() : super.internal_();
@@ -3039,27 +2671,27 @@
 
   @DomName('SVGFETileElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => wrap_jso(_blink.BlinkSVGFETileElement.instance.in1_Getter_(unwrap_jso(this)));
+  AnimatedString get in1 => _blink.BlinkSVGFETileElement.instance.in1_Getter_(this);
   
   @DomName('SVGFETileElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFETileElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFETileElement.instance.height_Getter_(this);
   
   @DomName('SVGFETileElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFETileElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFETileElement.instance.result_Getter_(this);
   
   @DomName('SVGFETileElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFETileElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFETileElement.instance.width_Getter_(this);
   
   @DomName('SVGFETileElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFETileElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFETileElement.instance.x_Getter_(this);
   
   @DomName('SVGFETileElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFETileElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFETileElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3086,11 +2718,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FETurbulenceElement internalCreateFETurbulenceElement() {
-    return new FETurbulenceElement._internalWrap();
-  }
-
-  external factory FETurbulenceElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FETurbulenceElement.internal_() : super.internal_();
@@ -3131,47 +2759,47 @@
 
   @DomName('SVGFETurbulenceElement.baseFrequencyX')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyX => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.baseFrequencyX_Getter_(unwrap_jso(this)));
+  AnimatedNumber get baseFrequencyX => _blink.BlinkSVGFETurbulenceElement.instance.baseFrequencyX_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.baseFrequencyY')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyY => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.baseFrequencyY_Getter_(unwrap_jso(this)));
+  AnimatedNumber get baseFrequencyY => _blink.BlinkSVGFETurbulenceElement.instance.baseFrequencyY_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.numOctaves')
   @DocsEditable()
-  AnimatedInteger get numOctaves => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.numOctaves_Getter_(unwrap_jso(this)));
+  AnimatedInteger get numOctaves => _blink.BlinkSVGFETurbulenceElement.instance.numOctaves_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.seed')
   @DocsEditable()
-  AnimatedNumber get seed => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.seed_Getter_(unwrap_jso(this)));
+  AnimatedNumber get seed => _blink.BlinkSVGFETurbulenceElement.instance.seed_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.stitchTiles')
   @DocsEditable()
-  AnimatedEnumeration get stitchTiles => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.stitchTiles_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get stitchTiles => _blink.BlinkSVGFETurbulenceElement.instance.stitchTiles_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.type_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get type => _blink.BlinkSVGFETurbulenceElement.instance.type_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFETurbulenceElement.instance.height_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.result')
   @DocsEditable()
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedString get result => _blink.BlinkSVGFETurbulenceElement.instance.result_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFETurbulenceElement.instance.width_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFETurbulenceElement.instance.x_Getter_(this);
   
   @DomName('SVGFETurbulenceElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFETurbulenceElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFETurbulenceElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3198,11 +2826,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static FilterElement internalCreateFilterElement() {
-    return new FilterElement._internalWrap();
-  }
-
-  external factory FilterElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   FilterElement.internal_() : super.internal_();
@@ -3219,31 +2843,31 @@
 
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
-  AnimatedEnumeration get filterUnits => wrap_jso(_blink.BlinkSVGFilterElement.instance.filterUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get filterUnits => _blink.BlinkSVGFilterElement.instance.filterUnits_Getter_(this);
   
   @DomName('SVGFilterElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFilterElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFilterElement.instance.height_Getter_(this);
   
   @DomName('SVGFilterElement.primitiveUnits')
   @DocsEditable()
-  AnimatedEnumeration get primitiveUnits => wrap_jso(_blink.BlinkSVGFilterElement.instance.primitiveUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get primitiveUnits => _blink.BlinkSVGFilterElement.instance.primitiveUnits_Getter_(this);
   
   @DomName('SVGFilterElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFilterElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGFilterElement.instance.width_Getter_(this);
   
   @DomName('SVGFilterElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFilterElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGFilterElement.instance.x_Getter_(this);
   
   @DomName('SVGFilterElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFilterElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGFilterElement.instance.y_Getter_(this);
   
   @DomName('SVGFilterElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGFilterElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGFilterElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3327,11 +2951,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ForeignObjectElement internalCreateForeignObjectElement() {
-    return new ForeignObjectElement._internalWrap();
-  }
-
-  external factory ForeignObjectElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ForeignObjectElement.internal_() : super.internal_();
@@ -3348,19 +2968,19 @@
 
   @DomName('SVGForeignObjectElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGForeignObjectElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGForeignObjectElement.instance.height_Getter_(this);
   
   @DomName('SVGForeignObjectElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGForeignObjectElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGForeignObjectElement.instance.width_Getter_(this);
   
   @DomName('SVGForeignObjectElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGForeignObjectElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGForeignObjectElement.instance.x_Getter_(this);
   
   @DomName('SVGForeignObjectElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGForeignObjectElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGForeignObjectElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3383,11 +3003,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static GElement internalCreateGElement() {
-    return new GElement._internalWrap();
-  }
-
-  external factory GElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GElement.internal_() : super.internal_();
@@ -3416,11 +3032,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static GeometryElement internalCreateGeometryElement() {
-    return new GeometryElement._internalWrap();
-  }
-
-  external factory GeometryElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GeometryElement.internal_() : super.internal_();
@@ -3435,12 +3047,12 @@
   @DomName('SVGGeometryElement.isPointInFill')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInFill(Point point) => _blink.BlinkSVGGeometryElement.instance.isPointInFill_Callback_1_(unwrap_jso(this), unwrap_jso(point));
+  bool isPointInFill(Point point) => _blink.BlinkSVGGeometryElement.instance.isPointInFill_Callback_1_(this, point);
   
   @DomName('SVGGeometryElement.isPointInStroke')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInStroke(Point point) => _blink.BlinkSVGGeometryElement.instance.isPointInStroke_Callback_1_(unwrap_jso(this), unwrap_jso(point));
+  bool isPointInStroke(Point point) => _blink.BlinkSVGGeometryElement.instance.isPointInStroke_Callback_1_(this, point);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3459,11 +3071,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static GraphicsElement internalCreateGraphicsElement() {
-    return new GraphicsElement._internalWrap();
-  }
-
-  external factory GraphicsElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GraphicsElement.internal_() : super.internal_();
@@ -3478,57 +3086,57 @@
   @DomName('SVGGraphicsElement.farthestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get farthestViewportElement => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.farthestViewportElement_Getter_(unwrap_jso(this)));
+  SvgElement get farthestViewportElement => _blink.BlinkSVGGraphicsElement.instance.farthestViewportElement_Getter_(this);
   
   @DomName('SVGGraphicsElement.nearestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get nearestViewportElement => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.nearestViewportElement_Getter_(unwrap_jso(this)));
+  SvgElement get nearestViewportElement => _blink.BlinkSVGGraphicsElement.instance.nearestViewportElement_Getter_(this);
   
   @DomName('SVGGraphicsElement.transform')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedTransformList get transform => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.transform_Getter_(unwrap_jso(this)));
+  AnimatedTransformList get transform => _blink.BlinkSVGGraphicsElement.instance.transform_Getter_(this);
   
   @DomName('SVGGraphicsElement.getBBox')
   @DocsEditable()
   @Experimental() // untriaged
-  Rect getBBox() => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.getBBox_Callback_0_(unwrap_jso(this)));
+  Rect getBBox() => _blink.BlinkSVGGraphicsElement.instance.getBBox_Callback_0_(this);
   
   @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getCtm() => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.getCTM_Callback_0_(unwrap_jso(this)));
+  Matrix getCtm() => _blink.BlinkSVGGraphicsElement.instance.getCTM_Callback_0_(this);
   
   @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getScreenCtm() => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.getScreenCTM_Callback_0_(unwrap_jso(this)));
+  Matrix getScreenCtm() => _blink.BlinkSVGGraphicsElement.instance.getScreenCTM_Callback_0_(this);
   
   @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getTransformToElement(SvgElement element) => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.getTransformToElement_Callback_1_(unwrap_jso(this), unwrap_jso(element)));
+  Matrix getTransformToElement(SvgElement element) => _blink.BlinkSVGGraphicsElement.instance.getTransformToElement_Callback_1_(this, element);
   
   @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
+  StringList get requiredExtensions => _blink.BlinkSVGGraphicsElement.instance.requiredExtensions_Getter_(this);
   
   @DomName('SVGGraphicsElement.requiredFeatures')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
+  StringList get requiredFeatures => _blink.BlinkSVGGraphicsElement.instance.requiredFeatures_Getter_(this);
   
   @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
+  StringList get systemLanguage => _blink.BlinkSVGGraphicsElement.instance.systemLanguage_Getter_(this);
   
   @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
   @Experimental() // untriaged
-  bool hasExtension(String extension) => _blink.BlinkSVGGraphicsElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGGraphicsElement.instance.hasExtension_Callback_1_(this, extension);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3551,11 +3159,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ImageElement internalCreateImageElement() {
-    return new ImageElement._internalWrap();
-  }
-
-  external factory ImageElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ImageElement.internal_() : super.internal_();
@@ -3569,27 +3173,27 @@
 
   @DomName('SVGImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGImageElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGImageElement.instance.height_Getter_(this);
   
   @DomName('SVGImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGImageElement.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGImageElement.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGImageElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGImageElement.instance.width_Getter_(this);
   
   @DomName('SVGImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGImageElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGImageElement.instance.x_Getter_(this);
   
   @DomName('SVGImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGImageElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGImageElement.instance.y_Getter_(this);
   
   @DomName('SVGImageElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGImageElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGImageElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3606,21 +3210,13 @@
   // To suppress missing implicit constructor warnings.
   factory Length._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Length internalCreateLength() {
-    return new Length._internalWrap();
-  }
 
-  factory Length._internalWrap() {
-    return new Length.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Length.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGLength.SVG_LENGTHTYPE_CM')
   @DocsEditable()
   static const int SVG_LENGTHTYPE_CM = 6;
@@ -3667,39 +3263,39 @@
 
   @DomName('SVGLength.unitType')
   @DocsEditable()
-  int get unitType => _blink.BlinkSVGLength.instance.unitType_Getter_(unwrap_jso(this));
+  int get unitType => _blink.BlinkSVGLength.instance.unitType_Getter_(this);
   
   @DomName('SVGLength.value')
   @DocsEditable()
-  num get value => _blink.BlinkSVGLength.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkSVGLength.instance.value_Getter_(this);
   
   @DomName('SVGLength.value')
   @DocsEditable()
-  set value(num value) => _blink.BlinkSVGLength.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkSVGLength.instance.value_Setter_(this, value);
   
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.BlinkSVGLength.instance.valueAsString_Getter_(unwrap_jso(this));
+  String get valueAsString => _blink.BlinkSVGLength.instance.valueAsString_Getter_(this);
   
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  set valueAsString(String value) => _blink.BlinkSVGLength.instance.valueAsString_Setter_(unwrap_jso(this), value);
+  set valueAsString(String value) => _blink.BlinkSVGLength.instance.valueAsString_Setter_(this, value);
   
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Getter_(unwrap_jso(this));
+  num get valueInSpecifiedUnits => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Getter_(this);
   
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Setter_(unwrap_jso(this), value);
+  set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Setter_(this, value);
   
   @DomName('SVGLength.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGLength.instance.convertToSpecifiedUnits_Callback_1_(unwrap_jso(this), unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGLength.instance.convertToSpecifiedUnits_Callback_1_(this, unitType);
   
   @DomName('SVGLength.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGLength.instance.newValueSpecifiedUnits_Callback_2_(unwrap_jso(this), unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGLength.instance.newValueSpecifiedUnits_Callback_2_(this, unitType, valueInSpecifiedUnits);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3716,29 +3312,21 @@
   // To suppress missing implicit constructor warnings.
   factory LengthList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static LengthList internalCreateLengthList() {
-    return new LengthList._internalWrap();
-  }
 
-  factory LengthList._internalWrap() {
-    return new LengthList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LengthList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGLengthList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGLengthList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSVGLengthList.instance.length_Getter_(this);
   
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGLengthList.instance.numberOfItems_Getter_(unwrap_jso(this));
+  int get numberOfItems => _blink.BlinkSVGLengthList.instance.numberOfItems_Getter_(this);
   
   Length operator[](int index) {
     if (index < 0 || index >= length)
@@ -3787,35 +3375,35 @@
   @DomName('SVGLengthList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Length newItem) => _blink.BlinkSVGLengthList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
+  void __setter__(int index, Length newItem) => _blink.BlinkSVGLengthList.instance.$__setter___Callback_2_(this, index, newItem);
   
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length newItem) => wrap_jso(_blink.BlinkSVGLengthList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Length appendItem(Length newItem) => _blink.BlinkSVGLengthList.instance.appendItem_Callback_1_(this, newItem);
   
   @DomName('SVGLengthList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGLengthList.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkSVGLengthList.instance.clear_Callback_0_(this);
   
   @DomName('SVGLengthList.getItem')
   @DocsEditable()
-  Length getItem(int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.getItem_Callback_1_(unwrap_jso(this), index));
+  Length getItem(int index) => _blink.BlinkSVGLengthList.instance.getItem_Callback_1_(this, index);
   
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length newItem) => wrap_jso(_blink.BlinkSVGLengthList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Length initialize(Length newItem) => _blink.BlinkSVGLengthList.instance.initialize_Callback_1_(this, newItem);
   
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length newItem, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Length insertItemBefore(Length newItem, int index) => _blink.BlinkSVGLengthList.instance.insertItemBefore_Callback_2_(this, newItem, index);
   
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
-  Length removeItem(int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
+  Length removeItem(int index) => _blink.BlinkSVGLengthList.instance.removeItem_Callback_1_(this, index);
   
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length newItem, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Length replaceItem(Length newItem, int index) => _blink.BlinkSVGLengthList.instance.replaceItem_Callback_2_(this, newItem, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3838,11 +3426,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static LineElement internalCreateLineElement() {
-    return new LineElement._internalWrap();
-  }
-
-  external factory LineElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LineElement.internal_() : super.internal_();
@@ -3856,19 +3440,19 @@
 
   @DomName('SVGLineElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => wrap_jso(_blink.BlinkSVGLineElement.instance.x1_Getter_(unwrap_jso(this)));
+  AnimatedLength get x1 => _blink.BlinkSVGLineElement.instance.x1_Getter_(this);
   
   @DomName('SVGLineElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => wrap_jso(_blink.BlinkSVGLineElement.instance.x2_Getter_(unwrap_jso(this)));
+  AnimatedLength get x2 => _blink.BlinkSVGLineElement.instance.x2_Getter_(this);
   
   @DomName('SVGLineElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => wrap_jso(_blink.BlinkSVGLineElement.instance.y1_Getter_(unwrap_jso(this)));
+  AnimatedLength get y1 => _blink.BlinkSVGLineElement.instance.y1_Getter_(this);
   
   @DomName('SVGLineElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => wrap_jso(_blink.BlinkSVGLineElement.instance.y2_Getter_(unwrap_jso(this)));
+  AnimatedLength get y2 => _blink.BlinkSVGLineElement.instance.y2_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3891,11 +3475,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static LinearGradientElement internalCreateLinearGradientElement() {
-    return new LinearGradientElement._internalWrap();
-  }
-
-  external factory LinearGradientElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LinearGradientElement.internal_() : super.internal_();
@@ -3909,19 +3489,19 @@
 
   @DomName('SVGLinearGradientElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => wrap_jso(_blink.BlinkSVGLinearGradientElement.instance.x1_Getter_(unwrap_jso(this)));
+  AnimatedLength get x1 => _blink.BlinkSVGLinearGradientElement.instance.x1_Getter_(this);
   
   @DomName('SVGLinearGradientElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => wrap_jso(_blink.BlinkSVGLinearGradientElement.instance.x2_Getter_(unwrap_jso(this)));
+  AnimatedLength get x2 => _blink.BlinkSVGLinearGradientElement.instance.x2_Getter_(this);
   
   @DomName('SVGLinearGradientElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => wrap_jso(_blink.BlinkSVGLinearGradientElement.instance.y1_Getter_(unwrap_jso(this)));
+  AnimatedLength get y1 => _blink.BlinkSVGLinearGradientElement.instance.y1_Getter_(this);
   
   @DomName('SVGLinearGradientElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => wrap_jso(_blink.BlinkSVGLinearGradientElement.instance.y2_Getter_(unwrap_jso(this)));
+  AnimatedLength get y2 => _blink.BlinkSVGLinearGradientElement.instance.y2_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3944,11 +3524,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MarkerElement internalCreateMarkerElement() {
-    return new MarkerElement._internalWrap();
-  }
-
-  external factory MarkerElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MarkerElement.internal_() : super.internal_();
@@ -3986,47 +3562,47 @@
 
   @DomName('SVGMarkerElement.markerHeight')
   @DocsEditable()
-  AnimatedLength get markerHeight => wrap_jso(_blink.BlinkSVGMarkerElement.instance.markerHeight_Getter_(unwrap_jso(this)));
+  AnimatedLength get markerHeight => _blink.BlinkSVGMarkerElement.instance.markerHeight_Getter_(this);
   
   @DomName('SVGMarkerElement.markerUnits')
   @DocsEditable()
-  AnimatedEnumeration get markerUnits => wrap_jso(_blink.BlinkSVGMarkerElement.instance.markerUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get markerUnits => _blink.BlinkSVGMarkerElement.instance.markerUnits_Getter_(this);
   
   @DomName('SVGMarkerElement.markerWidth')
   @DocsEditable()
-  AnimatedLength get markerWidth => wrap_jso(_blink.BlinkSVGMarkerElement.instance.markerWidth_Getter_(unwrap_jso(this)));
+  AnimatedLength get markerWidth => _blink.BlinkSVGMarkerElement.instance.markerWidth_Getter_(this);
   
   @DomName('SVGMarkerElement.orientAngle')
   @DocsEditable()
-  AnimatedAngle get orientAngle => wrap_jso(_blink.BlinkSVGMarkerElement.instance.orientAngle_Getter_(unwrap_jso(this)));
+  AnimatedAngle get orientAngle => _blink.BlinkSVGMarkerElement.instance.orientAngle_Getter_(this);
   
   @DomName('SVGMarkerElement.orientType')
   @DocsEditable()
-  AnimatedEnumeration get orientType => wrap_jso(_blink.BlinkSVGMarkerElement.instance.orientType_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get orientType => _blink.BlinkSVGMarkerElement.instance.orientType_Getter_(this);
   
   @DomName('SVGMarkerElement.refX')
   @DocsEditable()
-  AnimatedLength get refX => wrap_jso(_blink.BlinkSVGMarkerElement.instance.refX_Getter_(unwrap_jso(this)));
+  AnimatedLength get refX => _blink.BlinkSVGMarkerElement.instance.refX_Getter_(this);
   
   @DomName('SVGMarkerElement.refY')
   @DocsEditable()
-  AnimatedLength get refY => wrap_jso(_blink.BlinkSVGMarkerElement.instance.refY_Getter_(unwrap_jso(this)));
+  AnimatedLength get refY => _blink.BlinkSVGMarkerElement.instance.refY_Getter_(this);
   
   @DomName('SVGMarkerElement.setOrientToAngle')
   @DocsEditable()
-  void setOrientToAngle(Angle angle) => _blink.BlinkSVGMarkerElement.instance.setOrientToAngle_Callback_1_(unwrap_jso(this), unwrap_jso(angle));
+  void setOrientToAngle(Angle angle) => _blink.BlinkSVGMarkerElement.instance.setOrientToAngle_Callback_1_(this, angle);
   
   @DomName('SVGMarkerElement.setOrientToAuto')
   @DocsEditable()
-  void setOrientToAuto() => _blink.BlinkSVGMarkerElement.instance.setOrientToAuto_Callback_0_(unwrap_jso(this));
+  void setOrientToAuto() => _blink.BlinkSVGMarkerElement.instance.setOrientToAuto_Callback_0_(this);
   
   @DomName('SVGMarkerElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGMarkerElement.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGMarkerElement.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGMarkerElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => wrap_jso(_blink.BlinkSVGMarkerElement.instance.viewBox_Getter_(unwrap_jso(this)));
+  AnimatedRect get viewBox => _blink.BlinkSVGMarkerElement.instance.viewBox_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4049,11 +3625,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MaskElement internalCreateMaskElement() {
-    return new MaskElement._internalWrap();
-  }
-
-  external factory MaskElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MaskElement.internal_() : super.internal_();
@@ -4067,43 +3639,43 @@
 
   @DomName('SVGMaskElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGMaskElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGMaskElement.instance.height_Getter_(this);
   
   @DomName('SVGMaskElement.maskContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskContentUnits => wrap_jso(_blink.BlinkSVGMaskElement.instance.maskContentUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get maskContentUnits => _blink.BlinkSVGMaskElement.instance.maskContentUnits_Getter_(this);
   
   @DomName('SVGMaskElement.maskUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskUnits => wrap_jso(_blink.BlinkSVGMaskElement.instance.maskUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get maskUnits => _blink.BlinkSVGMaskElement.instance.maskUnits_Getter_(this);
   
   @DomName('SVGMaskElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGMaskElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGMaskElement.instance.width_Getter_(this);
   
   @DomName('SVGMaskElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGMaskElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGMaskElement.instance.x_Getter_(this);
   
   @DomName('SVGMaskElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGMaskElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGMaskElement.instance.y_Getter_(this);
   
   @DomName('SVGMaskElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGMaskElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
+  StringList get requiredExtensions => _blink.BlinkSVGMaskElement.instance.requiredExtensions_Getter_(this);
   
   @DomName('SVGMaskElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGMaskElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
+  StringList get requiredFeatures => _blink.BlinkSVGMaskElement.instance.requiredFeatures_Getter_(this);
   
   @DomName('SVGMaskElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGMaskElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
+  StringList get systemLanguage => _blink.BlinkSVGMaskElement.instance.systemLanguage_Getter_(this);
   
   @DomName('SVGMaskElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGMaskElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGMaskElement.instance.hasExtension_Callback_1_(this, extension);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4120,112 +3692,104 @@
   // To suppress missing implicit constructor warnings.
   factory Matrix._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Matrix internalCreateMatrix() {
-    return new Matrix._internalWrap();
-  }
 
-  factory Matrix._internalWrap() {
-    return new Matrix.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Matrix.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  num get a => _blink.BlinkSVGMatrix.instance.a_Getter_(unwrap_jso(this));
+  num get a => _blink.BlinkSVGMatrix.instance.a_Getter_(this);
   
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  set a(num value) => _blink.BlinkSVGMatrix.instance.a_Setter_(unwrap_jso(this), value);
+  set a(num value) => _blink.BlinkSVGMatrix.instance.a_Setter_(this, value);
   
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  num get b => _blink.BlinkSVGMatrix.instance.b_Getter_(unwrap_jso(this));
+  num get b => _blink.BlinkSVGMatrix.instance.b_Getter_(this);
   
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  set b(num value) => _blink.BlinkSVGMatrix.instance.b_Setter_(unwrap_jso(this), value);
+  set b(num value) => _blink.BlinkSVGMatrix.instance.b_Setter_(this, value);
   
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  num get c => _blink.BlinkSVGMatrix.instance.c_Getter_(unwrap_jso(this));
+  num get c => _blink.BlinkSVGMatrix.instance.c_Getter_(this);
   
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  set c(num value) => _blink.BlinkSVGMatrix.instance.c_Setter_(unwrap_jso(this), value);
+  set c(num value) => _blink.BlinkSVGMatrix.instance.c_Setter_(this, value);
   
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  num get d => _blink.BlinkSVGMatrix.instance.d_Getter_(unwrap_jso(this));
+  num get d => _blink.BlinkSVGMatrix.instance.d_Getter_(this);
   
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  set d(num value) => _blink.BlinkSVGMatrix.instance.d_Setter_(unwrap_jso(this), value);
+  set d(num value) => _blink.BlinkSVGMatrix.instance.d_Setter_(this, value);
   
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  num get e => _blink.BlinkSVGMatrix.instance.e_Getter_(unwrap_jso(this));
+  num get e => _blink.BlinkSVGMatrix.instance.e_Getter_(this);
   
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  set e(num value) => _blink.BlinkSVGMatrix.instance.e_Setter_(unwrap_jso(this), value);
+  set e(num value) => _blink.BlinkSVGMatrix.instance.e_Setter_(this, value);
   
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  num get f => _blink.BlinkSVGMatrix.instance.f_Getter_(unwrap_jso(this));
+  num get f => _blink.BlinkSVGMatrix.instance.f_Getter_(this);
   
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  set f(num value) => _blink.BlinkSVGMatrix.instance.f_Setter_(unwrap_jso(this), value);
+  set f(num value) => _blink.BlinkSVGMatrix.instance.f_Setter_(this, value);
   
   @DomName('SVGMatrix.flipX')
   @DocsEditable()
-  Matrix flipX() => wrap_jso(_blink.BlinkSVGMatrix.instance.flipX_Callback_0_(unwrap_jso(this)));
+  Matrix flipX() => _blink.BlinkSVGMatrix.instance.flipX_Callback_0_(this);
   
   @DomName('SVGMatrix.flipY')
   @DocsEditable()
-  Matrix flipY() => wrap_jso(_blink.BlinkSVGMatrix.instance.flipY_Callback_0_(unwrap_jso(this)));
+  Matrix flipY() => _blink.BlinkSVGMatrix.instance.flipY_Callback_0_(this);
   
   @DomName('SVGMatrix.inverse')
   @DocsEditable()
-  Matrix inverse() => wrap_jso(_blink.BlinkSVGMatrix.instance.inverse_Callback_0_(unwrap_jso(this)));
+  Matrix inverse() => _blink.BlinkSVGMatrix.instance.inverse_Callback_0_(this);
   
   @DomName('SVGMatrix.multiply')
   @DocsEditable()
-  Matrix multiply(Matrix secondMatrix) => wrap_jso(_blink.BlinkSVGMatrix.instance.multiply_Callback_1_(unwrap_jso(this), unwrap_jso(secondMatrix)));
+  Matrix multiply(Matrix secondMatrix) => _blink.BlinkSVGMatrix.instance.multiply_Callback_1_(this, secondMatrix);
   
   @DomName('SVGMatrix.rotate')
   @DocsEditable()
-  Matrix rotate(num angle) => wrap_jso(_blink.BlinkSVGMatrix.instance.rotate_Callback_1_(unwrap_jso(this), angle));
+  Matrix rotate(num angle) => _blink.BlinkSVGMatrix.instance.rotate_Callback_1_(this, angle);
   
   @DomName('SVGMatrix.rotateFromVector')
   @DocsEditable()
-  Matrix rotateFromVector(num x, num y) => wrap_jso(_blink.BlinkSVGMatrix.instance.rotateFromVector_Callback_2_(unwrap_jso(this), x, y));
+  Matrix rotateFromVector(num x, num y) => _blink.BlinkSVGMatrix.instance.rotateFromVector_Callback_2_(this, x, y);
   
   @DomName('SVGMatrix.scale')
   @DocsEditable()
-  Matrix scale(num scaleFactor) => wrap_jso(_blink.BlinkSVGMatrix.instance.scale_Callback_1_(unwrap_jso(this), scaleFactor));
+  Matrix scale(num scaleFactor) => _blink.BlinkSVGMatrix.instance.scale_Callback_1_(this, scaleFactor);
   
   @DomName('SVGMatrix.scaleNonUniform')
   @DocsEditable()
-  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => wrap_jso(_blink.BlinkSVGMatrix.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), scaleFactorX, scaleFactorY));
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.BlinkSVGMatrix.instance.scaleNonUniform_Callback_2_(this, scaleFactorX, scaleFactorY);
   
   @DomName('SVGMatrix.skewX')
   @DocsEditable()
-  Matrix skewX(num angle) => wrap_jso(_blink.BlinkSVGMatrix.instance.skewX_Callback_1_(unwrap_jso(this), angle));
+  Matrix skewX(num angle) => _blink.BlinkSVGMatrix.instance.skewX_Callback_1_(this, angle);
   
   @DomName('SVGMatrix.skewY')
   @DocsEditable()
-  Matrix skewY(num angle) => wrap_jso(_blink.BlinkSVGMatrix.instance.skewY_Callback_1_(unwrap_jso(this), angle));
+  Matrix skewY(num angle) => _blink.BlinkSVGMatrix.instance.skewY_Callback_1_(this, angle);
   
   @DomName('SVGMatrix.translate')
   @DocsEditable()
-  Matrix translate(num x, num y) => wrap_jso(_blink.BlinkSVGMatrix.instance.translate_Callback_2_(unwrap_jso(this), x, y));
+  Matrix translate(num x, num y) => _blink.BlinkSVGMatrix.instance.translate_Callback_2_(this, x, y);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4244,11 +3808,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MetadataElement internalCreateMetadataElement() {
-    return new MetadataElement._internalWrap();
-  }
-
-  external factory MetadataElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MetadataElement.internal_() : super.internal_();
@@ -4275,28 +3835,20 @@
   // To suppress missing implicit constructor warnings.
   factory Number._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Number internalCreateNumber() {
-    return new Number._internalWrap();
-  }
 
-  factory Number._internalWrap() {
-    return new Number.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Number.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGNumber.value')
   @DocsEditable()
-  num get value => _blink.BlinkSVGNumber.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkSVGNumber.instance.value_Getter_(this);
   
   @DomName('SVGNumber.value')
   @DocsEditable()
-  set value(num value) => _blink.BlinkSVGNumber.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkSVGNumber.instance.value_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4313,29 +3865,21 @@
   // To suppress missing implicit constructor warnings.
   factory NumberList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static NumberList internalCreateNumberList() {
-    return new NumberList._internalWrap();
-  }
 
-  factory NumberList._internalWrap() {
-    return new NumberList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   NumberList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGNumberList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGNumberList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSVGNumberList.instance.length_Getter_(this);
   
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGNumberList.instance.numberOfItems_Getter_(unwrap_jso(this));
+  int get numberOfItems => _blink.BlinkSVGNumberList.instance.numberOfItems_Getter_(this);
   
   Number operator[](int index) {
     if (index < 0 || index >= length)
@@ -4384,35 +3928,35 @@
   @DomName('SVGNumberList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Number newItem) => _blink.BlinkSVGNumberList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
+  void __setter__(int index, Number newItem) => _blink.BlinkSVGNumberList.instance.$__setter___Callback_2_(this, index, newItem);
   
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number newItem) => wrap_jso(_blink.BlinkSVGNumberList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Number appendItem(Number newItem) => _blink.BlinkSVGNumberList.instance.appendItem_Callback_1_(this, newItem);
   
   @DomName('SVGNumberList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGNumberList.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkSVGNumberList.instance.clear_Callback_0_(this);
   
   @DomName('SVGNumberList.getItem')
   @DocsEditable()
-  Number getItem(int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.getItem_Callback_1_(unwrap_jso(this), index));
+  Number getItem(int index) => _blink.BlinkSVGNumberList.instance.getItem_Callback_1_(this, index);
   
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number newItem) => wrap_jso(_blink.BlinkSVGNumberList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Number initialize(Number newItem) => _blink.BlinkSVGNumberList.instance.initialize_Callback_1_(this, newItem);
   
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number newItem, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Number insertItemBefore(Number newItem, int index) => _blink.BlinkSVGNumberList.instance.insertItemBefore_Callback_2_(this, newItem, index);
   
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
-  Number removeItem(int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
+  Number removeItem(int index) => _blink.BlinkSVGNumberList.instance.removeItem_Callback_1_(this, index);
   
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number newItem, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Number replaceItem(Number newItem, int index) => _blink.BlinkSVGNumberList.instance.replaceItem_Callback_2_(this, newItem, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4435,11 +3979,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathElement internalCreatePathElement() {
-    return new PathElement._internalWrap();
-  }
-
-  external factory PathElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathElement.internal_() : super.internal_();
@@ -4453,111 +3993,111 @@
 
   @DomName('SVGPathElement.animatedNormalizedPathSegList')
   @DocsEditable()
-  PathSegList get animatedNormalizedPathSegList => wrap_jso(_blink.BlinkSVGPathElement.instance.animatedNormalizedPathSegList_Getter_(unwrap_jso(this)));
+  PathSegList get animatedNormalizedPathSegList => _blink.BlinkSVGPathElement.instance.animatedNormalizedPathSegList_Getter_(this);
   
   @DomName('SVGPathElement.animatedPathSegList')
   @DocsEditable()
-  PathSegList get animatedPathSegList => wrap_jso(_blink.BlinkSVGPathElement.instance.animatedPathSegList_Getter_(unwrap_jso(this)));
+  PathSegList get animatedPathSegList => _blink.BlinkSVGPathElement.instance.animatedPathSegList_Getter_(this);
   
   @DomName('SVGPathElement.normalizedPathSegList')
   @DocsEditable()
-  PathSegList get normalizedPathSegList => wrap_jso(_blink.BlinkSVGPathElement.instance.normalizedPathSegList_Getter_(unwrap_jso(this)));
+  PathSegList get normalizedPathSegList => _blink.BlinkSVGPathElement.instance.normalizedPathSegList_Getter_(this);
   
   @DomName('SVGPathElement.pathLength')
   @DocsEditable()
-  AnimatedNumber get pathLength => wrap_jso(_blink.BlinkSVGPathElement.instance.pathLength_Getter_(unwrap_jso(this)));
+  AnimatedNumber get pathLength => _blink.BlinkSVGPathElement.instance.pathLength_Getter_(this);
   
   @DomName('SVGPathElement.pathSegList')
   @DocsEditable()
-  PathSegList get pathSegList => wrap_jso(_blink.BlinkSVGPathElement.instance.pathSegList_Getter_(unwrap_jso(this)));
+  PathSegList get pathSegList => _blink.BlinkSVGPathElement.instance.pathSegList_Getter_(this);
   
   @DomName('SVGPathElement.createSVGPathSegArcAbs')
   @DocsEditable()
-  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegArcAbs_Callback_7_(unwrap_jso(this), x, y, r1, r2, angle, largeArcFlag, sweepFlag));
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.instance.createSVGPathSegArcAbs_Callback_7_(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
   
   @DomName('SVGPathElement.createSVGPathSegArcRel')
   @DocsEditable()
-  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegArcRel_Callback_7_(unwrap_jso(this), x, y, r1, r2, angle, largeArcFlag, sweepFlag));
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.instance.createSVGPathSegArcRel_Callback_7_(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
   
   @DomName('SVGPathElement.createSVGPathSegClosePath')
   @DocsEditable()
-  PathSegClosePath createSvgPathSegClosePath() => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegClosePath_Callback_0_(unwrap_jso(this)));
+  PathSegClosePath createSvgPathSegClosePath() => _blink.BlinkSVGPathElement.instance.createSVGPathSegClosePath_Callback_0_(this);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   @DocsEditable()
-  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicAbs_Callback_6_(unwrap_jso(this), x, y, x1, y1, x2, y2));
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicAbs_Callback_6_(this, x, y, x1, y1, x2, y2);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   @DocsEditable()
-  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicRel_Callback_6_(unwrap_jso(this), x, y, x1, y1, x2, y2));
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicRel_Callback_6_(this, x, y, x1, y1, x2, y2);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(unwrap_jso(this), x, y, x2, y2));
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(this, x, y, x2, y2);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(unwrap_jso(this), x, y, x2, y2));
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(this, x, y, x2, y2);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticAbs_Callback_4_(unwrap_jso(this), x, y, x1, y1));
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticAbs_Callback_4_(this, x, y, x1, y1);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticRel_Callback_4_(unwrap_jso(this), x, y, x1, y1));
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticRel_Callback_4_(this, x, y, x1, y1);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(unwrap_jso(this), x, y));
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(this, x, y);
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(unwrap_jso(this), x, y));
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(this, x, y);
   
   @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   @DocsEditable()
-  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoAbs_Callback_2_(unwrap_jso(this), x, y));
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoAbs_Callback_2_(this, x, y);
   
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   @DocsEditable()
-  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalAbs_Callback_1_(unwrap_jso(this), x));
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalAbs_Callback_1_(this, x);
   
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   @DocsEditable()
-  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalRel_Callback_1_(unwrap_jso(this), x));
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalRel_Callback_1_(this, x);
   
   @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   @DocsEditable()
-  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoRel_Callback_2_(unwrap_jso(this), x, y));
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoRel_Callback_2_(this, x, y);
   
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   @DocsEditable()
-  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalAbs_Callback_1_(unwrap_jso(this), y));
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalAbs_Callback_1_(this, y);
   
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   @DocsEditable()
-  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalRel_Callback_1_(unwrap_jso(this), y));
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalRel_Callback_1_(this, y);
   
   @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   @DocsEditable()
-  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoAbs_Callback_2_(unwrap_jso(this), x, y));
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoAbs_Callback_2_(this, x, y);
   
   @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   @DocsEditable()
-  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoRel_Callback_2_(unwrap_jso(this), x, y));
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoRel_Callback_2_(this, x, y);
   
   @DomName('SVGPathElement.getPathSegAtLength')
   @DocsEditable()
-  int getPathSegAtLength(num distance) => _blink.BlinkSVGPathElement.instance.getPathSegAtLength_Callback_1_(unwrap_jso(this), distance);
+  int getPathSegAtLength(num distance) => _blink.BlinkSVGPathElement.instance.getPathSegAtLength_Callback_1_(this, distance);
   
   @DomName('SVGPathElement.getPointAtLength')
   @DocsEditable()
-  Point getPointAtLength(num distance) => wrap_jso(_blink.BlinkSVGPathElement.instance.getPointAtLength_Callback_1_(unwrap_jso(this), distance));
+  Point getPointAtLength(num distance) => _blink.BlinkSVGPathElement.instance.getPointAtLength_Callback_1_(this, distance);
   
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  num getTotalLength() => _blink.BlinkSVGPathElement.instance.getTotalLength_Callback_0_(unwrap_jso(this));
+  num getTotalLength() => _blink.BlinkSVGPathElement.instance.getTotalLength_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4574,21 +4114,13 @@
   // To suppress missing implicit constructor warnings.
   factory PathSeg._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PathSeg internalCreatePathSeg() {
-    return new PathSeg._internalWrap();
-  }
 
-  factory PathSeg._internalWrap() {
-    return new PathSeg.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSeg.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGPathSeg.PATHSEG_ARC_ABS')
   @DocsEditable()
   static const int PATHSEG_ARC_ABS = 10;
@@ -4671,11 +4203,11 @@
 
   @DomName('SVGPathSeg.pathSegType')
   @DocsEditable()
-  int get pathSegType => _blink.BlinkSVGPathSeg.instance.pathSegType_Getter_(unwrap_jso(this));
+  int get pathSegType => _blink.BlinkSVGPathSeg.instance.pathSegType_Getter_(this);
   
   @DomName('SVGPathSeg.pathSegTypeAsLetter')
   @DocsEditable()
-  String get pathSegTypeAsLetter => _blink.BlinkSVGPathSeg.instance.pathSegTypeAsLetter_Getter_(unwrap_jso(this));
+  String get pathSegTypeAsLetter => _blink.BlinkSVGPathSeg.instance.pathSegTypeAsLetter_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4694,11 +4226,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegArcAbs internalCreatePathSegArcAbs() {
-    return new PathSegArcAbs._internalWrap();
-  }
-
-  external factory PathSegArcAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegArcAbs.internal_() : super.internal_();
@@ -4706,59 +4234,59 @@
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  num get angle => _blink.BlinkSVGPathSegArcAbs.instance.angle_Getter_(unwrap_jso(this));
+  num get angle => _blink.BlinkSVGPathSegArcAbs.instance.angle_Getter_(this);
   
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  set angle(num value) => _blink.BlinkSVGPathSegArcAbs.instance.angle_Setter_(unwrap_jso(this), value);
+  set angle(num value) => _blink.BlinkSVGPathSegArcAbs.instance.angle_Setter_(this, value);
   
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Getter_(unwrap_jso(this));
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Getter_(this);
   
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Setter_(unwrap_jso(this), value);
+  set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Setter_(this, value);
   
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  num get r1 => _blink.BlinkSVGPathSegArcAbs.instance.r1_Getter_(unwrap_jso(this));
+  num get r1 => _blink.BlinkSVGPathSegArcAbs.instance.r1_Getter_(this);
   
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  set r1(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r1_Setter_(unwrap_jso(this), value);
+  set r1(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r1_Setter_(this, value);
   
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  num get r2 => _blink.BlinkSVGPathSegArcAbs.instance.r2_Getter_(unwrap_jso(this));
+  num get r2 => _blink.BlinkSVGPathSegArcAbs.instance.r2_Getter_(this);
   
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  set r2(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r2_Setter_(unwrap_jso(this), value);
+  set r2(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r2_Setter_(this, value);
   
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Getter_(unwrap_jso(this));
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Getter_(this);
   
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Setter_(unwrap_jso(this), value);
+  set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Setter_(this, value);
   
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegArcAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegArcAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegArcAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegArcAbs.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegArcAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegArcAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegArcAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegArcAbs.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4777,11 +4305,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegArcRel internalCreatePathSegArcRel() {
-    return new PathSegArcRel._internalWrap();
-  }
-
-  external factory PathSegArcRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegArcRel.internal_() : super.internal_();
@@ -4789,59 +4313,59 @@
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  num get angle => _blink.BlinkSVGPathSegArcRel.instance.angle_Getter_(unwrap_jso(this));
+  num get angle => _blink.BlinkSVGPathSegArcRel.instance.angle_Getter_(this);
   
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  set angle(num value) => _blink.BlinkSVGPathSegArcRel.instance.angle_Setter_(unwrap_jso(this), value);
+  set angle(num value) => _blink.BlinkSVGPathSegArcRel.instance.angle_Setter_(this, value);
   
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Getter_(unwrap_jso(this));
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Getter_(this);
   
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Setter_(unwrap_jso(this), value);
+  set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Setter_(this, value);
   
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  num get r1 => _blink.BlinkSVGPathSegArcRel.instance.r1_Getter_(unwrap_jso(this));
+  num get r1 => _blink.BlinkSVGPathSegArcRel.instance.r1_Getter_(this);
   
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  set r1(num value) => _blink.BlinkSVGPathSegArcRel.instance.r1_Setter_(unwrap_jso(this), value);
+  set r1(num value) => _blink.BlinkSVGPathSegArcRel.instance.r1_Setter_(this, value);
   
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  num get r2 => _blink.BlinkSVGPathSegArcRel.instance.r2_Getter_(unwrap_jso(this));
+  num get r2 => _blink.BlinkSVGPathSegArcRel.instance.r2_Getter_(this);
   
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  set r2(num value) => _blink.BlinkSVGPathSegArcRel.instance.r2_Setter_(unwrap_jso(this), value);
+  set r2(num value) => _blink.BlinkSVGPathSegArcRel.instance.r2_Setter_(this, value);
   
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Getter_(unwrap_jso(this));
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Getter_(this);
   
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Setter_(unwrap_jso(this), value);
+  set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Setter_(this, value);
   
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegArcRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegArcRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegArcRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegArcRel.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegArcRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegArcRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegArcRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegArcRel.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4860,11 +4384,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegClosePath internalCreatePathSegClosePath() {
-    return new PathSegClosePath._internalWrap();
-  }
-
-  external factory PathSegClosePath._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegClosePath.internal_() : super.internal_();
@@ -4887,11 +4407,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoCubicAbs internalCreatePathSegCurvetoCubicAbs() {
-    return new PathSegCurvetoCubicAbs._internalWrap();
-  }
-
-  external factory PathSegCurvetoCubicAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoCubicAbs.internal_() : super.internal_();
@@ -4899,51 +4415,51 @@
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Getter_(unwrap_jso(this));
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Getter_(unwrap_jso(this));
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Getter_(unwrap_jso(this));
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Getter_(unwrap_jso(this));
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4962,11 +4478,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoCubicRel internalCreatePathSegCurvetoCubicRel() {
-    return new PathSegCurvetoCubicRel._internalWrap();
-  }
-
-  external factory PathSegCurvetoCubicRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoCubicRel.internal_() : super.internal_();
@@ -4974,51 +4486,51 @@
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Getter_(unwrap_jso(this));
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Getter_(unwrap_jso(this));
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Getter_(unwrap_jso(this));
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Getter_(unwrap_jso(this));
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5037,11 +4549,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoCubicSmoothAbs internalCreatePathSegCurvetoCubicSmoothAbs() {
-    return new PathSegCurvetoCubicSmoothAbs._internalWrap();
-  }
-
-  external factory PathSegCurvetoCubicSmoothAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoCubicSmoothAbs.internal_() : super.internal_();
@@ -5049,35 +4557,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Getter_(unwrap_jso(this));
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Getter_(unwrap_jso(this));
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5096,11 +4604,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoCubicSmoothRel internalCreatePathSegCurvetoCubicSmoothRel() {
-    return new PathSegCurvetoCubicSmoothRel._internalWrap();
-  }
-
-  external factory PathSegCurvetoCubicSmoothRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoCubicSmoothRel.internal_() : super.internal_();
@@ -5108,35 +4612,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Getter_(unwrap_jso(this));
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Getter_(unwrap_jso(this));
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Getter_(this);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5155,11 +4659,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoQuadraticAbs internalCreatePathSegCurvetoQuadraticAbs() {
-    return new PathSegCurvetoQuadraticAbs._internalWrap();
-  }
-
-  external factory PathSegCurvetoQuadraticAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoQuadraticAbs.internal_() : super.internal_();
@@ -5167,35 +4667,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Getter_(unwrap_jso(this));
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Getter_(unwrap_jso(this));
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5214,11 +4714,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoQuadraticRel internalCreatePathSegCurvetoQuadraticRel() {
-    return new PathSegCurvetoQuadraticRel._internalWrap();
-  }
-
-  external factory PathSegCurvetoQuadraticRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoQuadraticRel.internal_() : super.internal_();
@@ -5226,35 +4722,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Getter_(unwrap_jso(this));
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Getter_(unwrap_jso(this));
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5273,11 +4769,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoQuadraticSmoothAbs internalCreatePathSegCurvetoQuadraticSmoothAbs() {
-    return new PathSegCurvetoQuadraticSmoothAbs._internalWrap();
-  }
-
-  external factory PathSegCurvetoQuadraticSmoothAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoQuadraticSmoothAbs.internal_() : super.internal_();
@@ -5285,19 +4777,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5316,11 +4808,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegCurvetoQuadraticSmoothRel internalCreatePathSegCurvetoQuadraticSmoothRel() {
-    return new PathSegCurvetoQuadraticSmoothRel._internalWrap();
-  }
-
-  external factory PathSegCurvetoQuadraticSmoothRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegCurvetoQuadraticSmoothRel.internal_() : super.internal_();
@@ -5328,19 +4816,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5359,11 +4847,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegLinetoAbs internalCreatePathSegLinetoAbs() {
-    return new PathSegLinetoAbs._internalWrap();
-  }
-
-  external factory PathSegLinetoAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegLinetoAbs.internal_() : super.internal_();
@@ -5371,19 +4855,19 @@
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5402,11 +4886,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegLinetoHorizontalAbs internalCreatePathSegLinetoHorizontalAbs() {
-    return new PathSegLinetoHorizontalAbs._internalWrap();
-  }
-
-  external factory PathSegLinetoHorizontalAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegLinetoHorizontalAbs.internal_() : super.internal_();
@@ -5414,11 +4894,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5437,11 +4917,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegLinetoHorizontalRel internalCreatePathSegLinetoHorizontalRel() {
-    return new PathSegLinetoHorizontalRel._internalWrap();
-  }
-
-  external factory PathSegLinetoHorizontalRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegLinetoHorizontalRel.internal_() : super.internal_();
@@ -5449,11 +4925,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5472,11 +4948,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegLinetoRel internalCreatePathSegLinetoRel() {
-    return new PathSegLinetoRel._internalWrap();
-  }
-
-  external factory PathSegLinetoRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegLinetoRel.internal_() : super.internal_();
@@ -5484,19 +4956,19 @@
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegLinetoRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegLinetoRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5515,11 +4987,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegLinetoVerticalAbs internalCreatePathSegLinetoVerticalAbs() {
-    return new PathSegLinetoVerticalAbs._internalWrap();
-  }
-
-  external factory PathSegLinetoVerticalAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegLinetoVerticalAbs.internal_() : super.internal_();
@@ -5527,11 +4995,11 @@
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5550,11 +5018,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegLinetoVerticalRel internalCreatePathSegLinetoVerticalRel() {
-    return new PathSegLinetoVerticalRel._internalWrap();
-  }
-
-  external factory PathSegLinetoVerticalRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegLinetoVerticalRel.internal_() : super.internal_();
@@ -5562,11 +5026,11 @@
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5583,29 +5047,21 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PathSegList internalCreatePathSegList() {
-    return new PathSegList._internalWrap();
-  }
 
-  factory PathSegList._internalWrap() {
-    return new PathSegList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGPathSegList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGPathSegList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSVGPathSegList.instance.length_Getter_(this);
   
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGPathSegList.instance.numberOfItems_Getter_(unwrap_jso(this));
+  int get numberOfItems => _blink.BlinkSVGPathSegList.instance.numberOfItems_Getter_(this);
   
   PathSeg operator[](int index) {
     if (index < 0 || index >= length)
@@ -5654,35 +5110,35 @@
   @DomName('SVGPathSegList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
+  void __setter__(int index, PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.$__setter___Callback_2_(this, index, newItem);
   
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
-  PathSeg appendItem(PathSeg newItem) => wrap_jso(_blink.BlinkSVGPathSegList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  PathSeg appendItem(PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.appendItem_Callback_1_(this, newItem);
   
   @DomName('SVGPathSegList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGPathSegList.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkSVGPathSegList.instance.clear_Callback_0_(this);
   
   @DomName('SVGPathSegList.getItem')
   @DocsEditable()
-  PathSeg getItem(int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.getItem_Callback_1_(unwrap_jso(this), index));
+  PathSeg getItem(int index) => _blink.BlinkSVGPathSegList.instance.getItem_Callback_1_(this, index);
   
   @DomName('SVGPathSegList.initialize')
   @DocsEditable()
-  PathSeg initialize(PathSeg newItem) => wrap_jso(_blink.BlinkSVGPathSegList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  PathSeg initialize(PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.initialize_Callback_1_(this, newItem);
   
   @DomName('SVGPathSegList.insertItemBefore')
   @DocsEditable()
-  PathSeg insertItemBefore(PathSeg newItem, int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.instance.insertItemBefore_Callback_2_(this, newItem, index);
   
   @DomName('SVGPathSegList.removeItem')
   @DocsEditable()
-  PathSeg removeItem(int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
+  PathSeg removeItem(int index) => _blink.BlinkSVGPathSegList.instance.removeItem_Callback_1_(this, index);
   
   @DomName('SVGPathSegList.replaceItem')
   @DocsEditable()
-  PathSeg replaceItem(PathSeg newItem, int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  PathSeg replaceItem(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.instance.replaceItem_Callback_2_(this, newItem, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5701,11 +5157,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegMovetoAbs internalCreatePathSegMovetoAbs() {
-    return new PathSegMovetoAbs._internalWrap();
-  }
-
-  external factory PathSegMovetoAbs._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegMovetoAbs.internal_() : super.internal_();
@@ -5713,19 +5165,19 @@
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Getter_(this);
   
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Getter_(this);
   
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5744,11 +5196,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PathSegMovetoRel internalCreatePathSegMovetoRel() {
-    return new PathSegMovetoRel._internalWrap();
-  }
-
-  external factory PathSegMovetoRel._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PathSegMovetoRel.internal_() : super.internal_();
@@ -5756,19 +5204,19 @@
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegMovetoRel.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPathSegMovetoRel.instance.x_Getter_(this);
   
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.x_Setter_(this, value);
   
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegMovetoRel.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPathSegMovetoRel.instance.y_Getter_(this);
   
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5791,11 +5239,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PatternElement internalCreatePatternElement() {
-    return new PatternElement._internalWrap();
-  }
-
-  external factory PatternElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PatternElement.internal_() : super.internal_();
@@ -5809,59 +5253,59 @@
 
   @DomName('SVGPatternElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGPatternElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGPatternElement.instance.height_Getter_(this);
   
   @DomName('SVGPatternElement.patternContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternContentUnits => wrap_jso(_blink.BlinkSVGPatternElement.instance.patternContentUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get patternContentUnits => _blink.BlinkSVGPatternElement.instance.patternContentUnits_Getter_(this);
   
   @DomName('SVGPatternElement.patternTransform')
   @DocsEditable()
-  AnimatedTransformList get patternTransform => wrap_jso(_blink.BlinkSVGPatternElement.instance.patternTransform_Getter_(unwrap_jso(this)));
+  AnimatedTransformList get patternTransform => _blink.BlinkSVGPatternElement.instance.patternTransform_Getter_(this);
   
   @DomName('SVGPatternElement.patternUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternUnits => wrap_jso(_blink.BlinkSVGPatternElement.instance.patternUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get patternUnits => _blink.BlinkSVGPatternElement.instance.patternUnits_Getter_(this);
   
   @DomName('SVGPatternElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGPatternElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGPatternElement.instance.width_Getter_(this);
   
   @DomName('SVGPatternElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGPatternElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGPatternElement.instance.x_Getter_(this);
   
   @DomName('SVGPatternElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGPatternElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGPatternElement.instance.y_Getter_(this);
   
   @DomName('SVGPatternElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGPatternElement.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGPatternElement.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGPatternElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => wrap_jso(_blink.BlinkSVGPatternElement.instance.viewBox_Getter_(unwrap_jso(this)));
+  AnimatedRect get viewBox => _blink.BlinkSVGPatternElement.instance.viewBox_Getter_(this);
   
   @DomName('SVGPatternElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGPatternElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
+  StringList get requiredExtensions => _blink.BlinkSVGPatternElement.instance.requiredExtensions_Getter_(this);
   
   @DomName('SVGPatternElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGPatternElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
+  StringList get requiredFeatures => _blink.BlinkSVGPatternElement.instance.requiredFeatures_Getter_(this);
   
   @DomName('SVGPatternElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGPatternElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
+  StringList get systemLanguage => _blink.BlinkSVGPatternElement.instance.systemLanguage_Getter_(this);
   
   @DomName('SVGPatternElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGPatternElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGPatternElement.instance.hasExtension_Callback_1_(this, extension);
   
   @DomName('SVGPatternElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGPatternElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGPatternElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5878,40 +5322,32 @@
   // To suppress missing implicit constructor warnings.
   factory Point._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Point internalCreatePoint() {
-    return new Point._internalWrap();
-  }
 
-  factory Point._internalWrap() {
-    return new Point.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Point.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGPoint.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPoint.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGPoint.instance.x_Getter_(this);
   
   @DomName('SVGPoint.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGPoint.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPoint.instance.x_Setter_(this, value);
   
   @DomName('SVGPoint.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPoint.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGPoint.instance.y_Getter_(this);
   
   @DomName('SVGPoint.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGPoint.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPoint.instance.y_Setter_(this, value);
   
   @DomName('SVGPoint.matrixTransform')
   @DocsEditable()
-  Point matrixTransform(Matrix matrix) => wrap_jso(_blink.BlinkSVGPoint.instance.matrixTransform_Callback_1_(unwrap_jso(this), unwrap_jso(matrix)));
+  Point matrixTransform(Matrix matrix) => _blink.BlinkSVGPoint.instance.matrixTransform_Callback_1_(this, matrix);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5928,62 +5364,54 @@
   // To suppress missing implicit constructor warnings.
   factory PointList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PointList internalCreatePointList() {
-    return new PointList._internalWrap();
-  }
 
-  factory PointList._internalWrap() {
-    return new PointList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PointList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGPointList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGPointList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSVGPointList.instance.length_Getter_(this);
   
   @DomName('SVGPointList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGPointList.instance.numberOfItems_Getter_(unwrap_jso(this));
+  int get numberOfItems => _blink.BlinkSVGPointList.instance.numberOfItems_Getter_(this);
   
   @DomName('SVGPointList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Point newItem) => _blink.BlinkSVGPointList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
+  void __setter__(int index, Point newItem) => _blink.BlinkSVGPointList.instance.$__setter___Callback_2_(this, index, newItem);
   
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point newItem) => wrap_jso(_blink.BlinkSVGPointList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Point appendItem(Point newItem) => _blink.BlinkSVGPointList.instance.appendItem_Callback_1_(this, newItem);
   
   @DomName('SVGPointList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGPointList.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkSVGPointList.instance.clear_Callback_0_(this);
   
   @DomName('SVGPointList.getItem')
   @DocsEditable()
-  Point getItem(int index) => wrap_jso(_blink.BlinkSVGPointList.instance.getItem_Callback_1_(unwrap_jso(this), index));
+  Point getItem(int index) => _blink.BlinkSVGPointList.instance.getItem_Callback_1_(this, index);
   
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point newItem) => wrap_jso(_blink.BlinkSVGPointList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Point initialize(Point newItem) => _blink.BlinkSVGPointList.instance.initialize_Callback_1_(this, newItem);
   
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point newItem, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Point insertItemBefore(Point newItem, int index) => _blink.BlinkSVGPointList.instance.insertItemBefore_Callback_2_(this, newItem, index);
   
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
-  Point removeItem(int index) => wrap_jso(_blink.BlinkSVGPointList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
+  Point removeItem(int index) => _blink.BlinkSVGPointList.instance.removeItem_Callback_1_(this, index);
   
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point newItem, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Point replaceItem(Point newItem, int index) => _blink.BlinkSVGPointList.instance.replaceItem_Callback_2_(this, newItem, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6006,11 +5434,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PolygonElement internalCreatePolygonElement() {
-    return new PolygonElement._internalWrap();
-  }
-
-  external factory PolygonElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PolygonElement.internal_() : super.internal_();
@@ -6024,11 +5448,11 @@
 
   @DomName('SVGPolygonElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => wrap_jso(_blink.BlinkSVGPolygonElement.instance.animatedPoints_Getter_(unwrap_jso(this)));
+  PointList get animatedPoints => _blink.BlinkSVGPolygonElement.instance.animatedPoints_Getter_(this);
   
   @DomName('SVGPolygonElement.points')
   @DocsEditable()
-  PointList get points => wrap_jso(_blink.BlinkSVGPolygonElement.instance.points_Getter_(unwrap_jso(this)));
+  PointList get points => _blink.BlinkSVGPolygonElement.instance.points_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6051,11 +5475,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PolylineElement internalCreatePolylineElement() {
-    return new PolylineElement._internalWrap();
-  }
-
-  external factory PolylineElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PolylineElement.internal_() : super.internal_();
@@ -6069,11 +5489,11 @@
 
   @DomName('SVGPolylineElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => wrap_jso(_blink.BlinkSVGPolylineElement.instance.animatedPoints_Getter_(unwrap_jso(this)));
+  PointList get animatedPoints => _blink.BlinkSVGPolylineElement.instance.animatedPoints_Getter_(this);
   
   @DomName('SVGPolylineElement.points')
   @DocsEditable()
-  PointList get points => wrap_jso(_blink.BlinkSVGPolylineElement.instance.points_Getter_(unwrap_jso(this)));
+  PointList get points => _blink.BlinkSVGPolylineElement.instance.points_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6090,21 +5510,13 @@
   // To suppress missing implicit constructor warnings.
   factory PreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PreserveAspectRatio internalCreatePreserveAspectRatio() {
-    return new PreserveAspectRatio._internalWrap();
-  }
 
-  factory PreserveAspectRatio._internalWrap() {
-    return new PreserveAspectRatio.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PreserveAspectRatio.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET')
   @DocsEditable()
   static const int SVG_MEETORSLICE_MEET = 1;
@@ -6163,19 +5575,19 @@
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  int get align => _blink.BlinkSVGPreserveAspectRatio.instance.align_Getter_(unwrap_jso(this));
+  int get align => _blink.BlinkSVGPreserveAspectRatio.instance.align_Getter_(this);
   
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  set align(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.align_Setter_(unwrap_jso(this), value);
+  set align(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.align_Setter_(this, value);
   
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  int get meetOrSlice => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Getter_(unwrap_jso(this));
+  int get meetOrSlice => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Getter_(this);
   
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Setter_(unwrap_jso(this), value);
+  set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6198,11 +5610,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static RadialGradientElement internalCreateRadialGradientElement() {
-    return new RadialGradientElement._internalWrap();
-  }
-
-  external factory RadialGradientElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RadialGradientElement.internal_() : super.internal_();
@@ -6216,27 +5624,27 @@
 
   @DomName('SVGRadialGradientElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => wrap_jso(_blink.BlinkSVGRadialGradientElement.instance.cx_Getter_(unwrap_jso(this)));
+  AnimatedLength get cx => _blink.BlinkSVGRadialGradientElement.instance.cx_Getter_(this);
   
   @DomName('SVGRadialGradientElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => wrap_jso(_blink.BlinkSVGRadialGradientElement.instance.cy_Getter_(unwrap_jso(this)));
+  AnimatedLength get cy => _blink.BlinkSVGRadialGradientElement.instance.cy_Getter_(this);
   
   @DomName('SVGRadialGradientElement.fr')
   @DocsEditable()
-  AnimatedLength get fr => wrap_jso(_blink.BlinkSVGRadialGradientElement.instance.fr_Getter_(unwrap_jso(this)));
+  AnimatedLength get fr => _blink.BlinkSVGRadialGradientElement.instance.fr_Getter_(this);
   
   @DomName('SVGRadialGradientElement.fx')
   @DocsEditable()
-  AnimatedLength get fx => wrap_jso(_blink.BlinkSVGRadialGradientElement.instance.fx_Getter_(unwrap_jso(this)));
+  AnimatedLength get fx => _blink.BlinkSVGRadialGradientElement.instance.fx_Getter_(this);
   
   @DomName('SVGRadialGradientElement.fy')
   @DocsEditable()
-  AnimatedLength get fy => wrap_jso(_blink.BlinkSVGRadialGradientElement.instance.fy_Getter_(unwrap_jso(this)));
+  AnimatedLength get fy => _blink.BlinkSVGRadialGradientElement.instance.fy_Getter_(this);
   
   @DomName('SVGRadialGradientElement.r')
   @DocsEditable()
-  AnimatedLength get r => wrap_jso(_blink.BlinkSVGRadialGradientElement.instance.r_Getter_(unwrap_jso(this)));
+  AnimatedLength get r => _blink.BlinkSVGRadialGradientElement.instance.r_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6253,52 +5661,44 @@
   // To suppress missing implicit constructor warnings.
   factory Rect._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Rect internalCreateRect() {
-    return new Rect._internalWrap();
-  }
 
-  factory Rect._internalWrap() {
-    return new Rect.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Rect.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGRect.height')
   @DocsEditable()
-  num get height => _blink.BlinkSVGRect.instance.height_Getter_(unwrap_jso(this));
+  num get height => _blink.BlinkSVGRect.instance.height_Getter_(this);
   
   @DomName('SVGRect.height')
   @DocsEditable()
-  set height(num value) => _blink.BlinkSVGRect.instance.height_Setter_(unwrap_jso(this), value);
+  set height(num value) => _blink.BlinkSVGRect.instance.height_Setter_(this, value);
   
   @DomName('SVGRect.width')
   @DocsEditable()
-  num get width => _blink.BlinkSVGRect.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkSVGRect.instance.width_Getter_(this);
   
   @DomName('SVGRect.width')
   @DocsEditable()
-  set width(num value) => _blink.BlinkSVGRect.instance.width_Setter_(unwrap_jso(this), value);
+  set width(num value) => _blink.BlinkSVGRect.instance.width_Setter_(this, value);
   
   @DomName('SVGRect.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGRect.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkSVGRect.instance.x_Getter_(this);
   
   @DomName('SVGRect.x')
   @DocsEditable()
-  set x(num value) => _blink.BlinkSVGRect.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGRect.instance.x_Setter_(this, value);
   
   @DomName('SVGRect.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGRect.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkSVGRect.instance.y_Getter_(this);
   
   @DomName('SVGRect.y')
   @DocsEditable()
-  set y(num value) => _blink.BlinkSVGRect.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGRect.instance.y_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6321,11 +5721,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static RectElement internalCreateRectElement() {
-    return new RectElement._internalWrap();
-  }
-
-  external factory RectElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RectElement.internal_() : super.internal_();
@@ -6339,27 +5735,27 @@
 
   @DomName('SVGRectElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGRectElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGRectElement.instance.height_Getter_(this);
   
   @DomName('SVGRectElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => wrap_jso(_blink.BlinkSVGRectElement.instance.rx_Getter_(unwrap_jso(this)));
+  AnimatedLength get rx => _blink.BlinkSVGRectElement.instance.rx_Getter_(this);
   
   @DomName('SVGRectElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => wrap_jso(_blink.BlinkSVGRectElement.instance.ry_Getter_(unwrap_jso(this)));
+  AnimatedLength get ry => _blink.BlinkSVGRectElement.instance.ry_Getter_(this);
   
   @DomName('SVGRectElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGRectElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGRectElement.instance.width_Getter_(this);
   
   @DomName('SVGRectElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGRectElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGRectElement.instance.x_Getter_(this);
   
   @DomName('SVGRectElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGRectElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGRectElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6382,11 +5778,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ScriptElement internalCreateScriptElement() {
-    return new ScriptElement._internalWrap();
-  }
-
-  external factory ScriptElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ScriptElement.internal_() : super.internal_();
@@ -6400,15 +5792,15 @@
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkSVGScriptElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkSVGScriptElement.instance.type_Getter_(this);
   
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkSVGScriptElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkSVGScriptElement.instance.type_Setter_(this, value);
   
   @DomName('SVGScriptElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGScriptElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGScriptElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6434,11 +5826,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SetElement internalCreateSetElement() {
-    return new SetElement._internalWrap();
-  }
-
-  external factory SetElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SetElement.internal_() : super.internal_();
@@ -6474,11 +5862,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static StopElement internalCreateStopElement() {
-    return new StopElement._internalWrap();
-  }
-
-  external factory StopElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StopElement.internal_() : super.internal_();
@@ -6492,7 +5876,7 @@
 
   @DomName('SVGStopElement.offset')
   @DocsEditable()
-  AnimatedNumber get gradientOffset => wrap_jso(_blink.BlinkSVGStopElement.instance.offset_Getter_(unwrap_jso(this)));
+  AnimatedNumber get gradientOffset => _blink.BlinkSVGStopElement.instance.offset_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6509,29 +5893,21 @@
   // To suppress missing implicit constructor warnings.
   factory StringList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static StringList internalCreateStringList() {
-    return new StringList._internalWrap();
-  }
 
-  factory StringList._internalWrap() {
-    return new StringList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StringList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGStringList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGStringList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSVGStringList.instance.length_Getter_(this);
   
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGStringList.instance.numberOfItems_Getter_(unwrap_jso(this));
+  int get numberOfItems => _blink.BlinkSVGStringList.instance.numberOfItems_Getter_(this);
   
   String operator[](int index) {
     if (index < 0 || index >= length)
@@ -6580,35 +5956,35 @@
   @DomName('SVGStringList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, String newItem) => _blink.BlinkSVGStringList.instance.$__setter___Callback_2_(unwrap_jso(this), index, newItem);
+  void __setter__(int index, String newItem) => _blink.BlinkSVGStringList.instance.$__setter___Callback_2_(this, index, newItem);
   
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String newItem) => _blink.BlinkSVGStringList.instance.appendItem_Callback_1_(unwrap_jso(this), newItem);
+  String appendItem(String newItem) => _blink.BlinkSVGStringList.instance.appendItem_Callback_1_(this, newItem);
   
   @DomName('SVGStringList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGStringList.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkSVGStringList.instance.clear_Callback_0_(this);
   
   @DomName('SVGStringList.getItem')
   @DocsEditable()
-  String getItem(int index) => _blink.BlinkSVGStringList.instance.getItem_Callback_1_(unwrap_jso(this), index);
+  String getItem(int index) => _blink.BlinkSVGStringList.instance.getItem_Callback_1_(this, index);
   
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String newItem) => _blink.BlinkSVGStringList.instance.initialize_Callback_1_(unwrap_jso(this), newItem);
+  String initialize(String newItem) => _blink.BlinkSVGStringList.instance.initialize_Callback_1_(this, newItem);
   
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
-  String insertItemBefore(String item, int index) => _blink.BlinkSVGStringList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), item, index);
+  String insertItemBefore(String item, int index) => _blink.BlinkSVGStringList.instance.insertItemBefore_Callback_2_(this, item, index);
   
   @DomName('SVGStringList.removeItem')
   @DocsEditable()
-  String removeItem(int index) => _blink.BlinkSVGStringList.instance.removeItem_Callback_1_(unwrap_jso(this), index);
+  String removeItem(int index) => _blink.BlinkSVGStringList.instance.removeItem_Callback_1_(this, index);
   
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String newItem, int index) => _blink.BlinkSVGStringList.instance.replaceItem_Callback_2_(unwrap_jso(this), newItem, index);
+  String replaceItem(String newItem, int index) => _blink.BlinkSVGStringList.instance.replaceItem_Callback_2_(this, newItem, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6632,11 +6008,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static StyleElement internalCreateStyleElement() {
-    return new StyleElement._internalWrap();
-  }
-
-  external factory StyleElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StyleElement.internal_() : super.internal_();
@@ -6650,40 +6022,40 @@
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkSVGStyleElement.instance.disabled_Getter_(unwrap_jso(this));
+  bool get disabled => _blink.BlinkSVGStyleElement.instance.disabled_Getter_(this);
   
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  set disabled(bool value) => _blink.BlinkSVGStyleElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkSVGStyleElement.instance.disabled_Setter_(this, value);
   
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkSVGStyleElement.instance.media_Getter_(unwrap_jso(this));
+  String get media => _blink.BlinkSVGStyleElement.instance.media_Getter_(this);
   
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  set media(String value) => _blink.BlinkSVGStyleElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkSVGStyleElement.instance.media_Setter_(this, value);
   
   @DomName('SVGStyleElement.sheet')
   @DocsEditable()
   @Experimental() // untriaged
-  StyleSheet get sheet => wrap_jso(_blink.BlinkSVGStyleElement.instance.sheet_Getter_(unwrap_jso(this)));
+  StyleSheet get sheet => _blink.BlinkSVGStyleElement.instance.sheet_Getter_(this);
   
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  String get title => _blink.BlinkSVGStyleElement.instance.title_Getter_(unwrap_jso(this));
+  String get title => _blink.BlinkSVGStyleElement.instance.title_Getter_(this);
   
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  set title(String value) => _blink.BlinkSVGStyleElement.instance.title_Setter_(unwrap_jso(this), value);
+  set title(String value) => _blink.BlinkSVGStyleElement.instance.title_Setter_(this, value);
   
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkSVGStyleElement.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkSVGStyleElement.instance.type_Getter_(this);
   
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkSVGStyleElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkSVGStyleElement.instance.type_Setter_(this, value);
   
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -6834,18 +6206,8 @@
   }
 
   set _svgClassName(AnimatedString value) =>
-      _blink.BlinkSVGElement.instance.className_Setter_(unwrap_jso(this), unwrap_jso(value));
+      _blink.BlinkSVGElement.instance.className_Setter_(this, value);
 
-  String get className => _svgClassName.baseVal;
-
-  // Unbelievable hack. We can't create an SvgAnimatedString, but we can get
-  // the existing one and change its baseVal. Then we call the blink setter directly
-  // TODO(alanknight): Handle suppressing the SVGAnimated<*> better
-  set className(String s) {
-    var oldClass = _svgClassName;
-    oldClass.baseVal = s;
-    _svgClassName = oldClass;
-  }
   // To suppress missing implicit constructor warnings.
   factory SvgElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -7111,11 +6473,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SvgElement internalCreateSvgElement() {
-    return new SvgElement._internalWrap();
-  }
-
-  external factory SvgElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SvgElement.internal_() : super.internal_();
@@ -7130,40 +6488,40 @@
   @DomName('SVGElement.className')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedString get _svgClassName => wrap_jso(_blink.BlinkSVGElement.instance.className_Getter_(unwrap_jso(this)));
+  AnimatedString get _svgClassName => _blink.BlinkSVGElement.instance.className_Getter_(this);
   
   @DomName('SVGElement.ownerSVGElement')
   @DocsEditable()
-  SvgSvgElement get ownerSvgElement => wrap_jso(_blink.BlinkSVGElement.instance.ownerSVGElement_Getter_(unwrap_jso(this)));
+  SvgSvgElement get ownerSvgElement => _blink.BlinkSVGElement.instance.ownerSVGElement_Getter_(this);
   
   @DomName('SVGElement.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => wrap_jso(_blink.BlinkSVGElement.instance.style_Getter_(unwrap_jso(this)));
+  CssStyleDeclaration get style => _blink.BlinkSVGElement.instance.style_Getter_(this);
   
   @DomName('SVGElement.tabIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  int get tabIndex => _blink.BlinkSVGElement.instance.tabIndex_Getter_(unwrap_jso(this));
+  int get tabIndex => _blink.BlinkSVGElement.instance.tabIndex_Getter_(this);
   
   @DomName('SVGElement.tabIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  set tabIndex(int value) => _blink.BlinkSVGElement.instance.tabIndex_Setter_(unwrap_jso(this), value);
+  set tabIndex(int value) => _blink.BlinkSVGElement.instance.tabIndex_Setter_(this, value);
   
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
-  SvgElement get viewportElement => wrap_jso(_blink.BlinkSVGElement.instance.viewportElement_Getter_(unwrap_jso(this)));
+  SvgElement get viewportElement => _blink.BlinkSVGElement.instance.viewportElement_Getter_(this);
   
   @DomName('SVGElement.blur')
   @DocsEditable()
   @Experimental() // untriaged
-  void blur() => _blink.BlinkSVGElement.instance.blur_Callback_0_(unwrap_jso(this));
+  void blur() => _blink.BlinkSVGElement.instance.blur_Callback_0_(this);
   
   @DomName('SVGElement.focus')
   @DocsEditable()
   @Experimental() // untriaged
-  void focus() => _blink.BlinkSVGElement.instance.focus_Callback_0_(unwrap_jso(this));
+  void focus() => _blink.BlinkSVGElement.instance.focus_Callback_0_(this);
   
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -7446,11 +6804,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SvgSvgElement internalCreateSvgSvgElement() {
-    return new SvgSvgElement._internalWrap();
-  }
-
-  external factory SvgSvgElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SvgSvgElement.internal_() : super.internal_();
@@ -7464,167 +6818,167 @@
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  num get currentScale => _blink.BlinkSVGSVGElement.instance.currentScale_Getter_(unwrap_jso(this));
+  num get currentScale => _blink.BlinkSVGSVGElement.instance.currentScale_Getter_(this);
   
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  set currentScale(num value) => _blink.BlinkSVGSVGElement.instance.currentScale_Setter_(unwrap_jso(this), value);
+  set currentScale(num value) => _blink.BlinkSVGSVGElement.instance.currentScale_Setter_(this, value);
   
   @DomName('SVGSVGElement.currentTranslate')
   @DocsEditable()
-  Point get currentTranslate => wrap_jso(_blink.BlinkSVGSVGElement.instance.currentTranslate_Getter_(unwrap_jso(this)));
+  Point get currentTranslate => _blink.BlinkSVGSVGElement.instance.currentTranslate_Getter_(this);
   
   @DomName('SVGSVGElement.currentView')
   @DocsEditable()
-  ViewSpec get currentView => wrap_jso(_blink.BlinkSVGSVGElement.instance.currentView_Getter_(unwrap_jso(this)));
+  ViewSpec get currentView => _blink.BlinkSVGSVGElement.instance.currentView_Getter_(this);
   
   @DomName('SVGSVGElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGSVGElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGSVGElement.instance.height_Getter_(this);
   
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  num get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterX_Getter_(unwrap_jso(this));
+  num get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterX_Getter_(this);
   
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  num get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterY_Getter_(unwrap_jso(this));
+  num get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterY_Getter_(this);
   
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  num get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterX_Getter_(unwrap_jso(this));
+  num get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterX_Getter_(this);
   
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  num get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterY_Getter_(unwrap_jso(this));
+  num get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterY_Getter_(this);
   
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
-  bool get useCurrentView => _blink.BlinkSVGSVGElement.instance.useCurrentView_Getter_(unwrap_jso(this));
+  bool get useCurrentView => _blink.BlinkSVGSVGElement.instance.useCurrentView_Getter_(this);
   
   @DomName('SVGSVGElement.viewport')
   @DocsEditable()
-  Rect get viewport => wrap_jso(_blink.BlinkSVGSVGElement.instance.viewport_Getter_(unwrap_jso(this)));
+  Rect get viewport => _blink.BlinkSVGSVGElement.instance.viewport_Getter_(this);
   
   @DomName('SVGSVGElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGSVGElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGSVGElement.instance.width_Getter_(this);
   
   @DomName('SVGSVGElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGSVGElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGSVGElement.instance.x_Getter_(this);
   
   @DomName('SVGSVGElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGSVGElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGSVGElement.instance.y_Getter_(this);
   
   @DomName('SVGSVGElement.animationsPaused')
   @DocsEditable()
-  bool animationsPaused() => _blink.BlinkSVGSVGElement.instance.animationsPaused_Callback_0_(unwrap_jso(this));
+  bool animationsPaused() => _blink.BlinkSVGSVGElement.instance.animationsPaused_Callback_0_(this);
   
   @DomName('SVGSVGElement.checkEnclosure')
   @DocsEditable()
-  bool checkEnclosure(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.instance.checkEnclosure_Callback_2_(unwrap_jso(this), unwrap_jso(element), unwrap_jso(rect));
+  bool checkEnclosure(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.instance.checkEnclosure_Callback_2_(this, element, rect);
   
   @DomName('SVGSVGElement.checkIntersection')
   @DocsEditable()
-  bool checkIntersection(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.instance.checkIntersection_Callback_2_(unwrap_jso(this), unwrap_jso(element), unwrap_jso(rect));
+  bool checkIntersection(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.instance.checkIntersection_Callback_2_(this, element, rect);
   
   @DomName('SVGSVGElement.createSVGAngle')
   @DocsEditable()
-  Angle createSvgAngle() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGAngle_Callback_0_(unwrap_jso(this)));
+  Angle createSvgAngle() => _blink.BlinkSVGSVGElement.instance.createSVGAngle_Callback_0_(this);
   
   @DomName('SVGSVGElement.createSVGLength')
   @DocsEditable()
-  Length createSvgLength() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGLength_Callback_0_(unwrap_jso(this)));
+  Length createSvgLength() => _blink.BlinkSVGSVGElement.instance.createSVGLength_Callback_0_(this);
   
   @DomName('SVGSVGElement.createSVGMatrix')
   @DocsEditable()
-  Matrix createSvgMatrix() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGMatrix_Callback_0_(unwrap_jso(this)));
+  Matrix createSvgMatrix() => _blink.BlinkSVGSVGElement.instance.createSVGMatrix_Callback_0_(this);
   
   @DomName('SVGSVGElement.createSVGNumber')
   @DocsEditable()
-  Number createSvgNumber() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGNumber_Callback_0_(unwrap_jso(this)));
+  Number createSvgNumber() => _blink.BlinkSVGSVGElement.instance.createSVGNumber_Callback_0_(this);
   
   @DomName('SVGSVGElement.createSVGPoint')
   @DocsEditable()
-  Point createSvgPoint() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGPoint_Callback_0_(unwrap_jso(this)));
+  Point createSvgPoint() => _blink.BlinkSVGSVGElement.instance.createSVGPoint_Callback_0_(this);
   
   @DomName('SVGSVGElement.createSVGRect')
   @DocsEditable()
-  Rect createSvgRect() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGRect_Callback_0_(unwrap_jso(this)));
+  Rect createSvgRect() => _blink.BlinkSVGSVGElement.instance.createSVGRect_Callback_0_(this);
   
   @DomName('SVGSVGElement.createSVGTransform')
   @DocsEditable()
-  Transform createSvgTransform() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGTransform_Callback_0_(unwrap_jso(this)));
+  Transform createSvgTransform() => _blink.BlinkSVGSVGElement.instance.createSVGTransform_Callback_0_(this);
   
   @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGTransformFromMatrix_Callback_1_(unwrap_jso(this), unwrap_jso(matrix)));
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGSVGElement.instance.createSVGTransformFromMatrix_Callback_1_(this, matrix);
   
   @DomName('SVGSVGElement.deselectAll')
   @DocsEditable()
-  void deselectAll() => _blink.BlinkSVGSVGElement.instance.deselectAll_Callback_0_(unwrap_jso(this));
+  void deselectAll() => _blink.BlinkSVGSVGElement.instance.deselectAll_Callback_0_(this);
   
   @DomName('SVGSVGElement.forceRedraw')
   @DocsEditable()
-  void forceRedraw() => _blink.BlinkSVGSVGElement.instance.forceRedraw_Callback_0_(unwrap_jso(this));
+  void forceRedraw() => _blink.BlinkSVGSVGElement.instance.forceRedraw_Callback_0_(this);
   
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  num getCurrentTime() => _blink.BlinkSVGSVGElement.instance.getCurrentTime_Callback_0_(unwrap_jso(this));
+  num getCurrentTime() => _blink.BlinkSVGSVGElement.instance.getCurrentTime_Callback_0_(this);
   
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => wrap_jso(_blink.BlinkSVGSVGElement.instance.getElementById_Callback_1_(unwrap_jso(this), elementId));
+  Element getElementById(String elementId) => _blink.BlinkSVGSVGElement.instance.getElementById_Callback_1_(this, elementId);
   
   @DomName('SVGSVGElement.getEnclosureList')
   @DocsEditable()
-  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => wrap_jso(_blink.BlinkSVGSVGElement.instance.getEnclosureList_Callback_2_(unwrap_jso(this), unwrap_jso(rect), unwrap_jso(referenceElement)));
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => (_blink.BlinkSVGSVGElement.instance.getEnclosureList_Callback_2_(this, rect, referenceElement));
   
   @DomName('SVGSVGElement.getIntersectionList')
   @DocsEditable()
-  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => wrap_jso(_blink.BlinkSVGSVGElement.instance.getIntersectionList_Callback_2_(unwrap_jso(this), unwrap_jso(rect), unwrap_jso(referenceElement)));
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => (_blink.BlinkSVGSVGElement.instance.getIntersectionList_Callback_2_(this, rect, referenceElement));
   
   @DomName('SVGSVGElement.pauseAnimations')
   @DocsEditable()
-  void pauseAnimations() => _blink.BlinkSVGSVGElement.instance.pauseAnimations_Callback_0_(unwrap_jso(this));
+  void pauseAnimations() => _blink.BlinkSVGSVGElement.instance.pauseAnimations_Callback_0_(this);
   
   @DomName('SVGSVGElement.setCurrentTime')
   @DocsEditable()
-  void setCurrentTime(num seconds) => _blink.BlinkSVGSVGElement.instance.setCurrentTime_Callback_1_(unwrap_jso(this), seconds);
+  void setCurrentTime(num seconds) => _blink.BlinkSVGSVGElement.instance.setCurrentTime_Callback_1_(this, seconds);
   
   @DomName('SVGSVGElement.suspendRedraw')
   @DocsEditable()
-  int suspendRedraw(int maxWaitMilliseconds) => _blink.BlinkSVGSVGElement.instance.suspendRedraw_Callback_1_(unwrap_jso(this), maxWaitMilliseconds);
+  int suspendRedraw(int maxWaitMilliseconds) => _blink.BlinkSVGSVGElement.instance.suspendRedraw_Callback_1_(this, maxWaitMilliseconds);
   
   @DomName('SVGSVGElement.unpauseAnimations')
   @DocsEditable()
-  void unpauseAnimations() => _blink.BlinkSVGSVGElement.instance.unpauseAnimations_Callback_0_(unwrap_jso(this));
+  void unpauseAnimations() => _blink.BlinkSVGSVGElement.instance.unpauseAnimations_Callback_0_(this);
   
   @DomName('SVGSVGElement.unsuspendRedraw')
   @DocsEditable()
-  void unsuspendRedraw(int suspendHandleId) => _blink.BlinkSVGSVGElement.instance.unsuspendRedraw_Callback_1_(unwrap_jso(this), suspendHandleId);
+  void unsuspendRedraw(int suspendHandleId) => _blink.BlinkSVGSVGElement.instance.unsuspendRedraw_Callback_1_(this, suspendHandleId);
   
   @DomName('SVGSVGElement.unsuspendRedrawAll')
   @DocsEditable()
-  void unsuspendRedrawAll() => _blink.BlinkSVGSVGElement.instance.unsuspendRedrawAll_Callback_0_(unwrap_jso(this));
+  void unsuspendRedrawAll() => _blink.BlinkSVGSVGElement.instance.unsuspendRedrawAll_Callback_0_(this);
   
   @DomName('SVGSVGElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGSVGElement.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSVGElement.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGSVGElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => wrap_jso(_blink.BlinkSVGSVGElement.instance.viewBox_Getter_(unwrap_jso(this)));
+  AnimatedRect get viewBox => _blink.BlinkSVGSVGElement.instance.viewBox_Getter_(this);
   
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Getter_(unwrap_jso(this));
+  int get zoomAndPan => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Getter_(this);
   
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
+  set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7647,11 +7001,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SwitchElement internalCreateSwitchElement() {
-    return new SwitchElement._internalWrap();
-  }
-
-  external factory SwitchElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SwitchElement.internal_() : super.internal_();
@@ -7684,11 +7034,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static SymbolElement internalCreateSymbolElement() {
-    return new SymbolElement._internalWrap();
-  }
-
-  external factory SymbolElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SymbolElement.internal_() : super.internal_();
@@ -7702,11 +7048,11 @@
 
   @DomName('SVGSymbolElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGSymbolElement.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSymbolElement.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGSymbolElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => wrap_jso(_blink.BlinkSVGSymbolElement.instance.viewBox_Getter_(unwrap_jso(this)));
+  AnimatedRect get viewBox => _blink.BlinkSVGSymbolElement.instance.viewBox_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7729,11 +7075,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TSpanElement internalCreateTSpanElement() {
-    return new TSpanElement._internalWrap();
-  }
-
-  external factory TSpanElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TSpanElement.internal_() : super.internal_();
@@ -7793,11 +7135,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextContentElement internalCreateTextContentElement() {
-    return new TextContentElement._internalWrap();
-  }
-
-  external factory TextContentElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextContentElement.internal_() : super.internal_();
@@ -7823,47 +7161,47 @@
 
   @DomName('SVGTextContentElement.lengthAdjust')
   @DocsEditable()
-  AnimatedEnumeration get lengthAdjust => wrap_jso(_blink.BlinkSVGTextContentElement.instance.lengthAdjust_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get lengthAdjust => _blink.BlinkSVGTextContentElement.instance.lengthAdjust_Getter_(this);
   
   @DomName('SVGTextContentElement.textLength')
   @DocsEditable()
-  AnimatedLength get textLength => wrap_jso(_blink.BlinkSVGTextContentElement.instance.textLength_Getter_(unwrap_jso(this)));
+  AnimatedLength get textLength => _blink.BlinkSVGTextContentElement.instance.textLength_Getter_(this);
   
   @DomName('SVGTextContentElement.getCharNumAtPosition')
   @DocsEditable()
-  int getCharNumAtPosition(Point point) => _blink.BlinkSVGTextContentElement.instance.getCharNumAtPosition_Callback_1_(unwrap_jso(this), unwrap_jso(point));
+  int getCharNumAtPosition(Point point) => _blink.BlinkSVGTextContentElement.instance.getCharNumAtPosition_Callback_1_(this, point);
   
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  num getComputedTextLength() => _blink.BlinkSVGTextContentElement.instance.getComputedTextLength_Callback_0_(unwrap_jso(this));
+  num getComputedTextLength() => _blink.BlinkSVGTextContentElement.instance.getComputedTextLength_Callback_0_(this);
   
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int charnum) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getEndPositionOfChar_Callback_1_(unwrap_jso(this), charnum));
+  Point getEndPositionOfChar(int charnum) => _blink.BlinkSVGTextContentElement.instance.getEndPositionOfChar_Callback_1_(this, charnum);
   
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int charnum) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getExtentOfChar_Callback_1_(unwrap_jso(this), charnum));
+  Rect getExtentOfChar(int charnum) => _blink.BlinkSVGTextContentElement.instance.getExtentOfChar_Callback_1_(this, charnum);
   
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
-  int getNumberOfChars() => _blink.BlinkSVGTextContentElement.instance.getNumberOfChars_Callback_0_(unwrap_jso(this));
+  int getNumberOfChars() => _blink.BlinkSVGTextContentElement.instance.getNumberOfChars_Callback_0_(this);
   
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  num getRotationOfChar(int charnum) => _blink.BlinkSVGTextContentElement.instance.getRotationOfChar_Callback_1_(unwrap_jso(this), charnum);
+  num getRotationOfChar(int charnum) => _blink.BlinkSVGTextContentElement.instance.getRotationOfChar_Callback_1_(this, charnum);
   
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int charnum) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getStartPositionOfChar_Callback_1_(unwrap_jso(this), charnum));
+  Point getStartPositionOfChar(int charnum) => _blink.BlinkSVGTextContentElement.instance.getStartPositionOfChar_Callback_1_(this, charnum);
   
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  num getSubStringLength(int charnum, int nchars) => _blink.BlinkSVGTextContentElement.instance.getSubStringLength_Callback_2_(unwrap_jso(this), charnum, nchars);
+  num getSubStringLength(int charnum, int nchars) => _blink.BlinkSVGTextContentElement.instance.getSubStringLength_Callback_2_(this, charnum, nchars);
   
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int charnum, int nchars) => _blink.BlinkSVGTextContentElement.instance.selectSubString_Callback_2_(unwrap_jso(this), charnum, nchars);
+  void selectSubString(int charnum, int nchars) => _blink.BlinkSVGTextContentElement.instance.selectSubString_Callback_2_(this, charnum, nchars);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7886,11 +7224,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextElement internalCreateTextElement() {
-    return new TextElement._internalWrap();
-  }
-
-  external factory TextElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextElement.internal_() : super.internal_();
@@ -7919,11 +7253,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextPathElement internalCreateTextPathElement() {
-    return new TextPathElement._internalWrap();
-  }
-
-  external factory TextPathElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextPathElement.internal_() : super.internal_();
@@ -7961,19 +7291,19 @@
 
   @DomName('SVGTextPathElement.method')
   @DocsEditable()
-  AnimatedEnumeration get method => wrap_jso(_blink.BlinkSVGTextPathElement.instance.method_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get method => _blink.BlinkSVGTextPathElement.instance.method_Getter_(this);
   
   @DomName('SVGTextPathElement.spacing')
   @DocsEditable()
-  AnimatedEnumeration get spacing => wrap_jso(_blink.BlinkSVGTextPathElement.instance.spacing_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get spacing => _blink.BlinkSVGTextPathElement.instance.spacing_Getter_(this);
   
   @DomName('SVGTextPathElement.startOffset')
   @DocsEditable()
-  AnimatedLength get startOffset => wrap_jso(_blink.BlinkSVGTextPathElement.instance.startOffset_Getter_(unwrap_jso(this)));
+  AnimatedLength get startOffset => _blink.BlinkSVGTextPathElement.instance.startOffset_Getter_(this);
   
   @DomName('SVGTextPathElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGTextPathElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGTextPathElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7992,11 +7322,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TextPositioningElement internalCreateTextPositioningElement() {
-    return new TextPositioningElement._internalWrap();
-  }
-
-  external factory TextPositioningElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TextPositioningElement.internal_() : super.internal_();
@@ -8010,23 +7336,23 @@
 
   @DomName('SVGTextPositioningElement.dx')
   @DocsEditable()
-  AnimatedLengthList get dx => wrap_jso(_blink.BlinkSVGTextPositioningElement.instance.dx_Getter_(unwrap_jso(this)));
+  AnimatedLengthList get dx => _blink.BlinkSVGTextPositioningElement.instance.dx_Getter_(this);
   
   @DomName('SVGTextPositioningElement.dy')
   @DocsEditable()
-  AnimatedLengthList get dy => wrap_jso(_blink.BlinkSVGTextPositioningElement.instance.dy_Getter_(unwrap_jso(this)));
+  AnimatedLengthList get dy => _blink.BlinkSVGTextPositioningElement.instance.dy_Getter_(this);
   
   @DomName('SVGTextPositioningElement.rotate')
   @DocsEditable()
-  AnimatedNumberList get rotate => wrap_jso(_blink.BlinkSVGTextPositioningElement.instance.rotate_Getter_(unwrap_jso(this)));
+  AnimatedNumberList get rotate => _blink.BlinkSVGTextPositioningElement.instance.rotate_Getter_(this);
   
   @DomName('SVGTextPositioningElement.x')
   @DocsEditable()
-  AnimatedLengthList get x => wrap_jso(_blink.BlinkSVGTextPositioningElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLengthList get x => _blink.BlinkSVGTextPositioningElement.instance.x_Getter_(this);
   
   @DomName('SVGTextPositioningElement.y')
   @DocsEditable()
-  AnimatedLengthList get y => wrap_jso(_blink.BlinkSVGTextPositioningElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLengthList get y => _blink.BlinkSVGTextPositioningElement.instance.y_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8049,11 +7375,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static TitleElement internalCreateTitleElement() {
-    return new TitleElement._internalWrap();
-  }
-
-  external factory TitleElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TitleElement.internal_() : super.internal_();
@@ -8080,21 +7402,13 @@
   // To suppress missing implicit constructor warnings.
   factory Transform._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Transform internalCreateTransform() {
-    return new Transform._internalWrap();
-  }
 
-  factory Transform._internalWrap() {
-    return new Transform.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Transform.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGTransform.SVG_TRANSFORM_MATRIX')
   @DocsEditable()
   static const int SVG_TRANSFORM_MATRIX = 1;
@@ -8125,39 +7439,39 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  num get angle => _blink.BlinkSVGTransform.instance.angle_Getter_(unwrap_jso(this));
+  num get angle => _blink.BlinkSVGTransform.instance.angle_Getter_(this);
   
   @DomName('SVGTransform.matrix')
   @DocsEditable()
-  Matrix get matrix => wrap_jso(_blink.BlinkSVGTransform.instance.matrix_Getter_(unwrap_jso(this)));
+  Matrix get matrix => _blink.BlinkSVGTransform.instance.matrix_Getter_(this);
   
   @DomName('SVGTransform.type')
   @DocsEditable()
-  int get type => _blink.BlinkSVGTransform.instance.type_Getter_(unwrap_jso(this));
+  int get type => _blink.BlinkSVGTransform.instance.type_Getter_(this);
   
   @DomName('SVGTransform.setMatrix')
   @DocsEditable()
-  void setMatrix(Matrix matrix) => _blink.BlinkSVGTransform.instance.setMatrix_Callback_1_(unwrap_jso(this), unwrap_jso(matrix));
+  void setMatrix(Matrix matrix) => _blink.BlinkSVGTransform.instance.setMatrix_Callback_1_(this, matrix);
   
   @DomName('SVGTransform.setRotate')
   @DocsEditable()
-  void setRotate(num angle, num cx, num cy) => _blink.BlinkSVGTransform.instance.setRotate_Callback_3_(unwrap_jso(this), angle, cx, cy);
+  void setRotate(num angle, num cx, num cy) => _blink.BlinkSVGTransform.instance.setRotate_Callback_3_(this, angle, cx, cy);
   
   @DomName('SVGTransform.setScale')
   @DocsEditable()
-  void setScale(num sx, num sy) => _blink.BlinkSVGTransform.instance.setScale_Callback_2_(unwrap_jso(this), sx, sy);
+  void setScale(num sx, num sy) => _blink.BlinkSVGTransform.instance.setScale_Callback_2_(this, sx, sy);
   
   @DomName('SVGTransform.setSkewX')
   @DocsEditable()
-  void setSkewX(num angle) => _blink.BlinkSVGTransform.instance.setSkewX_Callback_1_(unwrap_jso(this), angle);
+  void setSkewX(num angle) => _blink.BlinkSVGTransform.instance.setSkewX_Callback_1_(this, angle);
   
   @DomName('SVGTransform.setSkewY')
   @DocsEditable()
-  void setSkewY(num angle) => _blink.BlinkSVGTransform.instance.setSkewY_Callback_1_(unwrap_jso(this), angle);
+  void setSkewY(num angle) => _blink.BlinkSVGTransform.instance.setSkewY_Callback_1_(this, angle);
   
   @DomName('SVGTransform.setTranslate')
   @DocsEditable()
-  void setTranslate(num tx, num ty) => _blink.BlinkSVGTransform.instance.setTranslate_Callback_2_(unwrap_jso(this), tx, ty);
+  void setTranslate(num tx, num ty) => _blink.BlinkSVGTransform.instance.setTranslate_Callback_2_(this, tx, ty);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8174,29 +7488,21 @@
   // To suppress missing implicit constructor warnings.
   factory TransformList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static TransformList internalCreateTransformList() {
-    return new TransformList._internalWrap();
-  }
 
-  factory TransformList._internalWrap() {
-    return new TransformList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TransformList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGTransformList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGTransformList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSVGTransformList.instance.length_Getter_(this);
   
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGTransformList.instance.numberOfItems_Getter_(unwrap_jso(this));
+  int get numberOfItems => _blink.BlinkSVGTransformList.instance.numberOfItems_Getter_(this);
   
   Transform operator[](int index) {
     if (index < 0 || index >= length)
@@ -8245,43 +7551,43 @@
   @DomName('SVGTransformList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Transform newItem) => _blink.BlinkSVGTransformList.instance.$__setter___Callback_2_(unwrap_jso(this), index, unwrap_jso(newItem));
+  void __setter__(int index, Transform newItem) => _blink.BlinkSVGTransformList.instance.$__setter___Callback_2_(this, index, newItem);
   
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform newItem) => wrap_jso(_blink.BlinkSVGTransformList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Transform appendItem(Transform newItem) => _blink.BlinkSVGTransformList.instance.appendItem_Callback_1_(this, newItem);
   
   @DomName('SVGTransformList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGTransformList.instance.clear_Callback_0_(unwrap_jso(this));
+  void clear() => _blink.BlinkSVGTransformList.instance.clear_Callback_0_(this);
   
   @DomName('SVGTransformList.consolidate')
   @DocsEditable()
-  Transform consolidate() => wrap_jso(_blink.BlinkSVGTransformList.instance.consolidate_Callback_0_(unwrap_jso(this)));
+  Transform consolidate() => _blink.BlinkSVGTransformList.instance.consolidate_Callback_0_(this);
   
   @DomName('SVGTransformList.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => wrap_jso(_blink.BlinkSVGTransformList.instance.createSVGTransformFromMatrix_Callback_1_(unwrap_jso(this), unwrap_jso(matrix)));
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGTransformList.instance.createSVGTransformFromMatrix_Callback_1_(this, matrix);
   
   @DomName('SVGTransformList.getItem')
   @DocsEditable()
-  Transform getItem(int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.getItem_Callback_1_(unwrap_jso(this), index));
+  Transform getItem(int index) => _blink.BlinkSVGTransformList.instance.getItem_Callback_1_(this, index);
   
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform newItem) => wrap_jso(_blink.BlinkSVGTransformList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
+  Transform initialize(Transform newItem) => _blink.BlinkSVGTransformList.instance.initialize_Callback_1_(this, newItem);
   
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform newItem, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Transform insertItemBefore(Transform newItem, int index) => _blink.BlinkSVGTransformList.instance.insertItemBefore_Callback_2_(this, newItem, index);
   
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
-  Transform removeItem(int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
+  Transform removeItem(int index) => _blink.BlinkSVGTransformList.instance.removeItem_Callback_1_(this, index);
   
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform newItem, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
+  Transform replaceItem(Transform newItem, int index) => _blink.BlinkSVGTransformList.instance.replaceItem_Callback_2_(this, newItem, index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8298,21 +7604,13 @@
   // To suppress missing implicit constructor warnings.
   factory UnitTypes._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static UnitTypes internalCreateUnitTypes() {
-    return new UnitTypes._internalWrap();
-  }
 
-  factory UnitTypes._internalWrap() {
-    return new UnitTypes.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   UnitTypes.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX')
   @DocsEditable()
   static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
@@ -8365,11 +7663,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static UseElement internalCreateUseElement() {
-    return new UseElement._internalWrap();
-  }
-
-  external factory UseElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   UseElement.internal_() : super.internal_();
@@ -8383,23 +7677,23 @@
 
   @DomName('SVGUseElement.height')
   @DocsEditable()
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGUseElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGUseElement.instance.height_Getter_(this);
   
   @DomName('SVGUseElement.width')
   @DocsEditable()
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGUseElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => _blink.BlinkSVGUseElement.instance.width_Getter_(this);
   
   @DomName('SVGUseElement.x')
   @DocsEditable()
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGUseElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => _blink.BlinkSVGUseElement.instance.x_Getter_(this);
   
   @DomName('SVGUseElement.y')
   @DocsEditable()
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGUseElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => _blink.BlinkSVGUseElement.instance.y_Getter_(this);
   
   @DomName('SVGUseElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGUseElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGUseElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8422,11 +7716,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ViewElement internalCreateViewElement() {
-    return new ViewElement._internalWrap();
-  }
-
-  external factory ViewElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ViewElement.internal_() : super.internal_();
@@ -8440,23 +7730,23 @@
 
   @DomName('SVGViewElement.viewTarget')
   @DocsEditable()
-  StringList get viewTarget => wrap_jso(_blink.BlinkSVGViewElement.instance.viewTarget_Getter_(unwrap_jso(this)));
+  StringList get viewTarget => _blink.BlinkSVGViewElement.instance.viewTarget_Getter_(this);
   
   @DomName('SVGViewElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGViewElement.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewElement.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGViewElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => wrap_jso(_blink.BlinkSVGViewElement.instance.viewBox_Getter_(unwrap_jso(this)));
+  AnimatedRect get viewBox => _blink.BlinkSVGViewElement.instance.viewBox_Getter_(this);
   
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.BlinkSVGViewElement.instance.zoomAndPan_Getter_(unwrap_jso(this));
+  int get zoomAndPan => _blink.BlinkSVGViewElement.instance.zoomAndPan_Getter_(this);
   
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  set zoomAndPan(int value) => _blink.BlinkSVGViewElement.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
+  set zoomAndPan(int value) => _blink.BlinkSVGViewElement.instance.zoomAndPan_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8473,64 +7763,56 @@
   // To suppress missing implicit constructor warnings.
   factory ViewSpec._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ViewSpec internalCreateViewSpec() {
-    return new ViewSpec._internalWrap();
-  }
 
-  factory ViewSpec._internalWrap() {
-    return new ViewSpec.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ViewSpec.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SVGViewSpec.preserveAspectRatioString')
   @DocsEditable()
-  String get preserveAspectRatioString => _blink.BlinkSVGViewSpec.instance.preserveAspectRatioString_Getter_(unwrap_jso(this));
+  String get preserveAspectRatioString => _blink.BlinkSVGViewSpec.instance.preserveAspectRatioString_Getter_(this);
   
   @DomName('SVGViewSpec.transform')
   @DocsEditable()
-  TransformList get transform => wrap_jso(_blink.BlinkSVGViewSpec.instance.transform_Getter_(unwrap_jso(this)));
+  TransformList get transform => _blink.BlinkSVGViewSpec.instance.transform_Getter_(this);
   
   @DomName('SVGViewSpec.transformString')
   @DocsEditable()
-  String get transformString => _blink.BlinkSVGViewSpec.instance.transformString_Getter_(unwrap_jso(this));
+  String get transformString => _blink.BlinkSVGViewSpec.instance.transformString_Getter_(this);
   
   @DomName('SVGViewSpec.viewBoxString')
   @DocsEditable()
-  String get viewBoxString => _blink.BlinkSVGViewSpec.instance.viewBoxString_Getter_(unwrap_jso(this));
+  String get viewBoxString => _blink.BlinkSVGViewSpec.instance.viewBoxString_Getter_(this);
   
   @DomName('SVGViewSpec.viewTarget')
   @DocsEditable()
-  SvgElement get viewTarget => wrap_jso(_blink.BlinkSVGViewSpec.instance.viewTarget_Getter_(unwrap_jso(this)));
+  SvgElement get viewTarget => _blink.BlinkSVGViewSpec.instance.viewTarget_Getter_(this);
   
   @DomName('SVGViewSpec.viewTargetString')
   @DocsEditable()
-  String get viewTargetString => _blink.BlinkSVGViewSpec.instance.viewTargetString_Getter_(unwrap_jso(this));
+  String get viewTargetString => _blink.BlinkSVGViewSpec.instance.viewTargetString_Getter_(this);
   
   @DomName('SVGViewSpec.preserveAspectRatio')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedPreserveAspectRatio get preserveAspectRatio => wrap_jso(_blink.BlinkSVGViewSpec.instance.preserveAspectRatio_Getter_(unwrap_jso(this)));
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewSpec.instance.preserveAspectRatio_Getter_(this);
   
   @DomName('SVGViewSpec.viewBox')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedRect get viewBox => wrap_jso(_blink.BlinkSVGViewSpec.instance.viewBox_Getter_(unwrap_jso(this)));
+  AnimatedRect get viewBox => _blink.BlinkSVGViewSpec.instance.viewBox_Getter_(this);
   
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get zoomAndPan => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Getter_(unwrap_jso(this));
+  int get zoomAndPan => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Getter_(this);
   
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
+  set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8584,11 +7866,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ZoomEvent internalCreateZoomEvent() {
-    return new ZoomEvent._internalWrap();
-  }
-
-  external factory ZoomEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ZoomEvent.internal_() : super.internal_();
@@ -8596,23 +7874,23 @@
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  num get newScale => _blink.BlinkSVGZoomEvent.instance.newScale_Getter_(unwrap_jso(this));
+  num get newScale => _blink.BlinkSVGZoomEvent.instance.newScale_Getter_(this);
   
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
-  Point get newTranslate => wrap_jso(_blink.BlinkSVGZoomEvent.instance.newTranslate_Getter_(unwrap_jso(this)));
+  Point get newTranslate => _blink.BlinkSVGZoomEvent.instance.newTranslate_Getter_(this);
   
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  num get previousScale => _blink.BlinkSVGZoomEvent.instance.previousScale_Getter_(unwrap_jso(this));
+  num get previousScale => _blink.BlinkSVGZoomEvent.instance.previousScale_Getter_(this);
   
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
-  Point get previousTranslate => wrap_jso(_blink.BlinkSVGZoomEvent.instance.previousTranslate_Getter_(unwrap_jso(this)));
+  Point get previousTranslate => _blink.BlinkSVGZoomEvent.instance.previousTranslate_Getter_(this);
   
   @DomName('SVGZoomEvent.zoomRectScreen')
   @DocsEditable()
-  Rect get zoomRectScreen => wrap_jso(_blink.BlinkSVGZoomEvent.instance.zoomRectScreen_Getter_(unwrap_jso(this)));
+  Rect get zoomRectScreen => _blink.BlinkSVGZoomEvent.instance.zoomRectScreen_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8631,11 +7909,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _GradientElement internalCreate_GradientElement() {
-    return new _GradientElement._internalWrap();
-  }
-
-  external factory _GradientElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _GradientElement.internal_() : super.internal_();
@@ -8665,19 +7939,19 @@
 
   @DomName('SVGGradientElement.gradientTransform')
   @DocsEditable()
-  AnimatedTransformList get gradientTransform => wrap_jso(_blink.BlinkSVGGradientElement.instance.gradientTransform_Getter_(unwrap_jso(this)));
+  AnimatedTransformList get gradientTransform => _blink.BlinkSVGGradientElement.instance.gradientTransform_Getter_(this);
   
   @DomName('SVGGradientElement.gradientUnits')
   @DocsEditable()
-  AnimatedEnumeration get gradientUnits => wrap_jso(_blink.BlinkSVGGradientElement.instance.gradientUnits_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get gradientUnits => _blink.BlinkSVGGradientElement.instance.gradientUnits_Getter_(this);
   
   @DomName('SVGGradientElement.spreadMethod')
   @DocsEditable()
-  AnimatedEnumeration get spreadMethod => wrap_jso(_blink.BlinkSVGGradientElement.instance.spreadMethod_Getter_(unwrap_jso(this)));
+  AnimatedEnumeration get spreadMethod => _blink.BlinkSVGGradientElement.instance.spreadMethod_Getter_(this);
   
   @DomName('SVGGradientElement.href')
   @DocsEditable()
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGGradientElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGGradientElement.instance.href_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8696,11 +7970,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _SVGComponentTransferFunctionElement internalCreate_SVGComponentTransferFunctionElement() {
-    return new _SVGComponentTransferFunctionElement._internalWrap();
-  }
-
-  external factory _SVGComponentTransferFunctionElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _SVGComponentTransferFunctionElement.internal_() : super.internal_();
@@ -8731,11 +8001,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _SVGCursorElement internalCreate_SVGCursorElement() {
-    return new _SVGCursorElement._internalWrap();
-  }
-
-  external factory _SVGCursorElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _SVGCursorElement.internal_() : super.internal_();
@@ -8751,11 +8017,11 @@
   static bool get supported => true;
 
   // Override these methods for Dartium _SVGCursorElement can't be abstract.
-  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
-  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
-  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGCursorElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGCursorElement.instance.href_Getter_(unwrap_jso(this)));
-  bool hasExtension(String extension) => _blink.BlinkSVGCursorElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
+  StringList get requiredExtensions => _blink.BlinkSVGCursorElement.instance.requiredExtensions_Getter_(this);
+  StringList get requiredFeatures => _blink.BlinkSVGCursorElement.instance.requiredFeatures_Getter_(this);
+  StringList get systemLanguage => _blink.BlinkSVGCursorElement.instance.systemLanguage_Getter_(this);
+  AnimatedString get href => _blink.BlinkSVGCursorElement.instance.href_Getter_(this);
+  bool hasExtension(String extension) => _blink.BlinkSVGCursorElement.instance.hasExtension_Callback_1_(this, extension);
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8772,11 +8038,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _SVGFEDropShadowElement internalCreate_SVGFEDropShadowElement() {
-    return new _SVGFEDropShadowElement._internalWrap();
-  }
-
-  external factory _SVGFEDropShadowElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _SVGFEDropShadowElement.internal_() : super.internal_();
@@ -8789,11 +8051,11 @@
   _SVGFEDropShadowElement.created() : super.created();
 
   // Override these methods for Dartium _SVGFEDropShadowElement can't be abstract.
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.height_Getter_(unwrap_jso(this)));
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.result_Getter_(unwrap_jso(this)));
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.width_Getter_(unwrap_jso(this)));
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.x_Getter_(unwrap_jso(this)));
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEDropShadowElement.instance.height_Getter_(this);
+  AnimatedString get result => _blink.BlinkSVGFEDropShadowElement.instance.result_Getter_(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDropShadowElement.instance.width_Getter_(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDropShadowElement.instance.x_Getter_(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDropShadowElement.instance.y_Getter_(this);
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8813,11 +8075,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static _SVGMPathElement internalCreate_SVGMPathElement() {
-    return new _SVGMPathElement._internalWrap();
-  }
-
-  external factory _SVGMPathElement._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _SVGMPathElement.internal_() : super.internal_();
@@ -8830,6 +8088,6 @@
   _SVGMPathElement.created() : super.created();
 
   // Override these methods for Dartium _SVGMPathElement can't be abstract.
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGMPathElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGMPathElement.instance.href_Getter_(this);
 }
 
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index d318a3d..c73b31b 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -21,68 +21,34 @@
 // FIXME: Can we make this private?
 @Deprecated("Internal Use Only")
 final web_audioBlinkMap = {
-  'AnalyserNode': () => AnalyserNode,
-  'AudioBuffer': () => AudioBuffer,
-  'AudioBufferSourceNode': () => AudioBufferSourceNode,
-  'AudioContext': () => AudioContext,
-  'AudioDestinationNode': () => AudioDestinationNode,
-  'AudioListener': () => AudioListener,
-  'AudioNode': () => AudioNode,
-  'AudioParam': () => AudioParam,
-  'AudioProcessingEvent': () => AudioProcessingEvent,
-  'AudioSourceNode': () => AudioSourceNode,
-  'BiquadFilterNode': () => BiquadFilterNode,
-  'ChannelMergerNode': () => ChannelMergerNode,
-  'ChannelSplitterNode': () => ChannelSplitterNode,
-  'ConvolverNode': () => ConvolverNode,
-  'DelayNode': () => DelayNode,
-  'DynamicsCompressorNode': () => DynamicsCompressorNode,
-  'GainNode': () => GainNode,
-  'MediaElementAudioSourceNode': () => MediaElementAudioSourceNode,
-  'MediaStreamAudioDestinationNode': () => MediaStreamAudioDestinationNode,
-  'MediaStreamAudioSourceNode': () => MediaStreamAudioSourceNode,
-  'OfflineAudioCompletionEvent': () => OfflineAudioCompletionEvent,
-  'OfflineAudioContext': () => OfflineAudioContext,
-  'OscillatorNode': () => OscillatorNode,
-  'PannerNode': () => PannerNode,
-  'PeriodicWave': () => PeriodicWave,
-  'ScriptProcessorNode': () => ScriptProcessorNode,
-  'StereoPannerNode': () => StereoPannerNode,
-  'WaveShaperNode': () => WaveShaperNode,
-
-};
-
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final web_audioBlinkFunctionMap = {
-  'AnalyserNode': () => AnalyserNode.internalCreateAnalyserNode,
-  'AudioBuffer': () => AudioBuffer.internalCreateAudioBuffer,
-  'AudioBufferSourceNode': () => AudioBufferSourceNode.internalCreateAudioBufferSourceNode,
-  'AudioContext': () => AudioContext.internalCreateAudioContext,
-  'AudioDestinationNode': () => AudioDestinationNode.internalCreateAudioDestinationNode,
-  'AudioListener': () => AudioListener.internalCreateAudioListener,
-  'AudioNode': () => AudioNode.internalCreateAudioNode,
-  'AudioParam': () => AudioParam.internalCreateAudioParam,
-  'AudioProcessingEvent': () => AudioProcessingEvent.internalCreateAudioProcessingEvent,
-  'AudioSourceNode': () => AudioSourceNode.internalCreateAudioSourceNode,
-  'BiquadFilterNode': () => BiquadFilterNode.internalCreateBiquadFilterNode,
-  'ChannelMergerNode': () => ChannelMergerNode.internalCreateChannelMergerNode,
-  'ChannelSplitterNode': () => ChannelSplitterNode.internalCreateChannelSplitterNode,
-  'ConvolverNode': () => ConvolverNode.internalCreateConvolverNode,
-  'DelayNode': () => DelayNode.internalCreateDelayNode,
-  'DynamicsCompressorNode': () => DynamicsCompressorNode.internalCreateDynamicsCompressorNode,
-  'GainNode': () => GainNode.internalCreateGainNode,
-  'MediaElementAudioSourceNode': () => MediaElementAudioSourceNode.internalCreateMediaElementAudioSourceNode,
-  'MediaStreamAudioDestinationNode': () => MediaStreamAudioDestinationNode.internalCreateMediaStreamAudioDestinationNode,
-  'MediaStreamAudioSourceNode': () => MediaStreamAudioSourceNode.internalCreateMediaStreamAudioSourceNode,
-  'OfflineAudioCompletionEvent': () => OfflineAudioCompletionEvent.internalCreateOfflineAudioCompletionEvent,
-  'OfflineAudioContext': () => OfflineAudioContext.internalCreateOfflineAudioContext,
-  'OscillatorNode': () => OscillatorNode.internalCreateOscillatorNode,
-  'PannerNode': () => PannerNode.internalCreatePannerNode,
-  'PeriodicWave': () => PeriodicWave.internalCreatePeriodicWave,
-  'ScriptProcessorNode': () => ScriptProcessorNode.internalCreateScriptProcessorNode,
-  'StereoPannerNode': () => StereoPannerNode.internalCreateStereoPannerNode,
-  'WaveShaperNode': () => WaveShaperNode.internalCreateWaveShaperNode,
+  'AnalyserNode': () => AnalyserNode.instanceRuntimeType,
+  'AudioBuffer': () => AudioBuffer.instanceRuntimeType,
+  'AudioBufferSourceNode': () => AudioBufferSourceNode.instanceRuntimeType,
+  'AudioContext': () => AudioContext.instanceRuntimeType,
+  'AudioDestinationNode': () => AudioDestinationNode.instanceRuntimeType,
+  'AudioListener': () => AudioListener.instanceRuntimeType,
+  'AudioNode': () => AudioNode.instanceRuntimeType,
+  'AudioParam': () => AudioParam.instanceRuntimeType,
+  'AudioProcessingEvent': () => AudioProcessingEvent.instanceRuntimeType,
+  'AudioSourceNode': () => AudioSourceNode.instanceRuntimeType,
+  'BiquadFilterNode': () => BiquadFilterNode.instanceRuntimeType,
+  'ChannelMergerNode': () => ChannelMergerNode.instanceRuntimeType,
+  'ChannelSplitterNode': () => ChannelSplitterNode.instanceRuntimeType,
+  'ConvolverNode': () => ConvolverNode.instanceRuntimeType,
+  'DelayNode': () => DelayNode.instanceRuntimeType,
+  'DynamicsCompressorNode': () => DynamicsCompressorNode.instanceRuntimeType,
+  'GainNode': () => GainNode.instanceRuntimeType,
+  'MediaElementAudioSourceNode': () => MediaElementAudioSourceNode.instanceRuntimeType,
+  'MediaStreamAudioDestinationNode': () => MediaStreamAudioDestinationNode.instanceRuntimeType,
+  'MediaStreamAudioSourceNode': () => MediaStreamAudioSourceNode.instanceRuntimeType,
+  'OfflineAudioCompletionEvent': () => OfflineAudioCompletionEvent.instanceRuntimeType,
+  'OfflineAudioContext': () => OfflineAudioContext.instanceRuntimeType,
+  'OscillatorNode': () => OscillatorNode.instanceRuntimeType,
+  'PannerNode': () => PannerNode.instanceRuntimeType,
+  'PeriodicWave': () => PeriodicWave.instanceRuntimeType,
+  'ScriptProcessorNode': () => ScriptProcessorNode.instanceRuntimeType,
+  'StereoPannerNode': () => StereoPannerNode.instanceRuntimeType,
+  'WaveShaperNode': () => WaveShaperNode.instanceRuntimeType,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -102,11 +68,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AnalyserNode internalCreateAnalyserNode() {
-    return new AnalyserNode._internalWrap();
-  }
-
-  external factory AnalyserNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AnalyserNode.internal_() : super.internal_();
@@ -114,56 +76,56 @@
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  int get fftSize => _blink.BlinkAnalyserNode.instance.fftSize_Getter_(unwrap_jso(this));
+  int get fftSize => _blink.BlinkAnalyserNode.instance.fftSize_Getter_(this);
   
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  set fftSize(int value) => _blink.BlinkAnalyserNode.instance.fftSize_Setter_(unwrap_jso(this), value);
+  set fftSize(int value) => _blink.BlinkAnalyserNode.instance.fftSize_Setter_(this, value);
   
   @DomName('AnalyserNode.frequencyBinCount')
   @DocsEditable()
-  int get frequencyBinCount => _blink.BlinkAnalyserNode.instance.frequencyBinCount_Getter_(unwrap_jso(this));
+  int get frequencyBinCount => _blink.BlinkAnalyserNode.instance.frequencyBinCount_Getter_(this);
   
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  num get maxDecibels => _blink.BlinkAnalyserNode.instance.maxDecibels_Getter_(unwrap_jso(this));
+  num get maxDecibels => _blink.BlinkAnalyserNode.instance.maxDecibels_Getter_(this);
   
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  set maxDecibels(num value) => _blink.BlinkAnalyserNode.instance.maxDecibels_Setter_(unwrap_jso(this), value);
+  set maxDecibels(num value) => _blink.BlinkAnalyserNode.instance.maxDecibels_Setter_(this, value);
   
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  num get minDecibels => _blink.BlinkAnalyserNode.instance.minDecibels_Getter_(unwrap_jso(this));
+  num get minDecibels => _blink.BlinkAnalyserNode.instance.minDecibels_Getter_(this);
   
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  set minDecibels(num value) => _blink.BlinkAnalyserNode.instance.minDecibels_Setter_(unwrap_jso(this), value);
+  set minDecibels(num value) => _blink.BlinkAnalyserNode.instance.minDecibels_Setter_(this, value);
   
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  num get smoothingTimeConstant => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Getter_(unwrap_jso(this));
+  num get smoothingTimeConstant => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Getter_(this);
   
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Setter_(unwrap_jso(this), value);
+  set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Setter_(this, value);
   
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
-  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteFrequencyData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
+  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteFrequencyData_Callback_1_(this, array);
   
   @DomName('AnalyserNode.getByteTimeDomainData')
   @DocsEditable()
-  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteTimeDomainData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
+  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteTimeDomainData_Callback_1_(this, array);
   
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
-  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatFrequencyData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
+  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatFrequencyData_Callback_1_(this, array);
   
   @DomName('AnalyserNode.getFloatTimeDomainData')
   @DocsEditable()
   @Experimental() // untriaged
-  void getFloatTimeDomainData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatTimeDomainData_Callback_1_(unwrap_jso(this), unwrap_jso(array));
+  void getFloatTimeDomainData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatTimeDomainData_Callback_1_(this, array);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -181,58 +143,50 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBuffer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AudioBuffer internalCreateAudioBuffer() {
-    return new AudioBuffer._internalWrap();
-  }
 
-  factory AudioBuffer._internalWrap() {
-    return new AudioBuffer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioBuffer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  num get duration => _blink.BlinkAudioBuffer.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkAudioBuffer.instance.duration_Getter_(this);
   
   @DomName('AudioBuffer.length')
   @DocsEditable()
-  int get length => _blink.BlinkAudioBuffer.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkAudioBuffer.instance.length_Getter_(this);
   
   @DomName('AudioBuffer.numberOfChannels')
   @DocsEditable()
-  int get numberOfChannels => _blink.BlinkAudioBuffer.instance.numberOfChannels_Getter_(unwrap_jso(this));
+  int get numberOfChannels => _blink.BlinkAudioBuffer.instance.numberOfChannels_Getter_(this);
   
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  num get sampleRate => _blink.BlinkAudioBuffer.instance.sampleRate_Getter_(unwrap_jso(this));
+  num get sampleRate => _blink.BlinkAudioBuffer.instance.sampleRate_Getter_(this);
   
   void copyFromChannel(Float32List destination, int channelNumber, [int startInChannel]) {
     if (startInChannel != null) {
-      _blink.BlinkAudioBuffer.instance.copyFromChannel_Callback_3_(unwrap_jso(this), unwrap_jso(destination), channelNumber, startInChannel);
+      _blink.BlinkAudioBuffer.instance.copyFromChannel_Callback_3_(this, destination, channelNumber, startInChannel);
       return;
     }
-    _blink.BlinkAudioBuffer.instance.copyFromChannel_Callback_2_(unwrap_jso(this), unwrap_jso(destination), channelNumber);
+    _blink.BlinkAudioBuffer.instance.copyFromChannel_Callback_2_(this, destination, channelNumber);
     return;
   }
 
   void copyToChannel(Float32List source, int channelNumber, [int startInChannel]) {
     if (startInChannel != null) {
-      _blink.BlinkAudioBuffer.instance.copyToChannel_Callback_3_(unwrap_jso(this), unwrap_jso(source), channelNumber, startInChannel);
+      _blink.BlinkAudioBuffer.instance.copyToChannel_Callback_3_(this, source, channelNumber, startInChannel);
       return;
     }
-    _blink.BlinkAudioBuffer.instance.copyToChannel_Callback_2_(unwrap_jso(this), unwrap_jso(source), channelNumber);
+    _blink.BlinkAudioBuffer.instance.copyToChannel_Callback_2_(this, source, channelNumber);
     return;
   }
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
-  Float32List getChannelData(int channelIndex) => wrap_jso(_blink.BlinkAudioBuffer.instance.getChannelData_Callback_1_(unwrap_jso(this), channelIndex));
+  Float32List getChannelData(int channelIndex) => _blink.BlinkAudioBuffer.instance.getChannelData_Callback_1_(this, channelIndex);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -276,11 +230,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AudioBufferSourceNode internalCreateAudioBufferSourceNode() {
-    return new AudioBufferSourceNode._internalWrap();
-  }
-
-  external factory AudioBufferSourceNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioBufferSourceNode.internal_() : super.internal_();
@@ -288,68 +238,68 @@
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => wrap_jso(_blink.BlinkAudioBufferSourceNode.instance.buffer_Getter_(unwrap_jso(this)));
+  AudioBuffer get buffer => _blink.BlinkAudioBufferSourceNode.instance.buffer_Getter_(this);
   
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.instance.buffer_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.instance.buffer_Setter_(this, value);
   
   @DomName('AudioBufferSourceNode.detune')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioParam get detune => wrap_jso(_blink.BlinkAudioBufferSourceNode.instance.detune_Getter_(unwrap_jso(this)));
+  AudioParam get detune => _blink.BlinkAudioBufferSourceNode.instance.detune_Getter_(this);
   
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  bool get loop => _blink.BlinkAudioBufferSourceNode.instance.loop_Getter_(unwrap_jso(this));
+  bool get loop => _blink.BlinkAudioBufferSourceNode.instance.loop_Getter_(this);
   
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  set loop(bool value) => _blink.BlinkAudioBufferSourceNode.instance.loop_Setter_(unwrap_jso(this), value);
+  set loop(bool value) => _blink.BlinkAudioBufferSourceNode.instance.loop_Setter_(this, value);
   
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  num get loopEnd => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Getter_(unwrap_jso(this));
+  num get loopEnd => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Getter_(this);
   
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Setter_(unwrap_jso(this), value);
+  set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Setter_(this, value);
   
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  num get loopStart => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Getter_(unwrap_jso(this));
+  num get loopStart => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Getter_(this);
   
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Setter_(unwrap_jso(this), value);
+  set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Setter_(this, value);
   
   @DomName('AudioBufferSourceNode.playbackRate')
   @DocsEditable()
-  AudioParam get playbackRate => wrap_jso(_blink.BlinkAudioBufferSourceNode.instance.playbackRate_Getter_(unwrap_jso(this)));
+  AudioParam get playbackRate => _blink.BlinkAudioBufferSourceNode.instance.playbackRate_Getter_(this);
   
   void start([num when, num grainOffset, num grainDuration]) {
     if (grainDuration != null) {
-      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_3_(unwrap_jso(this), when, grainOffset, grainDuration);
+      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_3_(this, when, grainOffset, grainDuration);
       return;
     }
     if (grainOffset != null) {
-      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_2_(unwrap_jso(this), when, grainOffset);
+      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_2_(this, when, grainOffset);
       return;
     }
     if (when != null) {
-      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_1_(unwrap_jso(this), when);
+      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkAudioBufferSourceNode.instance.start_Callback_0_(unwrap_jso(this));
+    _blink.BlinkAudioBufferSourceNode.instance.start_Callback_0_(this);
     return;
   }
 
   void stop([num when]) {
     if (when != null) {
-      _blink.BlinkAudioBufferSourceNode.instance.stop_Callback_1_(unwrap_jso(this), when);
+      _blink.BlinkAudioBufferSourceNode.instance.stop_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkAudioBufferSourceNode.instance.stop_Callback_0_(unwrap_jso(this));
+    _blink.BlinkAudioBufferSourceNode.instance.stop_Callback_0_(this);
     return;
   }
 
@@ -377,16 +327,12 @@
   @DomName('AudioContext.AudioContext')
   @DocsEditable()
   factory AudioContext() {
-    return wrap_jso(_blink.BlinkAudioContext.instance.constructorCallback_0_());
+    return _blink.BlinkAudioContext.instance.constructorCallback_0_();
   }
 
 
   @Deprecated("Internal Use Only")
-  static AudioContext internalCreateAudioContext() {
-    return new AudioContext._internalWrap();
-  }
-
-  external factory AudioContext._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioContext.internal_() : super.internal_();
@@ -397,144 +343,144 @@
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.BlinkAudioContext.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkAudioContext.instance.currentTime_Getter_(this);
   
   @DomName('AudioContext.destination')
   @DocsEditable()
-  AudioDestinationNode get destination => wrap_jso(_blink.BlinkAudioContext.instance.destination_Getter_(unwrap_jso(this)));
+  AudioDestinationNode get destination => _blink.BlinkAudioContext.instance.destination_Getter_(this);
   
   @DomName('AudioContext.listener')
   @DocsEditable()
-  AudioListener get listener => wrap_jso(_blink.BlinkAudioContext.instance.listener_Getter_(unwrap_jso(this)));
+  AudioListener get listener => _blink.BlinkAudioContext.instance.listener_Getter_(this);
   
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  num get sampleRate => _blink.BlinkAudioContext.instance.sampleRate_Getter_(unwrap_jso(this));
+  num get sampleRate => _blink.BlinkAudioContext.instance.sampleRate_Getter_(this);
   
   @DomName('AudioContext.state')
   @DocsEditable()
   @Experimental() // untriaged
-  String get state => _blink.BlinkAudioContext.instance.state_Getter_(unwrap_jso(this));
+  String get state => _blink.BlinkAudioContext.instance.state_Getter_(this);
   
   @DomName('AudioContext.close')
   @DocsEditable()
   @Experimental() // untriaged
-  Future close() => wrap_jso(_blink.BlinkAudioContext.instance.close_Callback_0_(unwrap_jso(this)));
+  Future close() => convertNativePromiseToDartFuture(_blink.BlinkAudioContext.instance.close_Callback_0_(this));
   
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
-  AnalyserNode createAnalyser() => wrap_jso(_blink.BlinkAudioContext.instance.createAnalyser_Callback_0_(unwrap_jso(this)));
+  AnalyserNode createAnalyser() => _blink.BlinkAudioContext.instance.createAnalyser_Callback_0_(this);
   
   @DomName('AudioContext.createBiquadFilter')
   @DocsEditable()
-  BiquadFilterNode createBiquadFilter() => wrap_jso(_blink.BlinkAudioContext.instance.createBiquadFilter_Callback_0_(unwrap_jso(this)));
+  BiquadFilterNode createBiquadFilter() => _blink.BlinkAudioContext.instance.createBiquadFilter_Callback_0_(this);
   
   @DomName('AudioContext.createBuffer')
   @DocsEditable()
-  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => wrap_jso(_blink.BlinkAudioContext.instance.createBuffer_Callback_3_(unwrap_jso(this), numberOfChannels, numberOfFrames, sampleRate));
+  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.BlinkAudioContext.instance.createBuffer_Callback_3_(this, numberOfChannels, numberOfFrames, sampleRate);
   
   @DomName('AudioContext.createBufferSource')
   @DocsEditable()
-  AudioBufferSourceNode createBufferSource() => wrap_jso(_blink.BlinkAudioContext.instance.createBufferSource_Callback_0_(unwrap_jso(this)));
+  AudioBufferSourceNode createBufferSource() => _blink.BlinkAudioContext.instance.createBufferSource_Callback_0_(this);
   
   ChannelMergerNode createChannelMerger([int numberOfInputs]) {
     if (numberOfInputs != null) {
-      return wrap_jso(_blink.BlinkAudioContext.instance.createChannelMerger_Callback_1_(unwrap_jso(this), numberOfInputs));
+      return _blink.BlinkAudioContext.instance.createChannelMerger_Callback_1_(this, numberOfInputs);
     }
-    return wrap_jso(_blink.BlinkAudioContext.instance.createChannelMerger_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkAudioContext.instance.createChannelMerger_Callback_0_(this);
   }
 
   ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) {
     if (numberOfOutputs != null) {
-      return wrap_jso(_blink.BlinkAudioContext.instance.createChannelSplitter_Callback_1_(unwrap_jso(this), numberOfOutputs));
+      return _blink.BlinkAudioContext.instance.createChannelSplitter_Callback_1_(this, numberOfOutputs);
     }
-    return wrap_jso(_blink.BlinkAudioContext.instance.createChannelSplitter_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkAudioContext.instance.createChannelSplitter_Callback_0_(this);
   }
 
   @DomName('AudioContext.createConvolver')
   @DocsEditable()
-  ConvolverNode createConvolver() => wrap_jso(_blink.BlinkAudioContext.instance.createConvolver_Callback_0_(unwrap_jso(this)));
+  ConvolverNode createConvolver() => _blink.BlinkAudioContext.instance.createConvolver_Callback_0_(this);
   
   DelayNode createDelay([num maxDelayTime]) {
     if (maxDelayTime != null) {
-      return wrap_jso(_blink.BlinkAudioContext.instance.createDelay_Callback_1_(unwrap_jso(this), maxDelayTime));
+      return _blink.BlinkAudioContext.instance.createDelay_Callback_1_(this, maxDelayTime);
     }
-    return wrap_jso(_blink.BlinkAudioContext.instance.createDelay_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkAudioContext.instance.createDelay_Callback_0_(this);
   }
 
   @DomName('AudioContext.createDynamicsCompressor')
   @DocsEditable()
-  DynamicsCompressorNode createDynamicsCompressor() => wrap_jso(_blink.BlinkAudioContext.instance.createDynamicsCompressor_Callback_0_(unwrap_jso(this)));
+  DynamicsCompressorNode createDynamicsCompressor() => _blink.BlinkAudioContext.instance.createDynamicsCompressor_Callback_0_(this);
   
   @DomName('AudioContext.createGain')
   @DocsEditable()
-  GainNode createGain() => wrap_jso(_blink.BlinkAudioContext.instance.createGain_Callback_0_(unwrap_jso(this)));
+  GainNode createGain() => _blink.BlinkAudioContext.instance.createGain_Callback_0_(this);
   
   @DomName('AudioContext.createMediaElementSource')
   @DocsEditable()
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => wrap_jso(_blink.BlinkAudioContext.instance.createMediaElementSource_Callback_1_(unwrap_jso(this), unwrap_jso(mediaElement)));
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.BlinkAudioContext.instance.createMediaElementSource_Callback_1_(this, mediaElement);
   
   @DomName('AudioContext.createMediaStreamDestination')
   @DocsEditable()
-  MediaStreamAudioDestinationNode createMediaStreamDestination() => wrap_jso(_blink.BlinkAudioContext.instance.createMediaStreamDestination_Callback_0_(unwrap_jso(this)));
+  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.BlinkAudioContext.instance.createMediaStreamDestination_Callback_0_(this);
   
   @DomName('AudioContext.createMediaStreamSource')
   @DocsEditable()
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => wrap_jso(_blink.BlinkAudioContext.instance.createMediaStreamSource_Callback_1_(unwrap_jso(this), unwrap_jso(mediaStream)));
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.BlinkAudioContext.instance.createMediaStreamSource_Callback_1_(this, mediaStream);
   
   @DomName('AudioContext.createOscillator')
   @DocsEditable()
-  OscillatorNode createOscillator() => wrap_jso(_blink.BlinkAudioContext.instance.createOscillator_Callback_0_(unwrap_jso(this)));
+  OscillatorNode createOscillator() => _blink.BlinkAudioContext.instance.createOscillator_Callback_0_(this);
   
   @DomName('AudioContext.createPanner')
   @DocsEditable()
-  PannerNode createPanner() => wrap_jso(_blink.BlinkAudioContext.instance.createPanner_Callback_0_(unwrap_jso(this)));
+  PannerNode createPanner() => _blink.BlinkAudioContext.instance.createPanner_Callback_0_(this);
   
   @DomName('AudioContext.createPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => wrap_jso(_blink.BlinkAudioContext.instance.createPeriodicWave_Callback_2_(unwrap_jso(this), unwrap_jso(real), unwrap_jso(imag)));
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.BlinkAudioContext.instance.createPeriodicWave_Callback_2_(this, real, imag);
   
   ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) {
     if (numberOfOutputChannels != null) {
-      return wrap_jso(_blink.BlinkAudioContext.instance.createScriptProcessor_Callback_3_(unwrap_jso(this), bufferSize, numberOfInputChannels, numberOfOutputChannels));
+      return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_3_(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
     }
     if (numberOfInputChannels != null) {
-      return wrap_jso(_blink.BlinkAudioContext.instance.createScriptProcessor_Callback_2_(unwrap_jso(this), bufferSize, numberOfInputChannels));
+      return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_2_(this, bufferSize, numberOfInputChannels);
     }
     if (bufferSize != null) {
-      return wrap_jso(_blink.BlinkAudioContext.instance.createScriptProcessor_Callback_1_(unwrap_jso(this), bufferSize));
+      return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_1_(this, bufferSize);
     }
-    return wrap_jso(_blink.BlinkAudioContext.instance.createScriptProcessor_Callback_0_(unwrap_jso(this)));
+    return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_0_(this);
   }
 
   @DomName('AudioContext.createStereoPanner')
   @DocsEditable()
   @Experimental() // untriaged
-  StereoPannerNode createStereoPanner() => wrap_jso(_blink.BlinkAudioContext.instance.createStereoPanner_Callback_0_(unwrap_jso(this)));
+  StereoPannerNode createStereoPanner() => _blink.BlinkAudioContext.instance.createStereoPanner_Callback_0_(this);
   
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
-  WaveShaperNode createWaveShaper() => wrap_jso(_blink.BlinkAudioContext.instance.createWaveShaper_Callback_0_(unwrap_jso(this)));
+  WaveShaperNode createWaveShaper() => _blink.BlinkAudioContext.instance.createWaveShaper_Callback_0_(this);
   
   void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkAudioContext.instance.decodeAudioData_Callback_3_(unwrap_jso(this), unwrap_jso(audioData), unwrap_jso((audioBuffer) => successCallback(wrap_jso(audioBuffer))), unwrap_jso((audioBuffer) => errorCallback(wrap_jso(audioBuffer))));
+      _blink.BlinkAudioContext.instance.decodeAudioData_Callback_3_(this, audioData, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkAudioContext.instance.decodeAudioData_Callback_2_(unwrap_jso(this), unwrap_jso(audioData), unwrap_jso((audioBuffer) => successCallback(wrap_jso(audioBuffer))));
+    _blink.BlinkAudioContext.instance.decodeAudioData_Callback_2_(this, audioData, successCallback);
     return;
   }
 
   @DomName('AudioContext.resume')
   @DocsEditable()
   @Experimental() // untriaged
-  Future resume() => wrap_jso(_blink.BlinkAudioContext.instance.resume_Callback_0_(unwrap_jso(this)));
+  Future resume() => convertNativePromiseToDartFuture(_blink.BlinkAudioContext.instance.resume_Callback_0_(this));
   
   @DomName('AudioContext.suspend')
   @DocsEditable()
   @Experimental() // untriaged
-  Future suspend() => wrap_jso(_blink.BlinkAudioContext.instance.suspend_Callback_0_(unwrap_jso(this)));
+  Future suspend() => convertNativePromiseToDartFuture(_blink.BlinkAudioContext.instance.suspend_Callback_0_(this));
   
   @DomName('AudioContext.decodeAudioData')
   Future<AudioBuffer> decodeAudioData(ByteBuffer audioData) {
@@ -568,11 +514,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AudioDestinationNode internalCreateAudioDestinationNode() {
-    return new AudioDestinationNode._internalWrap();
-  }
-
-  external factory AudioDestinationNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioDestinationNode.internal_() : super.internal_();
@@ -580,7 +522,7 @@
 
   @DomName('AudioDestinationNode.maxChannelCount')
   @DocsEditable()
-  int get maxChannelCount => _blink.BlinkAudioDestinationNode.instance.maxChannelCount_Getter_(unwrap_jso(this));
+  int get maxChannelCount => _blink.BlinkAudioDestinationNode.instance.maxChannelCount_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -598,48 +540,40 @@
   // To suppress missing implicit constructor warnings.
   factory AudioListener._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AudioListener internalCreateAudioListener() {
-    return new AudioListener._internalWrap();
-  }
 
-  factory AudioListener._internalWrap() {
-    return new AudioListener.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioListener.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  num get dopplerFactor => _blink.BlinkAudioListener.instance.dopplerFactor_Getter_(unwrap_jso(this));
+  num get dopplerFactor => _blink.BlinkAudioListener.instance.dopplerFactor_Getter_(this);
   
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  set dopplerFactor(num value) => _blink.BlinkAudioListener.instance.dopplerFactor_Setter_(unwrap_jso(this), value);
+  set dopplerFactor(num value) => _blink.BlinkAudioListener.instance.dopplerFactor_Setter_(this, value);
   
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  num get speedOfSound => _blink.BlinkAudioListener.instance.speedOfSound_Getter_(unwrap_jso(this));
+  num get speedOfSound => _blink.BlinkAudioListener.instance.speedOfSound_Getter_(this);
   
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  set speedOfSound(num value) => _blink.BlinkAudioListener.instance.speedOfSound_Setter_(unwrap_jso(this), value);
+  set speedOfSound(num value) => _blink.BlinkAudioListener.instance.speedOfSound_Setter_(this, value);
   
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.BlinkAudioListener.instance.setOrientation_Callback_6_(unwrap_jso(this), x, y, z, xUp, yUp, zUp);
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.BlinkAudioListener.instance.setOrientation_Callback_6_(this, x, y, z, xUp, yUp, zUp);
   
   @DomName('AudioListener.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.BlinkAudioListener.instance.setPosition_Callback_3_(unwrap_jso(this), x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkAudioListener.instance.setPosition_Callback_3_(this, x, y, z);
   
   @DomName('AudioListener.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.BlinkAudioListener.instance.setVelocity_Callback_3_(unwrap_jso(this), x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkAudioListener.instance.setVelocity_Callback_3_(this, x, y, z);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -656,11 +590,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AudioNode internalCreateAudioNode() {
-    return new AudioNode._internalWrap();
-  }
-
-  external factory AudioNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioNode.internal_() : super.internal_();
@@ -668,59 +598,59 @@
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  int get channelCount => _blink.BlinkAudioNode.instance.channelCount_Getter_(unwrap_jso(this));
+  int get channelCount => _blink.BlinkAudioNode.instance.channelCount_Getter_(this);
   
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  set channelCount(int value) => _blink.BlinkAudioNode.instance.channelCount_Setter_(unwrap_jso(this), value);
+  set channelCount(int value) => _blink.BlinkAudioNode.instance.channelCount_Setter_(this, value);
   
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  String get channelCountMode => _blink.BlinkAudioNode.instance.channelCountMode_Getter_(unwrap_jso(this));
+  String get channelCountMode => _blink.BlinkAudioNode.instance.channelCountMode_Getter_(this);
   
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  set channelCountMode(String value) => _blink.BlinkAudioNode.instance.channelCountMode_Setter_(unwrap_jso(this), value);
+  set channelCountMode(String value) => _blink.BlinkAudioNode.instance.channelCountMode_Setter_(this, value);
   
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  String get channelInterpretation => _blink.BlinkAudioNode.instance.channelInterpretation_Getter_(unwrap_jso(this));
+  String get channelInterpretation => _blink.BlinkAudioNode.instance.channelInterpretation_Getter_(this);
   
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  set channelInterpretation(String value) => _blink.BlinkAudioNode.instance.channelInterpretation_Setter_(unwrap_jso(this), value);
+  set channelInterpretation(String value) => _blink.BlinkAudioNode.instance.channelInterpretation_Setter_(this, value);
   
   @DomName('AudioNode.context')
   @DocsEditable()
-  AudioContext get context => wrap_jso(_blink.BlinkAudioNode.instance.context_Getter_(unwrap_jso(this)));
+  AudioContext get context => _blink.BlinkAudioNode.instance.context_Getter_(this);
   
   @DomName('AudioNode.numberOfInputs')
   @DocsEditable()
-  int get numberOfInputs => _blink.BlinkAudioNode.instance.numberOfInputs_Getter_(unwrap_jso(this));
+  int get numberOfInputs => _blink.BlinkAudioNode.instance.numberOfInputs_Getter_(this);
   
   @DomName('AudioNode.numberOfOutputs')
   @DocsEditable()
-  int get numberOfOutputs => _blink.BlinkAudioNode.instance.numberOfOutputs_Getter_(unwrap_jso(this));
+  int get numberOfOutputs => _blink.BlinkAudioNode.instance.numberOfOutputs_Getter_(this);
   
   void _connect(destination, [int output, int input]) {
     if ((destination is AudioNode) && output == null && input == null) {
-      _blink.BlinkAudioNode.instance.connect_Callback_1_(unwrap_jso(this), unwrap_jso(destination));
+      _blink.BlinkAudioNode.instance.connect_Callback_1_(this, destination);
       return;
     }
     if ((output is int || output == null) && (destination is AudioNode) && input == null) {
-      _blink.BlinkAudioNode.instance.connect_Callback_2_(unwrap_jso(this), unwrap_jso(destination), output);
+      _blink.BlinkAudioNode.instance.connect_Callback_2_(this, destination, output);
       return;
     }
     if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode)) {
-      _blink.BlinkAudioNode.instance.connect_Callback_3_(unwrap_jso(this), unwrap_jso(destination), output, input);
+      _blink.BlinkAudioNode.instance.connect_Callback_3_(this, destination, output, input);
       return;
     }
     if ((destination is AudioParam) && output == null && input == null) {
-      _blink.BlinkAudioNode.instance.connect_Callback_1_(unwrap_jso(this), unwrap_jso(destination));
+      _blink.BlinkAudioNode.instance.connect_Callback_1_(this, destination);
       return;
     }
     if ((output is int || output == null) && (destination is AudioParam) && input == null) {
-      _blink.BlinkAudioNode.instance.connect_Callback_2_(unwrap_jso(this), unwrap_jso(destination), output);
+      _blink.BlinkAudioNode.instance.connect_Callback_2_(this, destination, output);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -728,31 +658,31 @@
 
   void disconnect([destination_OR_output, int output, int input]) {
     if (destination_OR_output == null && output == null && input == null) {
-      _blink.BlinkAudioNode.instance.disconnect_Callback_0_(unwrap_jso(this));
+      _blink.BlinkAudioNode.instance.disconnect_Callback_0_(this);
       return;
     }
     if ((destination_OR_output is int) && output == null && input == null) {
-      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(unwrap_jso(this), unwrap_jso(destination_OR_output));
+      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(this, destination_OR_output);
       return;
     }
     if ((destination_OR_output is AudioNode) && output == null && input == null) {
-      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(unwrap_jso(this), unwrap_jso(destination_OR_output));
+      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(this, destination_OR_output);
       return;
     }
     if ((output is int) && (destination_OR_output is AudioNode) && input == null) {
-      _blink.BlinkAudioNode.instance.disconnect_Callback_2_(unwrap_jso(this), unwrap_jso(destination_OR_output), output);
+      _blink.BlinkAudioNode.instance.disconnect_Callback_2_(this, destination_OR_output, output);
       return;
     }
     if ((input is int) && (output is int) && (destination_OR_output is AudioNode)) {
-      _blink.BlinkAudioNode.instance.disconnect_Callback_3_(unwrap_jso(this), unwrap_jso(destination_OR_output), output, input);
+      _blink.BlinkAudioNode.instance.disconnect_Callback_3_(this, destination_OR_output, output, input);
       return;
     }
     if ((destination_OR_output is AudioParam) && output == null && input == null) {
-      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(unwrap_jso(this), unwrap_jso(destination_OR_output));
+      _blink.BlinkAudioNode.instance.disconnect_Callback_1_(this, destination_OR_output);
       return;
     }
     if ((output is int) && (destination_OR_output is AudioParam) && input == null) {
-      _blink.BlinkAudioNode.instance.disconnect_Callback_2_(unwrap_jso(this), unwrap_jso(destination_OR_output), output);
+      _blink.BlinkAudioNode.instance.disconnect_Callback_2_(this, destination_OR_output, output);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -781,56 +711,48 @@
   // To suppress missing implicit constructor warnings.
   factory AudioParam._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AudioParam internalCreateAudioParam() {
-    return new AudioParam._internalWrap();
-  }
 
-  factory AudioParam._internalWrap() {
-    return new AudioParam.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioParam.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  num get defaultValue => _blink.BlinkAudioParam.instance.defaultValue_Getter_(unwrap_jso(this));
+  num get defaultValue => _blink.BlinkAudioParam.instance.defaultValue_Getter_(this);
   
   @DomName('AudioParam.value')
   @DocsEditable()
-  num get value => _blink.BlinkAudioParam.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkAudioParam.instance.value_Getter_(this);
   
   @DomName('AudioParam.value')
   @DocsEditable()
-  set value(num value) => _blink.BlinkAudioParam.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkAudioParam.instance.value_Setter_(this, value);
   
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
-  void cancelScheduledValues(num startTime) => _blink.BlinkAudioParam.instance.cancelScheduledValues_Callback_1_(unwrap_jso(this), startTime);
+  void cancelScheduledValues(num startTime) => _blink.BlinkAudioParam.instance.cancelScheduledValues_Callback_1_(this, startTime);
   
   @DomName('AudioParam.exponentialRampToValueAtTime')
   @DocsEditable()
-  void exponentialRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.exponentialRampToValueAtTime_Callback_2_(unwrap_jso(this), value, time);
+  void exponentialRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.exponentialRampToValueAtTime_Callback_2_(this, value, time);
   
   @DomName('AudioParam.linearRampToValueAtTime')
   @DocsEditable()
-  void linearRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.linearRampToValueAtTime_Callback_2_(unwrap_jso(this), value, time);
+  void linearRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.linearRampToValueAtTime_Callback_2_(this, value, time);
   
   @DomName('AudioParam.setTargetAtTime')
   @DocsEditable()
-  void setTargetAtTime(num target, num time, num timeConstant) => _blink.BlinkAudioParam.instance.setTargetAtTime_Callback_3_(unwrap_jso(this), target, time, timeConstant);
+  void setTargetAtTime(num target, num time, num timeConstant) => _blink.BlinkAudioParam.instance.setTargetAtTime_Callback_3_(this, target, time, timeConstant);
   
   @DomName('AudioParam.setValueAtTime')
   @DocsEditable()
-  void setValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.setValueAtTime_Callback_2_(unwrap_jso(this), value, time);
+  void setValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.setValueAtTime_Callback_2_(this, value, time);
   
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.instance.setValueCurveAtTime_Callback_3_(unwrap_jso(this), unwrap_jso(values), time, duration);
+  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.instance.setValueCurveAtTime_Callback_3_(this, values, time, duration);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -850,11 +772,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AudioProcessingEvent internalCreateAudioProcessingEvent() {
-    return new AudioProcessingEvent._internalWrap();
-  }
-
-  external factory AudioProcessingEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioProcessingEvent.internal_() : super.internal_();
@@ -862,16 +780,16 @@
 
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
-  AudioBuffer get inputBuffer => wrap_jso(_blink.BlinkAudioProcessingEvent.instance.inputBuffer_Getter_(unwrap_jso(this)));
+  AudioBuffer get inputBuffer => _blink.BlinkAudioProcessingEvent.instance.inputBuffer_Getter_(this);
   
   @DomName('AudioProcessingEvent.outputBuffer')
   @DocsEditable()
-  AudioBuffer get outputBuffer => wrap_jso(_blink.BlinkAudioProcessingEvent.instance.outputBuffer_Getter_(unwrap_jso(this)));
+  AudioBuffer get outputBuffer => _blink.BlinkAudioProcessingEvent.instance.outputBuffer_Getter_(this);
   
   @DomName('AudioProcessingEvent.playbackTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackTime => _blink.BlinkAudioProcessingEvent.instance.playbackTime_Getter_(unwrap_jso(this));
+  num get playbackTime => _blink.BlinkAudioProcessingEvent.instance.playbackTime_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -891,11 +809,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static AudioSourceNode internalCreateAudioSourceNode() {
-    return new AudioSourceNode._internalWrap();
-  }
-
-  external factory AudioSourceNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AudioSourceNode.internal_() : super.internal_();
@@ -919,11 +833,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static BiquadFilterNode internalCreateBiquadFilterNode() {
-    return new BiquadFilterNode._internalWrap();
-  }
-
-  external factory BiquadFilterNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   BiquadFilterNode.internal_() : super.internal_();
@@ -931,31 +841,31 @@
 
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
-  AudioParam get Q => wrap_jso(_blink.BlinkBiquadFilterNode.instance.Q_Getter_(unwrap_jso(this)));
+  AudioParam get Q => _blink.BlinkBiquadFilterNode.instance.Q_Getter_(this);
   
   @DomName('BiquadFilterNode.detune')
   @DocsEditable()
-  AudioParam get detune => wrap_jso(_blink.BlinkBiquadFilterNode.instance.detune_Getter_(unwrap_jso(this)));
+  AudioParam get detune => _blink.BlinkBiquadFilterNode.instance.detune_Getter_(this);
   
   @DomName('BiquadFilterNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => wrap_jso(_blink.BlinkBiquadFilterNode.instance.frequency_Getter_(unwrap_jso(this)));
+  AudioParam get frequency => _blink.BlinkBiquadFilterNode.instance.frequency_Getter_(this);
   
   @DomName('BiquadFilterNode.gain')
   @DocsEditable()
-  AudioParam get gain => wrap_jso(_blink.BlinkBiquadFilterNode.instance.gain_Getter_(unwrap_jso(this)));
+  AudioParam get gain => _blink.BlinkBiquadFilterNode.instance.gain_Getter_(this);
   
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  String get type => _blink.BlinkBiquadFilterNode.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkBiquadFilterNode.instance.type_Getter_(this);
   
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkBiquadFilterNode.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkBiquadFilterNode.instance.type_Setter_(this, value);
   
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
-  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.instance.getFrequencyResponse_Callback_3_(unwrap_jso(this), unwrap_jso(frequencyHz), unwrap_jso(magResponse), unwrap_jso(phaseResponse));
+  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.instance.getFrequencyResponse_Callback_3_(this, frequencyHz, magResponse, phaseResponse);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -975,11 +885,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ChannelMergerNode internalCreateChannelMergerNode() {
-    return new ChannelMergerNode._internalWrap();
-  }
-
-  external factory ChannelMergerNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ChannelMergerNode.internal_() : super.internal_();
@@ -1003,11 +909,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ChannelSplitterNode internalCreateChannelSplitterNode() {
-    return new ChannelSplitterNode._internalWrap();
-  }
-
-  external factory ChannelSplitterNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ChannelSplitterNode.internal_() : super.internal_();
@@ -1031,11 +933,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ConvolverNode internalCreateConvolverNode() {
-    return new ConvolverNode._internalWrap();
-  }
-
-  external factory ConvolverNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ConvolverNode.internal_() : super.internal_();
@@ -1043,19 +941,19 @@
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => wrap_jso(_blink.BlinkConvolverNode.instance.buffer_Getter_(unwrap_jso(this)));
+  AudioBuffer get buffer => _blink.BlinkConvolverNode.instance.buffer_Getter_(this);
   
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.instance.buffer_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.instance.buffer_Setter_(this, value);
   
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  bool get normalize => _blink.BlinkConvolverNode.instance.normalize_Getter_(unwrap_jso(this));
+  bool get normalize => _blink.BlinkConvolverNode.instance.normalize_Getter_(this);
   
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  set normalize(bool value) => _blink.BlinkConvolverNode.instance.normalize_Setter_(unwrap_jso(this), value);
+  set normalize(bool value) => _blink.BlinkConvolverNode.instance.normalize_Setter_(this, value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1075,11 +973,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DelayNode internalCreateDelayNode() {
-    return new DelayNode._internalWrap();
-  }
-
-  external factory DelayNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DelayNode.internal_() : super.internal_();
@@ -1087,7 +981,7 @@
 
   @DomName('DelayNode.delayTime')
   @DocsEditable()
-  AudioParam get delayTime => wrap_jso(_blink.BlinkDelayNode.instance.delayTime_Getter_(unwrap_jso(this)));
+  AudioParam get delayTime => _blink.BlinkDelayNode.instance.delayTime_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1107,11 +1001,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static DynamicsCompressorNode internalCreateDynamicsCompressorNode() {
-    return new DynamicsCompressorNode._internalWrap();
-  }
-
-  external factory DynamicsCompressorNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DynamicsCompressorNode.internal_() : super.internal_();
@@ -1119,27 +1009,27 @@
 
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
-  AudioParam get attack => wrap_jso(_blink.BlinkDynamicsCompressorNode.instance.attack_Getter_(unwrap_jso(this)));
+  AudioParam get attack => _blink.BlinkDynamicsCompressorNode.instance.attack_Getter_(this);
   
   @DomName('DynamicsCompressorNode.knee')
   @DocsEditable()
-  AudioParam get knee => wrap_jso(_blink.BlinkDynamicsCompressorNode.instance.knee_Getter_(unwrap_jso(this)));
+  AudioParam get knee => _blink.BlinkDynamicsCompressorNode.instance.knee_Getter_(this);
   
   @DomName('DynamicsCompressorNode.ratio')
   @DocsEditable()
-  AudioParam get ratio => wrap_jso(_blink.BlinkDynamicsCompressorNode.instance.ratio_Getter_(unwrap_jso(this)));
+  AudioParam get ratio => _blink.BlinkDynamicsCompressorNode.instance.ratio_Getter_(this);
   
   @DomName('DynamicsCompressorNode.reduction')
   @DocsEditable()
-  AudioParam get reduction => wrap_jso(_blink.BlinkDynamicsCompressorNode.instance.reduction_Getter_(unwrap_jso(this)));
+  AudioParam get reduction => _blink.BlinkDynamicsCompressorNode.instance.reduction_Getter_(this);
   
   @DomName('DynamicsCompressorNode.release')
   @DocsEditable()
-  AudioParam get release => wrap_jso(_blink.BlinkDynamicsCompressorNode.instance.release_Getter_(unwrap_jso(this)));
+  AudioParam get release => _blink.BlinkDynamicsCompressorNode.instance.release_Getter_(this);
   
   @DomName('DynamicsCompressorNode.threshold')
   @DocsEditable()
-  AudioParam get threshold => wrap_jso(_blink.BlinkDynamicsCompressorNode.instance.threshold_Getter_(unwrap_jso(this)));
+  AudioParam get threshold => _blink.BlinkDynamicsCompressorNode.instance.threshold_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1159,11 +1049,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static GainNode internalCreateGainNode() {
-    return new GainNode._internalWrap();
-  }
-
-  external factory GainNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   GainNode.internal_() : super.internal_();
@@ -1171,7 +1057,7 @@
 
   @DomName('GainNode.gain')
   @DocsEditable()
-  AudioParam get gain => wrap_jso(_blink.BlinkGainNode.instance.gain_Getter_(unwrap_jso(this)));
+  AudioParam get gain => _blink.BlinkGainNode.instance.gain_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1191,11 +1077,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaElementAudioSourceNode internalCreateMediaElementAudioSourceNode() {
-    return new MediaElementAudioSourceNode._internalWrap();
-  }
-
-  external factory MediaElementAudioSourceNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaElementAudioSourceNode.internal_() : super.internal_();
@@ -1204,7 +1086,7 @@
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
   @Experimental() // non-standard
-  MediaElement get mediaElement => wrap_jso(_blink.BlinkMediaElementAudioSourceNode.instance.mediaElement_Getter_(unwrap_jso(this)));
+  MediaElement get mediaElement => _blink.BlinkMediaElementAudioSourceNode.instance.mediaElement_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1224,11 +1106,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaStreamAudioDestinationNode internalCreateMediaStreamAudioDestinationNode() {
-    return new MediaStreamAudioDestinationNode._internalWrap();
-  }
-
-  external factory MediaStreamAudioDestinationNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaStreamAudioDestinationNode.internal_() : super.internal_();
@@ -1236,7 +1114,7 @@
 
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
-  MediaStream get stream => wrap_jso(_blink.BlinkMediaStreamAudioDestinationNode.instance.stream_Getter_(unwrap_jso(this)));
+  MediaStream get stream => _blink.BlinkMediaStreamAudioDestinationNode.instance.stream_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1256,11 +1134,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static MediaStreamAudioSourceNode internalCreateMediaStreamAudioSourceNode() {
-    return new MediaStreamAudioSourceNode._internalWrap();
-  }
-
-  external factory MediaStreamAudioSourceNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   MediaStreamAudioSourceNode.internal_() : super.internal_();
@@ -1268,7 +1142,7 @@
 
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
-  MediaStream get mediaStream => wrap_jso(_blink.BlinkMediaStreamAudioSourceNode.instance.mediaStream_Getter_(unwrap_jso(this)));
+  MediaStream get mediaStream => _blink.BlinkMediaStreamAudioSourceNode.instance.mediaStream_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1288,11 +1162,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static OfflineAudioCompletionEvent internalCreateOfflineAudioCompletionEvent() {
-    return new OfflineAudioCompletionEvent._internalWrap();
-  }
-
-  external factory OfflineAudioCompletionEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OfflineAudioCompletionEvent.internal_() : super.internal_();
@@ -1300,7 +1170,7 @@
 
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
-  AudioBuffer get renderedBuffer => wrap_jso(_blink.BlinkOfflineAudioCompletionEvent.instance.renderedBuffer_Getter_(unwrap_jso(this)));
+  AudioBuffer get renderedBuffer => _blink.BlinkOfflineAudioCompletionEvent.instance.renderedBuffer_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1321,16 +1191,12 @@
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
   factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) {
-    return wrap_jso(_blink.BlinkOfflineAudioContext.instance.constructorCallback_3_(numberOfChannels, numberOfFrames, sampleRate));
+    return _blink.BlinkOfflineAudioContext.instance.constructorCallback_3_(numberOfChannels, numberOfFrames, sampleRate);
   }
 
 
   @Deprecated("Internal Use Only")
-  static OfflineAudioContext internalCreateOfflineAudioContext() {
-    return new OfflineAudioContext._internalWrap();
-  }
-
-  external factory OfflineAudioContext._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OfflineAudioContext.internal_() : super.internal_();
@@ -1339,7 +1205,7 @@
   @DomName('OfflineAudioContext.startRendering')
   @DocsEditable()
   @Experimental() // untriaged
-  Future startRendering() => wrap_jso(_blink.BlinkOfflineAudioContext.instance.startRendering_Callback_0_(unwrap_jso(this)));
+  Future startRendering() => convertNativePromiseToDartFuture(_blink.BlinkOfflineAudioContext.instance.startRendering_Callback_0_(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1370,11 +1236,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static OscillatorNode internalCreateOscillatorNode() {
-    return new OscillatorNode._internalWrap();
-  }
-
-  external factory OscillatorNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OscillatorNode.internal_() : super.internal_();
@@ -1382,40 +1244,40 @@
 
   @DomName('OscillatorNode.detune')
   @DocsEditable()
-  AudioParam get detune => wrap_jso(_blink.BlinkOscillatorNode.instance.detune_Getter_(unwrap_jso(this)));
+  AudioParam get detune => _blink.BlinkOscillatorNode.instance.detune_Getter_(this);
   
   @DomName('OscillatorNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => wrap_jso(_blink.BlinkOscillatorNode.instance.frequency_Getter_(unwrap_jso(this)));
+  AudioParam get frequency => _blink.BlinkOscillatorNode.instance.frequency_Getter_(this);
   
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  String get type => _blink.BlinkOscillatorNode.instance.type_Getter_(unwrap_jso(this));
+  String get type => _blink.BlinkOscillatorNode.instance.type_Getter_(this);
   
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  set type(String value) => _blink.BlinkOscillatorNode.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkOscillatorNode.instance.type_Setter_(this, value);
   
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  void setPeriodicWave(PeriodicWave periodicWave) => _blink.BlinkOscillatorNode.instance.setPeriodicWave_Callback_1_(unwrap_jso(this), unwrap_jso(periodicWave));
+  void setPeriodicWave(PeriodicWave periodicWave) => _blink.BlinkOscillatorNode.instance.setPeriodicWave_Callback_1_(this, periodicWave);
   
   void start([num when]) {
     if (when != null) {
-      _blink.BlinkOscillatorNode.instance.start_Callback_1_(unwrap_jso(this), when);
+      _blink.BlinkOscillatorNode.instance.start_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkOscillatorNode.instance.start_Callback_0_(unwrap_jso(this));
+    _blink.BlinkOscillatorNode.instance.start_Callback_0_(this);
     return;
   }
 
   void stop([num when]) {
     if (when != null) {
-      _blink.BlinkOscillatorNode.instance.stop_Callback_1_(unwrap_jso(this), when);
+      _blink.BlinkOscillatorNode.instance.stop_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkOscillatorNode.instance.stop_Callback_0_(unwrap_jso(this));
+    _blink.BlinkOscillatorNode.instance.stop_Callback_0_(this);
     return;
   }
 
@@ -1443,11 +1305,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static PannerNode internalCreatePannerNode() {
-    return new PannerNode._internalWrap();
-  }
-
-  external factory PannerNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PannerNode.internal_() : super.internal_();
@@ -1455,79 +1313,79 @@
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  num get coneInnerAngle => _blink.BlinkPannerNode.instance.coneInnerAngle_Getter_(unwrap_jso(this));
+  num get coneInnerAngle => _blink.BlinkPannerNode.instance.coneInnerAngle_Getter_(this);
   
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  set coneInnerAngle(num value) => _blink.BlinkPannerNode.instance.coneInnerAngle_Setter_(unwrap_jso(this), value);
+  set coneInnerAngle(num value) => _blink.BlinkPannerNode.instance.coneInnerAngle_Setter_(this, value);
   
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  num get coneOuterAngle => _blink.BlinkPannerNode.instance.coneOuterAngle_Getter_(unwrap_jso(this));
+  num get coneOuterAngle => _blink.BlinkPannerNode.instance.coneOuterAngle_Getter_(this);
   
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  set coneOuterAngle(num value) => _blink.BlinkPannerNode.instance.coneOuterAngle_Setter_(unwrap_jso(this), value);
+  set coneOuterAngle(num value) => _blink.BlinkPannerNode.instance.coneOuterAngle_Setter_(this, value);
   
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  num get coneOuterGain => _blink.BlinkPannerNode.instance.coneOuterGain_Getter_(unwrap_jso(this));
+  num get coneOuterGain => _blink.BlinkPannerNode.instance.coneOuterGain_Getter_(this);
   
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  set coneOuterGain(num value) => _blink.BlinkPannerNode.instance.coneOuterGain_Setter_(unwrap_jso(this), value);
+  set coneOuterGain(num value) => _blink.BlinkPannerNode.instance.coneOuterGain_Setter_(this, value);
   
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  String get distanceModel => _blink.BlinkPannerNode.instance.distanceModel_Getter_(unwrap_jso(this));
+  String get distanceModel => _blink.BlinkPannerNode.instance.distanceModel_Getter_(this);
   
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  set distanceModel(String value) => _blink.BlinkPannerNode.instance.distanceModel_Setter_(unwrap_jso(this), value);
+  set distanceModel(String value) => _blink.BlinkPannerNode.instance.distanceModel_Setter_(this, value);
   
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  num get maxDistance => _blink.BlinkPannerNode.instance.maxDistance_Getter_(unwrap_jso(this));
+  num get maxDistance => _blink.BlinkPannerNode.instance.maxDistance_Getter_(this);
   
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  set maxDistance(num value) => _blink.BlinkPannerNode.instance.maxDistance_Setter_(unwrap_jso(this), value);
+  set maxDistance(num value) => _blink.BlinkPannerNode.instance.maxDistance_Setter_(this, value);
   
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  String get panningModel => _blink.BlinkPannerNode.instance.panningModel_Getter_(unwrap_jso(this));
+  String get panningModel => _blink.BlinkPannerNode.instance.panningModel_Getter_(this);
   
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  set panningModel(String value) => _blink.BlinkPannerNode.instance.panningModel_Setter_(unwrap_jso(this), value);
+  set panningModel(String value) => _blink.BlinkPannerNode.instance.panningModel_Setter_(this, value);
   
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  num get refDistance => _blink.BlinkPannerNode.instance.refDistance_Getter_(unwrap_jso(this));
+  num get refDistance => _blink.BlinkPannerNode.instance.refDistance_Getter_(this);
   
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  set refDistance(num value) => _blink.BlinkPannerNode.instance.refDistance_Setter_(unwrap_jso(this), value);
+  set refDistance(num value) => _blink.BlinkPannerNode.instance.refDistance_Setter_(this, value);
   
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  num get rolloffFactor => _blink.BlinkPannerNode.instance.rolloffFactor_Getter_(unwrap_jso(this));
+  num get rolloffFactor => _blink.BlinkPannerNode.instance.rolloffFactor_Getter_(this);
   
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  set rolloffFactor(num value) => _blink.BlinkPannerNode.instance.rolloffFactor_Setter_(unwrap_jso(this), value);
+  set rolloffFactor(num value) => _blink.BlinkPannerNode.instance.rolloffFactor_Setter_(this, value);
   
   @DomName('PannerNode.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z) => _blink.BlinkPannerNode.instance.setOrientation_Callback_3_(unwrap_jso(this), x, y, z);
+  void setOrientation(num x, num y, num z) => _blink.BlinkPannerNode.instance.setOrientation_Callback_3_(this, x, y, z);
   
   @DomName('PannerNode.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.BlinkPannerNode.instance.setPosition_Callback_3_(unwrap_jso(this), x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkPannerNode.instance.setPosition_Callback_3_(this, x, y, z);
   
   @DomName('PannerNode.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.BlinkPannerNode.instance.setVelocity_Callback_3_(unwrap_jso(this), x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkPannerNode.instance.setVelocity_Callback_3_(this, x, y, z);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1544,21 +1402,13 @@
   // To suppress missing implicit constructor warnings.
   factory PeriodicWave._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static PeriodicWave internalCreatePeriodicWave() {
-    return new PeriodicWave._internalWrap();
-  }
 
-  factory PeriodicWave._internalWrap() {
-    return new PeriodicWave.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   PeriodicWave.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1588,11 +1438,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static ScriptProcessorNode internalCreateScriptProcessorNode() {
-    return new ScriptProcessorNode._internalWrap();
-  }
-
-  external factory ScriptProcessorNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ScriptProcessorNode.internal_() : super.internal_();
@@ -1600,12 +1446,12 @@
 
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
-  int get bufferSize => _blink.BlinkScriptProcessorNode.instance.bufferSize_Getter_(unwrap_jso(this));
+  int get bufferSize => _blink.BlinkScriptProcessorNode.instance.bufferSize_Getter_(this);
   
   @DomName('ScriptProcessorNode.setEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.instance.setEventListener_Callback_1_(unwrap_jso(this), unwrap_jso((event) => eventListener(wrap_jso(event))));
+  void setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.instance.setEventListener_Callback_1_(this, eventListener);
   
   /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
 /**
@@ -1637,11 +1483,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static StereoPannerNode internalCreateStereoPannerNode() {
-    return new StereoPannerNode._internalWrap();
-  }
-
-  external factory StereoPannerNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   StereoPannerNode.internal_() : super.internal_();
@@ -1650,7 +1492,7 @@
   @DomName('StereoPannerNode.pan')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioParam get pan => wrap_jso(_blink.BlinkStereoPannerNode.instance.pan_Getter_(unwrap_jso(this)));
+  AudioParam get pan => _blink.BlinkStereoPannerNode.instance.pan_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1670,11 +1512,7 @@
 
 
   @Deprecated("Internal Use Only")
-  static WaveShaperNode internalCreateWaveShaperNode() {
-    return new WaveShaperNode._internalWrap();
-  }
-
-  external factory WaveShaperNode._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   WaveShaperNode.internal_() : super.internal_();
@@ -1682,18 +1520,18 @@
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  Float32List get curve => wrap_jso(_blink.BlinkWaveShaperNode.instance.curve_Getter_(unwrap_jso(this)));
+  Float32List get curve => _blink.BlinkWaveShaperNode.instance.curve_Getter_(this);
   
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  set curve(Float32List value) => _blink.BlinkWaveShaperNode.instance.curve_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set curve(Float32List value) => _blink.BlinkWaveShaperNode.instance.curve_Setter_(this, value);
   
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  String get oversample => _blink.BlinkWaveShaperNode.instance.oversample_Getter_(unwrap_jso(this));
+  String get oversample => _blink.BlinkWaveShaperNode.instance.oversample_Getter_(this);
   
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  set oversample(String value) => _blink.BlinkWaveShaperNode.instance.oversample_Setter_(unwrap_jso(this), value);
+  set oversample(String value) => _blink.BlinkWaveShaperNode.instance.oversample_Setter_(this, value);
   
 }
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 37916f4..71f2dbb 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -2386,24 +2386,10 @@
   @DocsEditable()
   void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native;
 
-  /**
-   * Buffers the specified data.
-   *
-   * The [bufferData] method is provided for WebGL API compatibility reasons, but
-   * it is highly recommended that you use [bufferDataTyped] or [bufferByteData]
-   * depending on your purposes.
-   */
   @DomName('WebGLRenderingContext.bufferData')
   @DocsEditable()
   void bufferData(int target, data_OR_size, int usage) native;
 
-  /**
-   * Buffers the specified subset of data.
-   *
-   * The [bufferSubData] method is provided for WebGL API compatibility reasons, but
-   * it is highly recommended that you use [bufferSubDataTyped] or [bufferSubByteData]
-   * depending on your purposes.
-   */
   @DomName('WebGLRenderingContext.bufferSubData')
   @DocsEditable()
   void bufferSubData(int target, int offset, data) native;
@@ -2782,14 +2768,6 @@
   @DocsEditable()
   void stencilOpSeparate(int face, int fail, int zfail, int zpass) native;
 
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
   void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) {
@@ -2817,62 +2795,22 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
   void _texImage2D_1(target, level, internalformat, width, height, int border, format, type, TypedData pixels) native;
   @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
   void _texImage2D_2(target, level, internalformat, format, type, pixels) native;
   @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
   void _texImage2D_3(target, level, internalformat, format, type, ImageElement image) native;
   @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
   void _texImage2D_4(target, level, internalformat, format, type, CanvasElement canvas) native;
   @JSName('texImage2D')
-  /**
-   * Updates the currently bound texture to [data].
-   *
-   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]
-   * (or for more specificity, the more specialized [texImage2DImageData],
-   * [texImage2DCanvas], [texImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texImage2D')
   @DocsEditable()
   void _texImage2D_5(target, level, internalformat, format, type, VideoElement video) native;
@@ -2885,14 +2823,6 @@
   @DocsEditable()
   void texParameteri(int target, int pname, int param) native;
 
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
   void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) {
@@ -2920,62 +2850,22 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
   @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
   void _texSubImage2D_1(target, level, xoffset, yoffset, width, height, int format, type, TypedData pixels) native;
   @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
   void _texSubImage2D_2(target, level, xoffset, yoffset, format, type, pixels) native;
   @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
   void _texSubImage2D_3(target, level, xoffset, yoffset, format, type, ImageElement image) native;
   @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
   void _texSubImage2D_4(target, level, xoffset, yoffset, format, type, CanvasElement canvas) native;
   @JSName('texSubImage2D')
-  /**
-   * Updates a sub-rectangle of the currently bound texture to [data].
-   *
-   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it
-   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]
-   * (or for more specificity, the more specialized [texSubImage2DImageData],
-   * [texSubImage2DCanvas], [texSubImage2DVideo]).
-   */
   @DomName('WebGLRenderingContext.texSubImage2D')
   @DocsEditable()
   void _texSubImage2D_5(target, level, xoffset, yoffset, format, type, VideoElement video) native;
@@ -3109,43 +2999,70 @@
    * Sets the currently bound texture to [data].
    *
    * [data] can be either an [ImageElement], a
-   * [CanvasElement], a [VideoElement], or an [ImageData] object.
+   * [CanvasElement], a [VideoElement], [TypedData] or an [ImageData] object.
    *
-   * To use [texImage2d] with a TypedData object, use [texImage2dTyped].
-   *
+   * This is deprecated in favor of [texImage2D].
    */
-  @JSName('texImage2D')
-  void texImage2DUntyped(int targetTexture, int levelOfDetail, 
-      int internalFormat, int format, int type, data) native;
+  @Deprecated("Use texImage2D")
+  void texImage2DUntyped(int targetTexture, int levelOfDetail,
+      int internalFormat, int format, int type, data) {
+    texImage2D(targetText, levelOfDetail, internalFormat, format, type, data);
+  }
 
   /**
    * Sets the currently bound texture to [data].
+   *
+   * This is deprecated in favour of [texImage2D].
    */
-  @JSName('texImage2D')
-  void texImage2DTyped(int targetTexture, int levelOfDetail,
-      int internalFormat, int width, int height, int border, int format,
-      int type, TypedData data) native;
+  @Deprecated("Use texImage2D")
+  void texImage2DTyped(int targetTexture, int levelOfDetail, int internalFormat,
+      int width, int height, int border, int format, int type, TypedData data) {
+    texImage2D(targetTexture, levelOfDetail, internalFormat,
+        width, height, border, format, type, data);
+  }
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
    *
    * [data] can be either an [ImageElement], a
-   * [CanvasElement], a [VideoElement], or an [ImageData] object.
-   *
-   * To use [texSubImage2d] with a TypedData object, use [texSubImage2dTyped].
+   * [CanvasElement], a [VideoElement], [TypedData] or an [ImageData] object.
    *
    */
-  @JSName('texSubImage2D')
+  @Deprecated("Use texSubImage2D")
   void texSubImage2DUntyped(int targetTexture, int levelOfDetail,
-      int xOffset, int yOffset, int format, int type, data) native;
+      int xOffset, int yOffset, int format, int type, data) {
+    texSubImage2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        format, type, data);
+  }
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
    */
-  @JSName('texSubImage2D')
+  @Deprecated("Use texSubImage2D")
   void texSubImage2DTyped(int targetTexture, int levelOfDetail,
       int xOffset, int yOffset, int width, int height, int border, int format,
-      int type, TypedData data) native;
+      int type, TypedData data) {
+    texSubImage2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        width, height, format, type, data);
+  }
+
+  /**
+   * Set the bufferData to [data].
+   */
+  @Deprecated("Use bufferData")
+  void bufferDataTyped(int target, TypedData data, int usage) {
+    bufferData2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        format, type, data);
+  }
+
+  /**
+   * Set the bufferSubData to [data].
+   */
+  @Deprecated("Use bufferSubData")
+  void bufferSubDataTyped(int target, TypedData data, int usage) {
+    bufferSubData2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        format, type, 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
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index ede152f..31ad9e4 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -22,97 +22,49 @@
 // FIXME: Can we make this private?
 @Deprecated("Internal Use Only")
 final web_glBlinkMap = {
-  'ANGLEInstancedArrays': () => AngleInstancedArrays,
-  'CHROMIUMSubscribeUniform': () => ChromiumSubscribeUniform,
-  'EXTBlendMinMax': () => ExtBlendMinMax,
-  'EXTFragDepth': () => ExtFragDepth,
-  'EXTShaderTextureLOD': () => ExtShaderTextureLod,
-  'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic,
-  'EXTsRGB': () => EXTsRgb,
-  'OESElementIndexUint': () => OesElementIndexUint,
-  'OESStandardDerivatives': () => OesStandardDerivatives,
-  'OESTextureFloat': () => OesTextureFloat,
-  'OESTextureFloatLinear': () => OesTextureFloatLinear,
-  'OESTextureHalfFloat': () => OesTextureHalfFloat,
-  'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear,
-  'OESVertexArrayObject': () => OesVertexArrayObject,
-  'WebGL2RenderingContext': () => RenderingContext2,
-  'WebGL2RenderingContextBase': () => _WebGL2RenderingContextBase,
-  'WebGLActiveInfo': () => ActiveInfo,
-  'WebGLBuffer': () => Buffer,
-  'WebGLCompressedTextureATC': () => CompressedTextureAtc,
-  'WebGLCompressedTextureETC1': () => CompressedTextureETC1,
-  'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc,
-  'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC,
-  'WebGLContextEvent': () => ContextEvent,
-  'WebGLDebugRendererInfo': () => DebugRendererInfo,
-  'WebGLDebugShaders': () => DebugShaders,
-  'WebGLDepthTexture': () => DepthTexture,
-  'WebGLDrawBuffers': () => DrawBuffers,
-  'WebGLFramebuffer': () => Framebuffer,
-  'WebGLLoseContext': () => LoseContext,
-  'WebGLProgram': () => Program,
-  'WebGLQuery': () => Query,
-  'WebGLRenderbuffer': () => Renderbuffer,
-  'WebGLRenderingContext': () => RenderingContext,
-  'WebGLRenderingContextBase': () => _WebGLRenderingContextBase,
-  'WebGLSampler': () => Sampler,
-  'WebGLShader': () => Shader,
-  'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat,
-  'WebGLSync': () => Sync,
-  'WebGLTexture': () => Texture,
-  'WebGLTransformFeedback': () => TransformFeedback,
-  'WebGLUniformLocation': () => UniformLocation,
-  'WebGLVertexArrayObject': () => VertexArrayObject,
-  'WebGLVertexArrayObjectOES': () => VertexArrayObjectOes,
-
-};
-
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final web_glBlinkFunctionMap = {
-  'ANGLEInstancedArrays': () => AngleInstancedArrays.internalCreateAngleInstancedArrays,
-  'CHROMIUMSubscribeUniform': () => ChromiumSubscribeUniform.internalCreateChromiumSubscribeUniform,
-  'EXTBlendMinMax': () => ExtBlendMinMax.internalCreateExtBlendMinMax,
-  'EXTFragDepth': () => ExtFragDepth.internalCreateExtFragDepth,
-  'EXTShaderTextureLOD': () => ExtShaderTextureLod.internalCreateExtShaderTextureLod,
-  'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic.internalCreateExtTextureFilterAnisotropic,
-  'EXTsRGB': () => EXTsRgb.internalCreateEXTsRgb,
-  'OESElementIndexUint': () => OesElementIndexUint.internalCreateOesElementIndexUint,
-  'OESStandardDerivatives': () => OesStandardDerivatives.internalCreateOesStandardDerivatives,
-  'OESTextureFloat': () => OesTextureFloat.internalCreateOesTextureFloat,
-  'OESTextureFloatLinear': () => OesTextureFloatLinear.internalCreateOesTextureFloatLinear,
-  'OESTextureHalfFloat': () => OesTextureHalfFloat.internalCreateOesTextureHalfFloat,
-  'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear.internalCreateOesTextureHalfFloatLinear,
-  'OESVertexArrayObject': () => OesVertexArrayObject.internalCreateOesVertexArrayObject,
-  'WebGL2RenderingContext': () => RenderingContext2.internalCreateRenderingContext2,
-  'WebGL2RenderingContextBase': () => _WebGL2RenderingContextBase.internalCreate_WebGL2RenderingContextBase,
-  'WebGLActiveInfo': () => ActiveInfo.internalCreateActiveInfo,
-  'WebGLBuffer': () => Buffer.internalCreateBuffer,
-  'WebGLCompressedTextureATC': () => CompressedTextureAtc.internalCreateCompressedTextureAtc,
-  'WebGLCompressedTextureETC1': () => CompressedTextureETC1.internalCreateCompressedTextureETC1,
-  'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc.internalCreateCompressedTexturePvrtc,
-  'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC.internalCreateCompressedTextureS3TC,
-  'WebGLContextEvent': () => ContextEvent.internalCreateContextEvent,
-  'WebGLDebugRendererInfo': () => DebugRendererInfo.internalCreateDebugRendererInfo,
-  'WebGLDebugShaders': () => DebugShaders.internalCreateDebugShaders,
-  'WebGLDepthTexture': () => DepthTexture.internalCreateDepthTexture,
-  'WebGLDrawBuffers': () => DrawBuffers.internalCreateDrawBuffers,
-  'WebGLFramebuffer': () => Framebuffer.internalCreateFramebuffer,
-  'WebGLLoseContext': () => LoseContext.internalCreateLoseContext,
-  'WebGLProgram': () => Program.internalCreateProgram,
-  'WebGLQuery': () => Query.internalCreateQuery,
-  'WebGLRenderbuffer': () => Renderbuffer.internalCreateRenderbuffer,
-  'WebGLRenderingContext': () => RenderingContext.internalCreateRenderingContext,
-  'WebGLSampler': () => Sampler.internalCreateSampler,
-  'WebGLShader': () => Shader.internalCreateShader,
-  'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat.internalCreateShaderPrecisionFormat,
-  'WebGLSync': () => Sync.internalCreateSync,
-  'WebGLTexture': () => Texture.internalCreateTexture,
-  'WebGLTransformFeedback': () => TransformFeedback.internalCreateTransformFeedback,
-  'WebGLUniformLocation': () => UniformLocation.internalCreateUniformLocation,
-  'WebGLVertexArrayObject': () => VertexArrayObject.internalCreateVertexArrayObject,
-  'WebGLVertexArrayObjectOES': () => VertexArrayObjectOes.internalCreateVertexArrayObjectOes,
+  'ANGLEInstancedArrays': () => AngleInstancedArrays.instanceRuntimeType,
+  'CHROMIUMSubscribeUniform': () => ChromiumSubscribeUniform.instanceRuntimeType,
+  'EXTBlendMinMax': () => ExtBlendMinMax.instanceRuntimeType,
+  'EXTFragDepth': () => ExtFragDepth.instanceRuntimeType,
+  'EXTShaderTextureLOD': () => ExtShaderTextureLod.instanceRuntimeType,
+  'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic.instanceRuntimeType,
+  'EXTsRGB': () => EXTsRgb.instanceRuntimeType,
+  'OESElementIndexUint': () => OesElementIndexUint.instanceRuntimeType,
+  'OESStandardDerivatives': () => OesStandardDerivatives.instanceRuntimeType,
+  'OESTextureFloat': () => OesTextureFloat.instanceRuntimeType,
+  'OESTextureFloatLinear': () => OesTextureFloatLinear.instanceRuntimeType,
+  'OESTextureHalfFloat': () => OesTextureHalfFloat.instanceRuntimeType,
+  'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear.instanceRuntimeType,
+  'OESVertexArrayObject': () => OesVertexArrayObject.instanceRuntimeType,
+  'WebGL2RenderingContext': () => RenderingContext2.instanceRuntimeType,
+  'WebGL2RenderingContextBase': () => _WebGL2RenderingContextBase.instanceRuntimeType,
+  'WebGLActiveInfo': () => ActiveInfo.instanceRuntimeType,
+  'WebGLBuffer': () => Buffer.instanceRuntimeType,
+  'WebGLCompressedTextureATC': () => CompressedTextureAtc.instanceRuntimeType,
+  'WebGLCompressedTextureETC1': () => CompressedTextureETC1.instanceRuntimeType,
+  'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc.instanceRuntimeType,
+  'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC.instanceRuntimeType,
+  'WebGLContextEvent': () => ContextEvent.instanceRuntimeType,
+  'WebGLDebugRendererInfo': () => DebugRendererInfo.instanceRuntimeType,
+  'WebGLDebugShaders': () => DebugShaders.instanceRuntimeType,
+  'WebGLDepthTexture': () => DepthTexture.instanceRuntimeType,
+  'WebGLDrawBuffers': () => DrawBuffers.instanceRuntimeType,
+  'WebGLFramebuffer': () => Framebuffer.instanceRuntimeType,
+  'WebGLLoseContext': () => LoseContext.instanceRuntimeType,
+  'WebGLProgram': () => Program.instanceRuntimeType,
+  'WebGLQuery': () => Query.instanceRuntimeType,
+  'WebGLRenderbuffer': () => Renderbuffer.instanceRuntimeType,
+  'WebGLRenderingContext': () => RenderingContext.instanceRuntimeType,
+  'WebGLRenderingContextBase': () => _WebGLRenderingContextBase.instanceRuntimeType,
+  'WebGLSampler': () => Sampler.instanceRuntimeType,
+  'WebGLShader': () => Shader.instanceRuntimeType,
+  'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat.instanceRuntimeType,
+  'WebGLSync': () => Sync.instanceRuntimeType,
+  'WebGLTexture': () => Texture.instanceRuntimeType,
+  'WebGLTransformFeedback': () => TransformFeedback.instanceRuntimeType,
+  'WebGLUniformLocation': () => UniformLocation.instanceRuntimeType,
+  'WebGLVertexArrayObject': () => VertexArrayObject.instanceRuntimeType,
+  'WebGLVertexArrayObjectOES': () => VertexArrayObjectOes.instanceRuntimeType,
 
 };
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -430,32 +382,24 @@
   // To suppress missing implicit constructor warnings.
   factory ActiveInfo._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ActiveInfo internalCreateActiveInfo() {
-    return new ActiveInfo._internalWrap();
-  }
 
-  factory ActiveInfo._internalWrap() {
-    return new ActiveInfo.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ActiveInfo.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLActiveInfo.name')
   @DocsEditable()
-  String get name => _blink.BlinkWebGLActiveInfo.instance.name_Getter_(unwrap_jso(this));
+  String get name => _blink.BlinkWebGLActiveInfo.instance.name_Getter_(this);
   
   @DomName('WebGLActiveInfo.size')
   @DocsEditable()
-  int get size => _blink.BlinkWebGLActiveInfo.instance.size_Getter_(unwrap_jso(this));
+  int get size => _blink.BlinkWebGLActiveInfo.instance.size_Getter_(this);
   
   @DomName('WebGLActiveInfo.type')
   @DocsEditable()
-  int get type => _blink.BlinkWebGLActiveInfo.instance.type_Getter_(unwrap_jso(this));
+  int get type => _blink.BlinkWebGLActiveInfo.instance.type_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -472,21 +416,13 @@
   // To suppress missing implicit constructor warnings.
   factory AngleInstancedArrays._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static AngleInstancedArrays internalCreateAngleInstancedArrays() {
-    return new AngleInstancedArrays._internalWrap();
-  }
 
-  factory AngleInstancedArrays._internalWrap() {
-    return new AngleInstancedArrays.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   AngleInstancedArrays.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('ANGLEInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE')
   @DocsEditable()
   @Experimental() // untriaged
@@ -495,17 +431,17 @@
   @DomName('ANGLEInstancedArrays.drawArraysInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.BlinkANGLEInstancedArrays.instance.drawArraysInstancedANGLE_Callback_4_(unwrap_jso(this), mode, first, count, primcount);
+  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.BlinkANGLEInstancedArrays.instance.drawArraysInstancedANGLE_Callback_4_(this, mode, first, count, primcount);
   
   @DomName('ANGLEInstancedArrays.drawElementsInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.BlinkANGLEInstancedArrays.instance.drawElementsInstancedANGLE_Callback_5_(unwrap_jso(this), mode, count, type, offset, primcount);
+  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.BlinkANGLEInstancedArrays.instance.drawElementsInstancedANGLE_Callback_5_(this, mode, count, type, offset, primcount);
   
   @DomName('ANGLEInstancedArrays.vertexAttribDivisorANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribDivisorAngle(int index, int divisor) => _blink.BlinkANGLEInstancedArrays.instance.vertexAttribDivisorANGLE_Callback_2_(unwrap_jso(this), index, divisor);
+  void vertexAttribDivisorAngle(int index, int divisor) => _blink.BlinkANGLEInstancedArrays.instance.vertexAttribDivisorANGLE_Callback_2_(this, index, divisor);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -522,21 +458,13 @@
   // To suppress missing implicit constructor warnings.
   factory Buffer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Buffer internalCreateBuffer() {
-    return new Buffer._internalWrap();
-  }
 
-  factory Buffer._internalWrap() {
-    return new Buffer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Buffer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -552,21 +480,13 @@
   // To suppress missing implicit constructor warnings.
   factory ChromiumSubscribeUniform._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ChromiumSubscribeUniform internalCreateChromiumSubscribeUniform() {
-    return new ChromiumSubscribeUniform._internalWrap();
-  }
 
-  factory ChromiumSubscribeUniform._internalWrap() {
-    return new ChromiumSubscribeUniform.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ChromiumSubscribeUniform.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('CHROMIUMSubscribeUniform.MOUSE_POSITION_CHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
@@ -580,37 +500,37 @@
   @DomName('CHROMIUMSubscribeUniform.bindValuebufferCHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindValuebufferChromium(int target, ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.bindValuebufferCHROMIUM_Callback_2_(unwrap_jso(this), target, unwrap_jso(buffer));
+  void bindValuebufferChromium(int target, ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.bindValuebufferCHROMIUM_Callback_2_(this, target, buffer);
   
   @DomName('CHROMIUMSubscribeUniform.createValuebufferCHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
-  ChromiumValuebuffer createValuebufferChromium() => wrap_jso(_blink.BlinkCHROMIUMSubscribeUniform.instance.createValuebufferCHROMIUM_Callback_0_(unwrap_jso(this)));
+  ChromiumValuebuffer createValuebufferChromium() => _blink.BlinkCHROMIUMSubscribeUniform.instance.createValuebufferCHROMIUM_Callback_0_(this);
   
   @DomName('CHROMIUMSubscribeUniform.deleteValuebufferCHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteValuebufferChromium(ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.deleteValuebufferCHROMIUM_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  void deleteValuebufferChromium(ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.deleteValuebufferCHROMIUM_Callback_1_(this, buffer);
   
   @DomName('CHROMIUMSubscribeUniform.isValuebufferCHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isValuebufferChromium(ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.isValuebufferCHROMIUM_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  bool isValuebufferChromium(ChromiumValuebuffer buffer) => _blink.BlinkCHROMIUMSubscribeUniform.instance.isValuebufferCHROMIUM_Callback_1_(this, buffer);
   
   @DomName('CHROMIUMSubscribeUniform.populateSubscribedValuesCHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
-  void populateSubscribedValuesChromium(int target) => _blink.BlinkCHROMIUMSubscribeUniform.instance.populateSubscribedValuesCHROMIUM_Callback_1_(unwrap_jso(this), target);
+  void populateSubscribedValuesChromium(int target) => _blink.BlinkCHROMIUMSubscribeUniform.instance.populateSubscribedValuesCHROMIUM_Callback_1_(this, target);
   
   @DomName('CHROMIUMSubscribeUniform.subscribeValueCHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
-  void subscribeValueChromium(int target, int subscriptions) => _blink.BlinkCHROMIUMSubscribeUniform.instance.subscribeValueCHROMIUM_Callback_2_(unwrap_jso(this), target, subscriptions);
+  void subscribeValueChromium(int target, int subscriptions) => _blink.BlinkCHROMIUMSubscribeUniform.instance.subscribeValueCHROMIUM_Callback_2_(this, target, subscriptions);
   
   @DomName('CHROMIUMSubscribeUniform.uniformValuebufferCHROMIUM')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformValuebufferChromium(UniformLocation location, int target, int subscription) => _blink.BlinkCHROMIUMSubscribeUniform.instance.uniformValuebufferCHROMIUM_Callback_3_(unwrap_jso(this), unwrap_jso(location), target, subscription);
+  void uniformValuebufferChromium(UniformLocation location, int target, int subscription) => _blink.BlinkCHROMIUMSubscribeUniform.instance.uniformValuebufferCHROMIUM_Callback_3_(this, location, target, subscription);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -628,21 +548,13 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureAtc._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CompressedTextureAtc internalCreateCompressedTextureAtc() {
-    return new CompressedTextureAtc._internalWrap();
-  }
 
-  factory CompressedTextureAtc._internalWrap() {
-    return new CompressedTextureAtc.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompressedTextureAtc.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL')
   @DocsEditable()
   static const int COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93;
@@ -670,21 +582,13 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureETC1._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CompressedTextureETC1 internalCreateCompressedTextureETC1() {
-    return new CompressedTextureETC1._internalWrap();
-  }
 
-  factory CompressedTextureETC1._internalWrap() {
-    return new CompressedTextureETC1.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompressedTextureETC1.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLCompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL')
   @DocsEditable()
   @Experimental() // untriaged
@@ -706,21 +610,13 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTexturePvrtc._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CompressedTexturePvrtc internalCreateCompressedTexturePvrtc() {
-    return new CompressedTexturePvrtc._internalWrap();
-  }
 
-  factory CompressedTexturePvrtc._internalWrap() {
-    return new CompressedTexturePvrtc.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompressedTexturePvrtc.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG')
   @DocsEditable()
   static const int COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;
@@ -753,21 +649,13 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureS3TC._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static CompressedTextureS3TC internalCreateCompressedTextureS3TC() {
-    return new CompressedTextureS3TC._internalWrap();
-  }
 
-  factory CompressedTextureS3TC._internalWrap() {
-    return new CompressedTextureS3TC.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   CompressedTextureS3TC.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT')
   @DocsEditable()
   static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
@@ -804,18 +692,14 @@
   factory ContextEvent(String type, [Map eventInit]) {
     if (eventInit != null) {
       var eventInit_1 = convertDartToNative_Dictionary(eventInit);
-      return wrap_jso(_blink.BlinkWebGLContextEvent.instance.constructorCallback_2_(type, eventInit_1));
+      return _blink.BlinkWebGLContextEvent.instance.constructorCallback_2_(type, eventInit_1);
     }
-    return wrap_jso(_blink.BlinkWebGLContextEvent.instance.constructorCallback_1_(type));
+    return _blink.BlinkWebGLContextEvent.instance.constructorCallback_1_(type);
   }
 
 
   @Deprecated("Internal Use Only")
-  static ContextEvent internalCreateContextEvent() {
-    return new ContextEvent._internalWrap();
-  }
-
-  external factory ContextEvent._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ContextEvent.internal_() : super.internal_();
@@ -823,7 +707,7 @@
 
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
-  String get statusMessage => _blink.BlinkWebGLContextEvent.instance.statusMessage_Getter_(unwrap_jso(this));
+  String get statusMessage => _blink.BlinkWebGLContextEvent.instance.statusMessage_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -841,21 +725,13 @@
   // To suppress missing implicit constructor warnings.
   factory DebugRendererInfo._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DebugRendererInfo internalCreateDebugRendererInfo() {
-    return new DebugRendererInfo._internalWrap();
-  }
 
-  factory DebugRendererInfo._internalWrap() {
-    return new DebugRendererInfo.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DebugRendererInfo.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLDebugRendererInfo.UNMASKED_RENDERER_WEBGL')
   @DocsEditable()
   static const int UNMASKED_RENDERER_WEBGL = 0x9246;
@@ -880,24 +756,16 @@
   // To suppress missing implicit constructor warnings.
   factory DebugShaders._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DebugShaders internalCreateDebugShaders() {
-    return new DebugShaders._internalWrap();
-  }
 
-  factory DebugShaders._internalWrap() {
-    return new DebugShaders.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DebugShaders.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   @DocsEditable()
-  String getTranslatedShaderSource(Shader shader) => _blink.BlinkWebGLDebugShaders.instance.getTranslatedShaderSource_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  String getTranslatedShaderSource(Shader shader) => _blink.BlinkWebGLDebugShaders.instance.getTranslatedShaderSource_Callback_1_(this, shader);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -915,21 +783,13 @@
   // To suppress missing implicit constructor warnings.
   factory DepthTexture._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DepthTexture internalCreateDepthTexture() {
-    return new DepthTexture._internalWrap();
-  }
 
-  factory DepthTexture._internalWrap() {
-    return new DepthTexture.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DepthTexture.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLDepthTexture.UNSIGNED_INT_24_8_WEBGL')
   @DocsEditable()
   static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
@@ -950,21 +810,13 @@
   // To suppress missing implicit constructor warnings.
   factory DrawBuffers._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static DrawBuffers internalCreateDrawBuffers() {
-    return new DrawBuffers._internalWrap();
-  }
 
-  factory DrawBuffers._internalWrap() {
-    return new DrawBuffers.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   DrawBuffers.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT0_WEBGL')
   @DocsEditable()
   static const int COLOR_ATTACHMENT0_WEBGL = 0x8CE0;
@@ -1103,7 +955,7 @@
 
   @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) => _blink.BlinkWebGLDrawBuffers.instance.drawBuffersWEBGL_Callback_1_(unwrap_jso(this), buffers);
+  void drawBuffersWebgl(List<int> buffers) => _blink.BlinkWebGLDrawBuffers.instance.drawBuffersWEBGL_Callback_1_(this, buffers);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1120,21 +972,13 @@
   // To suppress missing implicit constructor warnings.
   factory EXTsRgb._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static EXTsRgb internalCreateEXTsRgb() {
-    return new EXTsRgb._internalWrap();
-  }
 
-  factory EXTsRgb._internalWrap() {
-    return new EXTsRgb.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   EXTsRgb.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('EXTsRGB.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1170,21 +1014,13 @@
   // To suppress missing implicit constructor warnings.
   factory ExtBlendMinMax._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ExtBlendMinMax internalCreateExtBlendMinMax() {
-    return new ExtBlendMinMax._internalWrap();
-  }
 
-  factory ExtBlendMinMax._internalWrap() {
-    return new ExtBlendMinMax.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ExtBlendMinMax.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('EXTBlendMinMax.MAX_EXT')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1211,21 +1047,13 @@
   // To suppress missing implicit constructor warnings.
   factory ExtFragDepth._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ExtFragDepth internalCreateExtFragDepth() {
-    return new ExtFragDepth._internalWrap();
-  }
 
-  factory ExtFragDepth._internalWrap() {
-    return new ExtFragDepth.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ExtFragDepth.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1241,21 +1069,13 @@
   // To suppress missing implicit constructor warnings.
   factory ExtShaderTextureLod._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ExtShaderTextureLod internalCreateExtShaderTextureLod() {
-    return new ExtShaderTextureLod._internalWrap();
-  }
 
-  factory ExtShaderTextureLod._internalWrap() {
-    return new ExtShaderTextureLod.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ExtShaderTextureLod.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1272,21 +1092,13 @@
   // To suppress missing implicit constructor warnings.
   factory ExtTextureFilterAnisotropic._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ExtTextureFilterAnisotropic internalCreateExtTextureFilterAnisotropic() {
-    return new ExtTextureFilterAnisotropic._internalWrap();
-  }
 
-  factory ExtTextureFilterAnisotropic._internalWrap() {
-    return new ExtTextureFilterAnisotropic.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ExtTextureFilterAnisotropic.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('EXTTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT')
   @DocsEditable()
   static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
@@ -1310,21 +1122,13 @@
   // To suppress missing implicit constructor warnings.
   factory Framebuffer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Framebuffer internalCreateFramebuffer() {
-    return new Framebuffer._internalWrap();
-  }
 
-  factory Framebuffer._internalWrap() {
-    return new Framebuffer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Framebuffer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1341,28 +1145,20 @@
   // To suppress missing implicit constructor warnings.
   factory LoseContext._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static LoseContext internalCreateLoseContext() {
-    return new LoseContext._internalWrap();
-  }
 
-  factory LoseContext._internalWrap() {
-    return new LoseContext.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   LoseContext.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLLoseContext.loseContext')
   @DocsEditable()
-  void loseContext() => _blink.BlinkWebGLLoseContext.instance.loseContext_Callback_0_(unwrap_jso(this));
+  void loseContext() => _blink.BlinkWebGLLoseContext.instance.loseContext_Callback_0_(this);
   
   @DomName('WebGLLoseContext.restoreContext')
   @DocsEditable()
-  void restoreContext() => _blink.BlinkWebGLLoseContext.instance.restoreContext_Callback_0_(unwrap_jso(this));
+  void restoreContext() => _blink.BlinkWebGLLoseContext.instance.restoreContext_Callback_0_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1380,21 +1176,13 @@
   // To suppress missing implicit constructor warnings.
   factory OesElementIndexUint._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static OesElementIndexUint internalCreateOesElementIndexUint() {
-    return new OesElementIndexUint._internalWrap();
-  }
 
-  factory OesElementIndexUint._internalWrap() {
-    return new OesElementIndexUint.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OesElementIndexUint.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1411,21 +1199,13 @@
   // To suppress missing implicit constructor warnings.
   factory OesStandardDerivatives._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static OesStandardDerivatives internalCreateOesStandardDerivatives() {
-    return new OesStandardDerivatives._internalWrap();
-  }
 
-  factory OesStandardDerivatives._internalWrap() {
-    return new OesStandardDerivatives.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OesStandardDerivatives.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('OESStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES')
   @DocsEditable()
   static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
@@ -1446,21 +1226,13 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloat._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static OesTextureFloat internalCreateOesTextureFloat() {
-    return new OesTextureFloat._internalWrap();
-  }
 
-  factory OesTextureFloat._internalWrap() {
-    return new OesTextureFloat.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OesTextureFloat.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1477,21 +1249,13 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloatLinear._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static OesTextureFloatLinear internalCreateOesTextureFloatLinear() {
-    return new OesTextureFloatLinear._internalWrap();
-  }
 
-  factory OesTextureFloatLinear._internalWrap() {
-    return new OesTextureFloatLinear.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OesTextureFloatLinear.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1508,21 +1272,13 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloat._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static OesTextureHalfFloat internalCreateOesTextureHalfFloat() {
-    return new OesTextureHalfFloat._internalWrap();
-  }
 
-  factory OesTextureHalfFloat._internalWrap() {
-    return new OesTextureHalfFloat.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OesTextureHalfFloat.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
   @DocsEditable()
   static const int HALF_FLOAT_OES = 0x8D61;
@@ -1543,21 +1299,13 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloatLinear._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static OesTextureHalfFloatLinear internalCreateOesTextureHalfFloatLinear() {
-    return new OesTextureHalfFloatLinear._internalWrap();
-  }
 
-  factory OesTextureHalfFloatLinear._internalWrap() {
-    return new OesTextureHalfFloatLinear.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OesTextureHalfFloatLinear.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1574,40 +1322,32 @@
   // To suppress missing implicit constructor warnings.
   factory OesVertexArrayObject._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static OesVertexArrayObject internalCreateOesVertexArrayObject() {
-    return new OesVertexArrayObject._internalWrap();
-  }
 
-  factory OesVertexArrayObject._internalWrap() {
-    return new OesVertexArrayObject.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   OesVertexArrayObject.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('OESVertexArrayObject.VERTEX_ARRAY_BINDING_OES')
   @DocsEditable()
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
 
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.bindVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
+  void bindVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.bindVertexArrayOES_Callback_1_(this, arrayObject);
   
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObjectOes createVertexArray() => wrap_jso(_blink.BlinkOESVertexArrayObject.instance.createVertexArrayOES_Callback_0_(unwrap_jso(this)));
+  VertexArrayObjectOes createVertexArray() => _blink.BlinkOESVertexArrayObject.instance.createVertexArrayOES_Callback_0_(this);
   
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.deleteVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
+  void deleteVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.deleteVertexArrayOES_Callback_1_(this, arrayObject);
   
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.isVertexArrayOES_Callback_1_(unwrap_jso(this), unwrap_jso(arrayObject));
+  bool isVertexArray(VertexArrayObjectOes arrayObject) => _blink.BlinkOESVertexArrayObject.instance.isVertexArrayOES_Callback_1_(this, arrayObject);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1624,21 +1364,13 @@
   // To suppress missing implicit constructor warnings.
   factory Program._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Program internalCreateProgram() {
-    return new Program._internalWrap();
-  }
 
-  factory Program._internalWrap() {
-    return new Program.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Program.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1654,21 +1386,13 @@
   // To suppress missing implicit constructor warnings.
   factory Query._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Query internalCreateQuery() {
-    return new Query._internalWrap();
-  }
 
-  factory Query._internalWrap() {
-    return new Query.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Query.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1684,21 +1408,13 @@
   // To suppress missing implicit constructor warnings.
   factory Renderbuffer._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Renderbuffer internalCreateRenderbuffer() {
-    return new Renderbuffer._internalWrap();
-  }
 
-  factory Renderbuffer._internalWrap() {
-    return new Renderbuffer.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Renderbuffer.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -1714,21 +1430,13 @@
   // To suppress missing implicit constructor warnings.
   factory RenderingContext._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static RenderingContext internalCreateRenderingContext() {
-    return new RenderingContext._internalWrap();
-  }
 
-  factory RenderingContext._internalWrap() {
-    return new RenderingContext.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RenderingContext.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -2925,75 +2633,75 @@
   @DomName('WebGLRenderingContext.canvas')
   @DocsEditable()
   @Experimental() // untriaged
-  CanvasElement get canvas => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.canvas_Getter_(unwrap_jso(this)));
+  CanvasElement get canvas => _blink.BlinkWebGLRenderingContext.instance.canvas_Getter_(this);
   
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
-  int get drawingBufferHeight => _blink.BlinkWebGLRenderingContext.instance.drawingBufferHeight_Getter_(unwrap_jso(this));
+  int get drawingBufferHeight => _blink.BlinkWebGLRenderingContext.instance.drawingBufferHeight_Getter_(this);
   
   @DomName('WebGLRenderingContext.drawingBufferWidth')
   @DocsEditable()
-  int get drawingBufferWidth => _blink.BlinkWebGLRenderingContext.instance.drawingBufferWidth_Getter_(unwrap_jso(this));
+  int get drawingBufferWidth => _blink.BlinkWebGLRenderingContext.instance.drawingBufferWidth_Getter_(this);
   
   @DomName('WebGLRenderingContext.activeTexture')
   @DocsEditable()
-  void activeTexture(int texture) => _blink.BlinkWebGLRenderingContext.instance.activeTexture_Callback_1_(unwrap_jso(this), texture);
+  void activeTexture(int texture) => _blink.BlinkWebGLRenderingContext.instance.activeTexture_Callback_1_(this, texture);
   
   @DomName('WebGLRenderingContext.attachShader')
   @DocsEditable()
-  void attachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.instance.attachShader_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(shader));
+  void attachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.instance.attachShader_Callback_2_(this, program, shader);
   
   @DomName('WebGLRenderingContext.bindAttribLocation')
   @DocsEditable()
-  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGLRenderingContext.instance.bindAttribLocation_Callback_3_(unwrap_jso(this), unwrap_jso(program), index, name);
+  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGLRenderingContext.instance.bindAttribLocation_Callback_3_(this, program, index, name);
   
   @DomName('WebGLRenderingContext.bindBuffer')
   @DocsEditable()
-  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.bindBuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(buffer));
+  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.bindBuffer_Callback_2_(this, target, buffer);
   
   @DomName('WebGLRenderingContext.bindFramebuffer')
   @DocsEditable()
-  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.bindFramebuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(framebuffer));
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.bindFramebuffer_Callback_2_(this, target, framebuffer);
   
   @DomName('WebGLRenderingContext.bindRenderbuffer')
   @DocsEditable()
-  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.bindRenderbuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(renderbuffer));
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.bindRenderbuffer_Callback_2_(this, target, renderbuffer);
   
   @DomName('WebGLRenderingContext.bindTexture')
   @DocsEditable()
-  void bindTexture(int target, Texture texture) => _blink.BlinkWebGLRenderingContext.instance.bindTexture_Callback_2_(unwrap_jso(this), target, unwrap_jso(texture));
+  void bindTexture(int target, Texture texture) => _blink.BlinkWebGLRenderingContext.instance.bindTexture_Callback_2_(this, target, texture);
   
   @DomName('WebGLRenderingContext.blendColor')
   @DocsEditable()
-  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.instance.blendColor_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.instance.blendColor_Callback_4_(this, red, green, blue, alpha);
   
   @DomName('WebGLRenderingContext.blendEquation')
   @DocsEditable()
-  void blendEquation(int mode) => _blink.BlinkWebGLRenderingContext.instance.blendEquation_Callback_1_(unwrap_jso(this), mode);
+  void blendEquation(int mode) => _blink.BlinkWebGLRenderingContext.instance.blendEquation_Callback_1_(this, mode);
   
   @DomName('WebGLRenderingContext.blendEquationSeparate')
   @DocsEditable()
-  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGLRenderingContext.instance.blendEquationSeparate_Callback_2_(unwrap_jso(this), modeRGB, modeAlpha);
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGLRenderingContext.instance.blendEquationSeparate_Callback_2_(this, modeRGB, modeAlpha);
   
   @DomName('WebGLRenderingContext.blendFunc')
   @DocsEditable()
-  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGLRenderingContext.instance.blendFunc_Callback_2_(unwrap_jso(this), sfactor, dfactor);
+  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGLRenderingContext.instance.blendFunc_Callback_2_(this, sfactor, dfactor);
   
   @DomName('WebGLRenderingContext.blendFuncSeparate')
   @DocsEditable()
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContext.instance.blendFuncSeparate_Callback_4_(unwrap_jso(this), srcRGB, dstRGB, srcAlpha, dstAlpha);
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContext.instance.blendFuncSeparate_Callback_4_(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
   
   void bufferData(int target, data_OR_size, int usage) {
     if ((usage is int) && (data_OR_size is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     if ((usage is int) && (data_OR_size is TypedData) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     if ((usage is int) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3001,11 +2709,11 @@
 
   void bufferSubData(int target, int offset, data) {
     if ((data is TypedData) && (offset is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
+      _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
       return;
     }
     if ((data is ByteBuffer || data == null) && (offset is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
+      _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3013,371 +2721,371 @@
 
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
-  int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContext.instance.checkFramebufferStatus_Callback_1_(unwrap_jso(this), target);
+  int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContext.instance.checkFramebufferStatus_Callback_1_(this, target);
   
   @DomName('WebGLRenderingContext.clear')
   @DocsEditable()
-  void clear(int mask) => _blink.BlinkWebGLRenderingContext.instance.clear_Callback_1_(unwrap_jso(this), mask);
+  void clear(int mask) => _blink.BlinkWebGLRenderingContext.instance.clear_Callback_1_(this, mask);
   
   @DomName('WebGLRenderingContext.clearColor')
   @DocsEditable()
-  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.instance.clearColor_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.instance.clearColor_Callback_4_(this, red, green, blue, alpha);
   
   @DomName('WebGLRenderingContext.clearDepth')
   @DocsEditable()
-  void clearDepth(num depth) => _blink.BlinkWebGLRenderingContext.instance.clearDepth_Callback_1_(unwrap_jso(this), depth);
+  void clearDepth(num depth) => _blink.BlinkWebGLRenderingContext.instance.clearDepth_Callback_1_(this, depth);
   
   @DomName('WebGLRenderingContext.clearStencil')
   @DocsEditable()
-  void clearStencil(int s) => _blink.BlinkWebGLRenderingContext.instance.clearStencil_Callback_1_(unwrap_jso(this), s);
+  void clearStencil(int s) => _blink.BlinkWebGLRenderingContext.instance.clearStencil_Callback_1_(this, s);
   
   @DomName('WebGLRenderingContext.colorMask')
   @DocsEditable()
-  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGLRenderingContext.instance.colorMask_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGLRenderingContext.instance.colorMask_Callback_4_(this, red, green, blue, alpha);
   
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
-  void compileShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.compileShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  void compileShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.compileShader_Callback_1_(this, shader);
   
   @DomName('WebGLRenderingContext.compressedTexImage2D')
   @DocsEditable()
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.compressedTexImage2D_Callback_7_(unwrap_jso(this), target, level, internalformat, width, height, border, unwrap_jso(data));
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.compressedTexImage2D_Callback_7_(this, target, level, internalformat, width, height, border, data);
   
   @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   @DocsEditable()
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.compressedTexSubImage2D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, width, height, format, unwrap_jso(data));
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.compressedTexSubImage2D_Callback_8_(this, target, level, xoffset, yoffset, width, height, format, data);
   
   @DomName('WebGLRenderingContext.copyTexImage2D')
   @DocsEditable()
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGLRenderingContext.instance.copyTexImage2D_Callback_8_(unwrap_jso(this), target, level, internalformat, x, y, width, height, border);
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGLRenderingContext.instance.copyTexImage2D_Callback_8_(this, target, level, internalformat, x, y, width, height, border);
   
   @DomName('WebGLRenderingContext.copyTexSubImage2D')
   @DocsEditable()
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.copyTexSubImage2D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, x, y, width, height);
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.copyTexSubImage2D_Callback_8_(this, target, level, xoffset, yoffset, x, y, width, height);
   
   @DomName('WebGLRenderingContext.createBuffer')
   @DocsEditable()
-  Buffer createBuffer() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createBuffer_Callback_0_(unwrap_jso(this)));
+  Buffer createBuffer() => _blink.BlinkWebGLRenderingContext.instance.createBuffer_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.createFramebuffer')
   @DocsEditable()
-  Framebuffer createFramebuffer() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createFramebuffer_Callback_0_(unwrap_jso(this)));
+  Framebuffer createFramebuffer() => _blink.BlinkWebGLRenderingContext.instance.createFramebuffer_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.createProgram')
   @DocsEditable()
-  Program createProgram() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createProgram_Callback_0_(unwrap_jso(this)));
+  Program createProgram() => _blink.BlinkWebGLRenderingContext.instance.createProgram_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.createRenderbuffer')
   @DocsEditable()
-  Renderbuffer createRenderbuffer() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createRenderbuffer_Callback_0_(unwrap_jso(this)));
+  Renderbuffer createRenderbuffer() => _blink.BlinkWebGLRenderingContext.instance.createRenderbuffer_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.createShader')
   @DocsEditable()
-  Shader createShader(int type) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createShader_Callback_1_(unwrap_jso(this), type));
+  Shader createShader(int type) => _blink.BlinkWebGLRenderingContext.instance.createShader_Callback_1_(this, type);
   
   @DomName('WebGLRenderingContext.createTexture')
   @DocsEditable()
-  Texture createTexture() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createTexture_Callback_0_(unwrap_jso(this)));
+  Texture createTexture() => _blink.BlinkWebGLRenderingContext.instance.createTexture_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.cullFace')
   @DocsEditable()
-  void cullFace(int mode) => _blink.BlinkWebGLRenderingContext.instance.cullFace_Callback_1_(unwrap_jso(this), mode);
+  void cullFace(int mode) => _blink.BlinkWebGLRenderingContext.instance.cullFace_Callback_1_(this, mode);
   
   @DomName('WebGLRenderingContext.deleteBuffer')
   @DocsEditable()
-  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.deleteBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.deleteBuffer_Callback_1_(this, buffer);
   
   @DomName('WebGLRenderingContext.deleteFramebuffer')
   @DocsEditable()
-  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.deleteFramebuffer_Callback_1_(unwrap_jso(this), unwrap_jso(framebuffer));
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.deleteFramebuffer_Callback_1_(this, framebuffer);
   
   @DomName('WebGLRenderingContext.deleteProgram')
   @DocsEditable()
-  void deleteProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.deleteProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void deleteProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.deleteProgram_Callback_1_(this, program);
   
   @DomName('WebGLRenderingContext.deleteRenderbuffer')
   @DocsEditable()
-  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.deleteRenderbuffer_Callback_1_(unwrap_jso(this), unwrap_jso(renderbuffer));
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.deleteRenderbuffer_Callback_1_(this, renderbuffer);
   
   @DomName('WebGLRenderingContext.deleteShader')
   @DocsEditable()
-  void deleteShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.deleteShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  void deleteShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.deleteShader_Callback_1_(this, shader);
   
   @DomName('WebGLRenderingContext.deleteTexture')
   @DocsEditable()
-  void deleteTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.instance.deleteTexture_Callback_1_(unwrap_jso(this), unwrap_jso(texture));
+  void deleteTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.instance.deleteTexture_Callback_1_(this, texture);
   
   @DomName('WebGLRenderingContext.depthFunc')
   @DocsEditable()
-  void depthFunc(int func) => _blink.BlinkWebGLRenderingContext.instance.depthFunc_Callback_1_(unwrap_jso(this), func);
+  void depthFunc(int func) => _blink.BlinkWebGLRenderingContext.instance.depthFunc_Callback_1_(this, func);
   
   @DomName('WebGLRenderingContext.depthMask')
   @DocsEditable()
-  void depthMask(bool flag) => _blink.BlinkWebGLRenderingContext.instance.depthMask_Callback_1_(unwrap_jso(this), flag);
+  void depthMask(bool flag) => _blink.BlinkWebGLRenderingContext.instance.depthMask_Callback_1_(this, flag);
   
   @DomName('WebGLRenderingContext.depthRange')
   @DocsEditable()
-  void depthRange(num zNear, num zFar) => _blink.BlinkWebGLRenderingContext.instance.depthRange_Callback_2_(unwrap_jso(this), zNear, zFar);
+  void depthRange(num zNear, num zFar) => _blink.BlinkWebGLRenderingContext.instance.depthRange_Callback_2_(this, zNear, zFar);
   
   @DomName('WebGLRenderingContext.detachShader')
   @DocsEditable()
-  void detachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.instance.detachShader_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(shader));
+  void detachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.instance.detachShader_Callback_2_(this, program, shader);
   
   @DomName('WebGLRenderingContext.disable')
   @DocsEditable()
-  void disable(int cap) => _blink.BlinkWebGLRenderingContext.instance.disable_Callback_1_(unwrap_jso(this), cap);
+  void disable(int cap) => _blink.BlinkWebGLRenderingContext.instance.disable_Callback_1_(this, cap);
   
   @DomName('WebGLRenderingContext.disableVertexAttribArray')
   @DocsEditable()
-  void disableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.instance.disableVertexAttribArray_Callback_1_(unwrap_jso(this), index);
+  void disableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.instance.disableVertexAttribArray_Callback_1_(this, index);
   
   @DomName('WebGLRenderingContext.drawArrays')
   @DocsEditable()
-  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGLRenderingContext.instance.drawArrays_Callback_3_(unwrap_jso(this), mode, first, count);
+  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGLRenderingContext.instance.drawArrays_Callback_3_(this, mode, first, count);
   
   @DomName('WebGLRenderingContext.drawElements')
   @DocsEditable()
-  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGLRenderingContext.instance.drawElements_Callback_4_(unwrap_jso(this), mode, count, type, offset);
+  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGLRenderingContext.instance.drawElements_Callback_4_(this, mode, count, type, offset);
   
   @DomName('WebGLRenderingContext.enable')
   @DocsEditable()
-  void enable(int cap) => _blink.BlinkWebGLRenderingContext.instance.enable_Callback_1_(unwrap_jso(this), cap);
+  void enable(int cap) => _blink.BlinkWebGLRenderingContext.instance.enable_Callback_1_(this, cap);
   
   @DomName('WebGLRenderingContext.enableVertexAttribArray')
   @DocsEditable()
-  void enableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.instance.enableVertexAttribArray_Callback_1_(unwrap_jso(this), index);
+  void enableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.instance.enableVertexAttribArray_Callback_1_(this, index);
   
   @DomName('WebGLRenderingContext.finish')
   @DocsEditable()
-  void finish() => _blink.BlinkWebGLRenderingContext.instance.finish_Callback_0_(unwrap_jso(this));
+  void finish() => _blink.BlinkWebGLRenderingContext.instance.finish_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.flush')
   @DocsEditable()
-  void flush() => _blink.BlinkWebGLRenderingContext.instance.flush_Callback_0_(unwrap_jso(this));
+  void flush() => _blink.BlinkWebGLRenderingContext.instance.flush_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   @DocsEditable()
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.framebufferRenderbuffer_Callback_4_(unwrap_jso(this), target, attachment, renderbuffertarget, unwrap_jso(renderbuffer));
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.framebufferRenderbuffer_Callback_4_(this, target, attachment, renderbuffertarget, renderbuffer);
   
   @DomName('WebGLRenderingContext.framebufferTexture2D')
   @DocsEditable()
-  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGLRenderingContext.instance.framebufferTexture2D_Callback_5_(unwrap_jso(this), target, attachment, textarget, unwrap_jso(texture), level);
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGLRenderingContext.instance.framebufferTexture2D_Callback_5_(this, target, attachment, textarget, texture, level);
   
   @DomName('WebGLRenderingContext.frontFace')
   @DocsEditable()
-  void frontFace(int mode) => _blink.BlinkWebGLRenderingContext.instance.frontFace_Callback_1_(unwrap_jso(this), mode);
+  void frontFace(int mode) => _blink.BlinkWebGLRenderingContext.instance.frontFace_Callback_1_(this, mode);
   
   @DomName('WebGLRenderingContext.generateMipmap')
   @DocsEditable()
-  void generateMipmap(int target) => _blink.BlinkWebGLRenderingContext.instance.generateMipmap_Callback_1_(unwrap_jso(this), target);
+  void generateMipmap(int target) => _blink.BlinkWebGLRenderingContext.instance.generateMipmap_Callback_1_(this, target);
   
   @DomName('WebGLRenderingContext.getActiveAttrib')
   @DocsEditable()
-  ActiveInfo getActiveAttrib(Program program, int index) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getActiveAttrib_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGLRenderingContext.instance.getActiveAttrib_Callback_2_(this, program, index);
   
   @DomName('WebGLRenderingContext.getActiveUniform')
   @DocsEditable()
-  ActiveInfo getActiveUniform(Program program, int index) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getActiveUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGLRenderingContext.instance.getActiveUniform_Callback_2_(this, program, index);
   
   @DomName('WebGLRenderingContext.getAttachedShaders')
   @DocsEditable()
-  List<Shader> getAttachedShaders(Program program) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getAttachedShaders_Callback_1_(unwrap_jso(this), unwrap_jso(program)));
+  List<Shader> getAttachedShaders(Program program) => _blink.BlinkWebGLRenderingContext.instance.getAttachedShaders_Callback_1_(this, program);
   
   @DomName('WebGLRenderingContext.getAttribLocation')
   @DocsEditable()
-  int getAttribLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.instance.getAttribLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name);
+  int getAttribLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.instance.getAttribLocation_Callback_2_(this, program, name);
   
   @DomName('WebGLRenderingContext.getBufferParameter')
   @DocsEditable()
-  Object getBufferParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getBufferParameter_Callback_2_(unwrap_jso(this), target, pname));
+  Object getBufferParameter(int target, int pname) => (_blink.BlinkWebGLRenderingContext.instance.getBufferParameter_Callback_2_(this, target, pname));
   
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-   getContextAttributes() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getContextAttributes_Callback_0_(unwrap_jso(this))));
+   getContextAttributes() => convertNativeDictionaryToDartDictionary((_blink.BlinkWebGLRenderingContext.instance.getContextAttributes_Callback_0_(this)));
   
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
-  int getError() => _blink.BlinkWebGLRenderingContext.instance.getError_Callback_0_(unwrap_jso(this));
+  int getError() => _blink.BlinkWebGLRenderingContext.instance.getError_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.getExtension')
   @DocsEditable()
-  Object getExtension(String name) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getExtension_Callback_1_(unwrap_jso(this), name));
+  Object getExtension(String name) => (_blink.BlinkWebGLRenderingContext.instance.getExtension_Callback_1_(this, name));
   
   @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable()
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getFramebufferAttachmentParameter_Callback_3_(unwrap_jso(this), target, attachment, pname));
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => (_blink.BlinkWebGLRenderingContext.instance.getFramebufferAttachmentParameter_Callback_3_(this, target, attachment, pname));
   
   @DomName('WebGLRenderingContext.getParameter')
   @DocsEditable()
-  Object getParameter(int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getParameter_Callback_1_(unwrap_jso(this), pname));
+  Object getParameter(int pname) => (_blink.BlinkWebGLRenderingContext.instance.getParameter_Callback_1_(this, pname));
   
   @DomName('WebGLRenderingContext.getProgramInfoLog')
   @DocsEditable()
-  String getProgramInfoLog(Program program) => _blink.BlinkWebGLRenderingContext.instance.getProgramInfoLog_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  String getProgramInfoLog(Program program) => _blink.BlinkWebGLRenderingContext.instance.getProgramInfoLog_Callback_1_(this, program);
   
   @DomName('WebGLRenderingContext.getProgramParameter')
   @DocsEditable()
-  Object getProgramParameter(Program program, int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getProgramParameter_Callback_2_(unwrap_jso(this), unwrap_jso(program), pname));
+  Object getProgramParameter(Program program, int pname) => (_blink.BlinkWebGLRenderingContext.instance.getProgramParameter_Callback_2_(this, program, pname));
   
   @DomName('WebGLRenderingContext.getRenderbufferParameter')
   @DocsEditable()
-  Object getRenderbufferParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getRenderbufferParameter_Callback_2_(unwrap_jso(this), target, pname));
+  Object getRenderbufferParameter(int target, int pname) => (_blink.BlinkWebGLRenderingContext.instance.getRenderbufferParameter_Callback_2_(this, target, pname));
   
   @DomName('WebGLRenderingContext.getShaderInfoLog')
   @DocsEditable()
-  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.getShaderInfoLog_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.getShaderInfoLog_Callback_1_(this, shader);
   
   @DomName('WebGLRenderingContext.getShaderParameter')
   @DocsEditable()
-  Object getShaderParameter(Shader shader, int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getShaderParameter_Callback_2_(unwrap_jso(this), unwrap_jso(shader), pname));
+  Object getShaderParameter(Shader shader, int pname) => (_blink.BlinkWebGLRenderingContext.instance.getShaderParameter_Callback_2_(this, shader, pname));
   
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getShaderPrecisionFormat_Callback_2_(unwrap_jso(this), shadertype, precisiontype));
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGLRenderingContext.instance.getShaderPrecisionFormat_Callback_2_(this, shadertype, precisiontype);
   
   @DomName('WebGLRenderingContext.getShaderSource')
   @DocsEditable()
-  String getShaderSource(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.getShaderSource_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  String getShaderSource(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.getShaderSource_Callback_1_(this, shader);
   
   @DomName('WebGLRenderingContext.getSupportedExtensions')
   @DocsEditable()
-  List<String> getSupportedExtensions() => _blink.BlinkWebGLRenderingContext.instance.getSupportedExtensions_Callback_0_(unwrap_jso(this));
+  List<String> getSupportedExtensions() => _blink.BlinkWebGLRenderingContext.instance.getSupportedExtensions_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.getTexParameter')
   @DocsEditable()
-  Object getTexParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getTexParameter_Callback_2_(unwrap_jso(this), target, pname));
+  Object getTexParameter(int target, int pname) => (_blink.BlinkWebGLRenderingContext.instance.getTexParameter_Callback_2_(this, target, pname));
   
   @DomName('WebGLRenderingContext.getUniform')
   @DocsEditable()
-  Object getUniform(Program program, UniformLocation location) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(location)));
+  Object getUniform(Program program, UniformLocation location) => (_blink.BlinkWebGLRenderingContext.instance.getUniform_Callback_2_(this, program, location));
   
   @DomName('WebGLRenderingContext.getUniformLocation')
   @DocsEditable()
-  UniformLocation getUniformLocation(Program program, String name) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getUniformLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name));
+  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.instance.getUniformLocation_Callback_2_(this, program, name);
   
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable()
-  Object getVertexAttrib(int index, int pname) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getVertexAttrib_Callback_2_(unwrap_jso(this), index, pname));
+  Object getVertexAttrib(int index, int pname) => (_blink.BlinkWebGLRenderingContext.instance.getVertexAttrib_Callback_2_(this, index, pname));
   
   @DomName('WebGLRenderingContext.getVertexAttribOffset')
   @DocsEditable()
-  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGLRenderingContext.instance.getVertexAttribOffset_Callback_2_(unwrap_jso(this), index, pname);
+  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGLRenderingContext.instance.getVertexAttribOffset_Callback_2_(this, index, pname);
   
   @DomName('WebGLRenderingContext.hint')
   @DocsEditable()
-  void hint(int target, int mode) => _blink.BlinkWebGLRenderingContext.instance.hint_Callback_2_(unwrap_jso(this), target, mode);
+  void hint(int target, int mode) => _blink.BlinkWebGLRenderingContext.instance.hint_Callback_2_(this, target, mode);
   
   @DomName('WebGLRenderingContext.isBuffer')
   @DocsEditable()
-  bool isBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.isBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  bool isBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.isBuffer_Callback_1_(this, buffer);
   
   @DomName('WebGLRenderingContext.isContextLost')
   @DocsEditable()
-  bool isContextLost() => _blink.BlinkWebGLRenderingContext.instance.isContextLost_Callback_0_(unwrap_jso(this));
+  bool isContextLost() => _blink.BlinkWebGLRenderingContext.instance.isContextLost_Callback_0_(this);
   
   @DomName('WebGLRenderingContext.isEnabled')
   @DocsEditable()
-  bool isEnabled(int cap) => _blink.BlinkWebGLRenderingContext.instance.isEnabled_Callback_1_(unwrap_jso(this), cap);
+  bool isEnabled(int cap) => _blink.BlinkWebGLRenderingContext.instance.isEnabled_Callback_1_(this, cap);
   
   @DomName('WebGLRenderingContext.isFramebuffer')
   @DocsEditable()
-  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.isFramebuffer_Callback_1_(unwrap_jso(this), unwrap_jso(framebuffer));
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.isFramebuffer_Callback_1_(this, framebuffer);
   
   @DomName('WebGLRenderingContext.isProgram')
   @DocsEditable()
-  bool isProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.isProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  bool isProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.isProgram_Callback_1_(this, program);
   
   @DomName('WebGLRenderingContext.isRenderbuffer')
   @DocsEditable()
-  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.isRenderbuffer_Callback_1_(unwrap_jso(this), unwrap_jso(renderbuffer));
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.isRenderbuffer_Callback_1_(this, renderbuffer);
   
   @DomName('WebGLRenderingContext.isShader')
   @DocsEditable()
-  bool isShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.isShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  bool isShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.isShader_Callback_1_(this, shader);
   
   @DomName('WebGLRenderingContext.isTexture')
   @DocsEditable()
-  bool isTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.instance.isTexture_Callback_1_(unwrap_jso(this), unwrap_jso(texture));
+  bool isTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.instance.isTexture_Callback_1_(this, texture);
   
   @DomName('WebGLRenderingContext.lineWidth')
   @DocsEditable()
-  void lineWidth(num width) => _blink.BlinkWebGLRenderingContext.instance.lineWidth_Callback_1_(unwrap_jso(this), width);
+  void lineWidth(num width) => _blink.BlinkWebGLRenderingContext.instance.lineWidth_Callback_1_(this, width);
   
   @DomName('WebGLRenderingContext.linkProgram')
   @DocsEditable()
-  void linkProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.linkProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void linkProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.linkProgram_Callback_1_(this, program);
   
   @DomName('WebGLRenderingContext.pixelStorei')
   @DocsEditable()
-  void pixelStorei(int pname, int param) => _blink.BlinkWebGLRenderingContext.instance.pixelStorei_Callback_2_(unwrap_jso(this), pname, param);
+  void pixelStorei(int pname, int param) => _blink.BlinkWebGLRenderingContext.instance.pixelStorei_Callback_2_(this, pname, param);
   
   @DomName('WebGLRenderingContext.polygonOffset')
   @DocsEditable()
-  void polygonOffset(num factor, num units) => _blink.BlinkWebGLRenderingContext.instance.polygonOffset_Callback_2_(unwrap_jso(this), factor, units);
+  void polygonOffset(num factor, num units) => _blink.BlinkWebGLRenderingContext.instance.polygonOffset_Callback_2_(this, factor, units);
   
   @DomName('WebGLRenderingContext.readPixels')
   @DocsEditable()
-  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGLRenderingContext.instance.readPixels_Callback_7_(unwrap_jso(this), x, y, width, height, format, type, unwrap_jso(pixels));
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGLRenderingContext.instance.readPixels_Callback_7_(this, x, y, width, height, format, type, pixels);
   
   @DomName('WebGLRenderingContext.renderbufferStorage')
   @DocsEditable()
-  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.renderbufferStorage_Callback_4_(unwrap_jso(this), target, internalformat, width, height);
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.renderbufferStorage_Callback_4_(this, target, internalformat, width, height);
   
   @DomName('WebGLRenderingContext.sampleCoverage')
   @DocsEditable()
-  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGLRenderingContext.instance.sampleCoverage_Callback_2_(unwrap_jso(this), value, invert);
+  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGLRenderingContext.instance.sampleCoverage_Callback_2_(this, value, invert);
   
   @DomName('WebGLRenderingContext.scissor')
   @DocsEditable()
-  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.scissor_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.scissor_Callback_4_(this, x, y, width, height);
   
   @DomName('WebGLRenderingContext.shaderSource')
   @DocsEditable()
-  void shaderSource(Shader shader, String string) => _blink.BlinkWebGLRenderingContext.instance.shaderSource_Callback_2_(unwrap_jso(this), unwrap_jso(shader), string);
+  void shaderSource(Shader shader, String string) => _blink.BlinkWebGLRenderingContext.instance.shaderSource_Callback_2_(this, shader, string);
   
   @DomName('WebGLRenderingContext.stencilFunc')
   @DocsEditable()
-  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilFunc_Callback_3_(unwrap_jso(this), func, ref, mask);
+  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilFunc_Callback_3_(this, func, ref, mask);
   
   @DomName('WebGLRenderingContext.stencilFuncSeparate')
   @DocsEditable()
-  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilFuncSeparate_Callback_4_(unwrap_jso(this), face, func, ref, mask);
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilFuncSeparate_Callback_4_(this, face, func, ref, mask);
   
   @DomName('WebGLRenderingContext.stencilMask')
   @DocsEditable()
-  void stencilMask(int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilMask_Callback_1_(unwrap_jso(this), mask);
+  void stencilMask(int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilMask_Callback_1_(this, mask);
   
   @DomName('WebGLRenderingContext.stencilMaskSeparate')
   @DocsEditable()
-  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilMaskSeparate_Callback_2_(unwrap_jso(this), face, mask);
+  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilMaskSeparate_Callback_2_(this, face, mask);
   
   @DomName('WebGLRenderingContext.stencilOp')
   @DocsEditable()
-  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.instance.stencilOp_Callback_3_(unwrap_jso(this), fail, zfail, zpass);
+  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.instance.stencilOp_Callback_3_(this, fail, zfail, zpass);
   
   @DomName('WebGLRenderingContext.stencilOpSeparate')
   @DocsEditable()
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.instance.stencilOpSeparate_Callback_4_(unwrap_jso(this), face, fail, zfail, zpass);
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.instance.stencilOpSeparate_Callback_4_(this, face, fail, zfail, zpass);
   
   void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int) && (format is int) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_9_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video), format, type, unwrap_jso(pixels));
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_9_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3385,31 +3093,31 @@
 
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
-  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContext.instance.texParameterf_Callback_3_(unwrap_jso(this), target, pname, param);
+  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContext.instance.texParameterf_Callback_3_(this, target, pname, param);
   
   @DomName('WebGLRenderingContext.texParameteri')
   @DocsEditable()
-  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContext.instance.texParameteri_Callback_3_(unwrap_jso(this), target, pname, param);
+  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContext.instance.texParameteri_Callback_3_(this, target, pname, param);
   
   void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_9_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video), type, unwrap_jso(pixels));
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_9_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3417,15 +3125,15 @@
 
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
-  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContext.instance.uniform1f_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
+  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContext.instance.uniform1f_Callback_2_(this, location, x);
   
   void uniform1fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3433,15 +3141,15 @@
 
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
-  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContext.instance.uniform1i_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
+  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContext.instance.uniform1i_Callback_2_(this, location, x);
   
   void uniform1iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3449,15 +3157,15 @@
 
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
-  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.uniform2f_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
+  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.uniform2f_Callback_3_(this, location, x, y);
   
   void uniform2fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3465,15 +3173,15 @@
 
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
-  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContext.instance.uniform2i_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
+  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContext.instance.uniform2i_Callback_3_(this, location, x, y);
   
   void uniform2iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3481,15 +3189,15 @@
 
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
-  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.uniform3f_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.uniform3f_Callback_4_(this, location, x, y, z);
   
   void uniform3fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3497,15 +3205,15 @@
 
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
-  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContext.instance.uniform3i_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContext.instance.uniform3i_Callback_4_(this, location, x, y, z);
   
   void uniform3iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3513,15 +3221,15 @@
 
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
-  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.uniform4f_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.uniform4f_Callback_5_(this, location, x, y, z, w);
   
   void uniform4fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3529,15 +3237,15 @@
 
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
-  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContext.instance.uniform4i_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContext.instance.uniform4i_Callback_5_(this, location, x, y, z, w);
   
   void uniform4iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3545,11 +3253,11 @@
 
   void uniformMatrix2fv(UniformLocation location, bool transpose, array) {
     if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(this, location, transpose, array);
       return;
     }
     if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(this, location, transpose, array);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3557,11 +3265,11 @@
 
   void uniformMatrix3fv(UniformLocation location, bool transpose, array) {
     if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(this, location, transpose, array);
       return;
     }
     if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(this, location, transpose, array);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3569,11 +3277,11 @@
 
   void uniformMatrix4fv(UniformLocation location, bool transpose, array) {
     if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(this, location, transpose, array);
       return;
     }
     if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(this, location, transpose, array);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3581,23 +3289,23 @@
 
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
-  void useProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.useProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void useProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.useProgram_Callback_1_(this, program);
   
   @DomName('WebGLRenderingContext.validateProgram')
   @DocsEditable()
-  void validateProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.validateProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void validateProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.validateProgram_Callback_1_(this, program);
   
   @DomName('WebGLRenderingContext.vertexAttrib1f')
   @DocsEditable()
-  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1f_Callback_2_(unwrap_jso(this), indx, x);
+  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1f_Callback_2_(this, indx, x);
   
   void vertexAttrib1fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3605,15 +3313,15 @@
 
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
-  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2f_Callback_3_(unwrap_jso(this), indx, x, y);
+  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2f_Callback_3_(this, indx, x, y);
   
   void vertexAttrib2fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3621,15 +3329,15 @@
 
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
-  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3f_Callback_4_(unwrap_jso(this), indx, x, y, z);
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3f_Callback_4_(this, indx, x, y, z);
   
   void vertexAttrib3fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3637,15 +3345,15 @@
 
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4f_Callback_5_(unwrap_jso(this), indx, x, y, z, w);
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4f_Callback_5_(this, indx, x, y, z, w);
   
   void vertexAttrib4fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -3653,42 +3361,33 @@
 
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContext.instance.vertexAttribPointer_Callback_6_(unwrap_jso(this), indx, size, type, normalized, stride, offset);
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContext.instance.vertexAttribPointer_Callback_6_(this, indx, size, type, normalized, stride, offset);
   
   @DomName('WebGLRenderingContext.viewport')
   @DocsEditable()
-  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.viewport_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.viewport_Callback_4_(this, x, y, width, height);
   
 
   /**
    * Sets the currently bound texture to [data].
    *
    * [data] can be either an [ImageElement], a
-   * [CanvasElement], a [VideoElement], or an [ImageData] object.
+   * [CanvasElement], a [VideoElement], [TypedData] or an [ImageData] object.
    *
-   * To use [texImage2d] with a TypedData object, use [texImage2dTyped].
-   *
+   * This is deprecated in favor of [texImage2D].
    */
-  void texImage2DUntyped(int targetTexture, int levelOfDetail, 
+  @Deprecated("Use texImage2D")
+  void texImage2DUntyped(int targetTexture, int levelOfDetail,
       int internalFormat, int format, int type, data) {
-    if (data is ImageElement) {
-      texImage2DImage(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    } else if (data is ImageData) {
-      texImage2DImageData(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    } else if (data is CanvasElement) {
-      texImage2DCanvas(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    } else {
-      texImage2DVideo(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    }
+    texImage2D(targetText, levelOfDetail, internalFormat, format, type, data);
   }
 
   /**
    * Sets the currently bound texture to [data].
+   *
+   * This is deprecated in favour of [texImage2D].
    */
+  @Deprecated("Use texImage2D")
   void texImage2DTyped(int targetTexture, int levelOfDetail, int internalFormat,
       int width, int height, int border, int format, int type, TypedData data) {
     texImage2D(targetTexture, levelOfDetail, internalFormat,
@@ -3699,12 +3398,11 @@
    * Updates a sub-rectangle of the currently bound texture to [data].
    *
    * [data] can be either an [ImageElement], a
-   * [CanvasElement], a [VideoElement], or an [ImageData] object.
-   *
-   * To use [texSubImage2d] with a TypedData object, use [texSubImage2dTyped].
+   * [CanvasElement], a [VideoElement], [TypedData] or an [ImageData] object.
    *
    */
-  void texSubImage2DUntyped(int targetTexture, int levelOfDetail, 
+  @Deprecated("Use texSubImage2D")
+  void texSubImage2DUntyped(int targetTexture, int levelOfDetail,
       int xOffset, int yOffset, int format, int type, data) {
     texSubImage2D(targetTexture, levelOfDetail, xOffset, yOffset,
         format, type, data);
@@ -3713,12 +3411,31 @@
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
    */
+  @Deprecated("Use texSubImage2D")
   void texSubImage2DTyped(int targetTexture, int levelOfDetail,
-      int xOffset, int yOffset, int width, int height, int format,
+      int xOffset, int yOffset, int width, int height, int border, int format,
       int type, TypedData data) {
     texSubImage2D(targetTexture, levelOfDetail, xOffset, yOffset,
         width, height, format, type, data);
   }
+
+  /**
+   * Set the bufferData to [data].
+   */
+  @Deprecated("Use bufferData")
+  void bufferDataTyped(int target, TypedData data, int usage) {
+    bufferData2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        format, type, data);
+  }
+
+  /**
+   * Set the bufferSubData to [data].
+   */
+  @Deprecated("Use bufferSubData")
+  void bufferSubDataTyped(int target, TypedData data, int usage) {
+    bufferSubData2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        format, type, 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
@@ -3734,21 +3451,13 @@
   // To suppress missing implicit constructor warnings.
   factory RenderingContext2._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static RenderingContext2 internalCreateRenderingContext2() {
-    return new RenderingContext2._internalWrap();
-  }
 
-  factory RenderingContext2._internalWrap() {
-    return new RenderingContext2.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   RenderingContext2.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGL2RenderingContext.ACTIVE_ATTRIBUTES')
   @DocsEditable()
   @Experimental() // untriaged
@@ -5237,55 +4946,55 @@
   @DomName('WebGL2RenderingContext.beginQuery')
   @DocsEditable()
   @Experimental() // untriaged
-  void beginQuery(int target, Query query) => _blink.BlinkWebGL2RenderingContext.instance.beginQuery_Callback_2_(unwrap_jso(this), target, unwrap_jso(query));
+  void beginQuery(int target, Query query) => _blink.BlinkWebGL2RenderingContext.instance.beginQuery_Callback_2_(this, target, query);
   
   @DomName('WebGL2RenderingContext.beginTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  void beginTransformFeedback(int primitiveMode) => _blink.BlinkWebGL2RenderingContext.instance.beginTransformFeedback_Callback_1_(unwrap_jso(this), primitiveMode);
+  void beginTransformFeedback(int primitiveMode) => _blink.BlinkWebGL2RenderingContext.instance.beginTransformFeedback_Callback_1_(this, primitiveMode);
   
   @DomName('WebGL2RenderingContext.bindBufferBase')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindBufferBase(int target, int index, Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.bindBufferBase_Callback_3_(unwrap_jso(this), target, index, unwrap_jso(buffer));
+  void bindBufferBase(int target, int index, Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.bindBufferBase_Callback_3_(this, target, index, buffer);
   
   @DomName('WebGL2RenderingContext.bindBufferRange')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindBufferRange(int target, int index, Buffer buffer, int offset, int size) => _blink.BlinkWebGL2RenderingContext.instance.bindBufferRange_Callback_5_(unwrap_jso(this), target, index, unwrap_jso(buffer), offset, size);
+  void bindBufferRange(int target, int index, Buffer buffer, int offset, int size) => _blink.BlinkWebGL2RenderingContext.instance.bindBufferRange_Callback_5_(this, target, index, buffer, offset, size);
   
   @DomName('WebGL2RenderingContext.bindSampler')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindSampler(int unit, Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.bindSampler_Callback_2_(unwrap_jso(this), unit, unwrap_jso(sampler));
+  void bindSampler(int unit, Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.bindSampler_Callback_2_(this, unit, sampler);
   
   @DomName('WebGL2RenderingContext.bindTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindTransformFeedback(int target, TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.bindTransformFeedback_Callback_2_(unwrap_jso(this), target, unwrap_jso(feedback));
+  void bindTransformFeedback(int target, TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.bindTransformFeedback_Callback_2_(this, target, feedback);
   
   @DomName('WebGL2RenderingContext.bindVertexArray')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.bindVertexArray_Callback_1_(unwrap_jso(this), unwrap_jso(vertexArray));
+  void bindVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.bindVertexArray_Callback_1_(this, vertexArray);
   
   @DomName('WebGL2RenderingContext.blitFramebuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) => _blink.BlinkWebGL2RenderingContext.instance.blitFramebuffer_Callback_10_(unwrap_jso(this), srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+  void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) => _blink.BlinkWebGL2RenderingContext.instance.blitFramebuffer_Callback_10_(this, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
   
   @DomName('WebGL2RenderingContext.clearBufferfi')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearBufferfi(int buffer, int drawbuffer, num depth, int stencil) => _blink.BlinkWebGL2RenderingContext.instance.clearBufferfi_Callback_4_(unwrap_jso(this), buffer, drawbuffer, depth, stencil);
+  void clearBufferfi(int buffer, int drawbuffer, num depth, int stencil) => _blink.BlinkWebGL2RenderingContext.instance.clearBufferfi_Callback_4_(this, buffer, drawbuffer, depth, stencil);
   
   void clearBufferfv(int buffer, int drawbuffer, value) {
     if ((value is Float32List) && (drawbuffer is int) && (buffer is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.clearBufferfv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferfv_Callback_3_(this, buffer, drawbuffer, value);
       return;
     }
     if ((value is List<num>) && (drawbuffer is int) && (buffer is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.clearBufferfv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferfv_Callback_3_(this, buffer, drawbuffer, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5293,11 +5002,11 @@
 
   void clearBufferiv(int buffer, int drawbuffer, value) {
     if ((value is Int32List) && (drawbuffer is int) && (buffer is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.clearBufferiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferiv_Callback_3_(this, buffer, drawbuffer, value);
       return;
     }
     if ((value is List<int>) && (drawbuffer is int) && (buffer is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.clearBufferiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferiv_Callback_3_(this, buffer, drawbuffer, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5305,11 +5014,11 @@
 
   void clearBufferuiv(int buffer, int drawbuffer, value) {
     if ((value is Uint32List) && (drawbuffer is int) && (buffer is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.clearBufferuiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferuiv_Callback_3_(this, buffer, drawbuffer, value);
       return;
     }
     if ((value is List<int>) && (drawbuffer is int) && (buffer is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.clearBufferuiv_Callback_3_(unwrap_jso(this), buffer, drawbuffer, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.clearBufferuiv_Callback_3_(this, buffer, drawbuffer, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5318,282 +5027,282 @@
   @DomName('WebGL2RenderingContext.clientWaitSync')
   @DocsEditable()
   @Experimental() // untriaged
-  int clientWaitSync(Sync sync, int flags, int timeout) => _blink.BlinkWebGL2RenderingContext.instance.clientWaitSync_Callback_3_(unwrap_jso(this), unwrap_jso(sync), flags, timeout);
+  int clientWaitSync(Sync sync, int flags, int timeout) => _blink.BlinkWebGL2RenderingContext.instance.clientWaitSync_Callback_3_(this, sync, flags, timeout);
   
   @DomName('WebGL2RenderingContext.compressedTexImage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void compressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexImage3D_Callback_8_(unwrap_jso(this), target, level, internalformat, width, height, depth, border, unwrap_jso(data));
+  void compressedTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexImage3D_Callback_8_(this, target, level, internalformat, width, height, depth, border, data);
   
   @DomName('WebGL2RenderingContext.compressedTexSubImage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void compressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexSubImage3D_Callback_10_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, width, height, depth, format, unwrap_jso(data));
+  void compressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexSubImage3D_Callback_10_(this, target, level, xoffset, yoffset, zoffset, width, height, depth, format, data);
   
   @DomName('WebGL2RenderingContext.copyBufferSubData')
   @DocsEditable()
   @Experimental() // untriaged
-  void copyBufferSubData(int readTarget, int writeTarget, int readOffset, int writeOffset, int size) => _blink.BlinkWebGL2RenderingContext.instance.copyBufferSubData_Callback_5_(unwrap_jso(this), readTarget, writeTarget, readOffset, writeOffset, size);
+  void copyBufferSubData(int readTarget, int writeTarget, int readOffset, int writeOffset, int size) => _blink.BlinkWebGL2RenderingContext.instance.copyBufferSubData_Callback_5_(this, readTarget, writeTarget, readOffset, writeOffset, size);
   
   @DomName('WebGL2RenderingContext.copyTexSubImage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void copyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.copyTexSubImage3D_Callback_9_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, x, y, width, height);
+  void copyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.copyTexSubImage3D_Callback_9_(this, target, level, xoffset, yoffset, zoffset, x, y, width, height);
   
   @DomName('WebGL2RenderingContext.createQuery')
   @DocsEditable()
   @Experimental() // untriaged
-  Query createQuery() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createQuery_Callback_0_(unwrap_jso(this)));
+  Query createQuery() => _blink.BlinkWebGL2RenderingContext.instance.createQuery_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.createSampler')
   @DocsEditable()
   @Experimental() // untriaged
-  Sampler createSampler() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createSampler_Callback_0_(unwrap_jso(this)));
+  Sampler createSampler() => _blink.BlinkWebGL2RenderingContext.instance.createSampler_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.createTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  TransformFeedback createTransformFeedback() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createTransformFeedback_Callback_0_(unwrap_jso(this)));
+  TransformFeedback createTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.createTransformFeedback_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.createVertexArray')
   @DocsEditable()
   @Experimental() // untriaged
-  VertexArrayObject createVertexArray() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createVertexArray_Callback_0_(unwrap_jso(this)));
+  VertexArrayObject createVertexArray() => _blink.BlinkWebGL2RenderingContext.instance.createVertexArray_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.deleteQuery')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteQuery(Query query) => _blink.BlinkWebGL2RenderingContext.instance.deleteQuery_Callback_1_(unwrap_jso(this), unwrap_jso(query));
+  void deleteQuery(Query query) => _blink.BlinkWebGL2RenderingContext.instance.deleteQuery_Callback_1_(this, query);
   
   @DomName('WebGL2RenderingContext.deleteSampler')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteSampler(Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.deleteSampler_Callback_1_(unwrap_jso(this), unwrap_jso(sampler));
+  void deleteSampler(Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.deleteSampler_Callback_1_(this, sampler);
   
   @DomName('WebGL2RenderingContext.deleteSync')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteSync(Sync sync) => _blink.BlinkWebGL2RenderingContext.instance.deleteSync_Callback_1_(unwrap_jso(this), unwrap_jso(sync));
+  void deleteSync(Sync sync) => _blink.BlinkWebGL2RenderingContext.instance.deleteSync_Callback_1_(this, sync);
   
   @DomName('WebGL2RenderingContext.deleteTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteTransformFeedback(TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.deleteTransformFeedback_Callback_1_(unwrap_jso(this), unwrap_jso(feedback));
+  void deleteTransformFeedback(TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.deleteTransformFeedback_Callback_1_(this, feedback);
   
   @DomName('WebGL2RenderingContext.deleteVertexArray')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.deleteVertexArray_Callback_1_(unwrap_jso(this), unwrap_jso(vertexArray));
+  void deleteVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.deleteVertexArray_Callback_1_(this, vertexArray);
   
   @DomName('WebGL2RenderingContext.drawArraysInstanced')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArraysInstanced(int mode, int first, int count, int instanceCount) => _blink.BlinkWebGL2RenderingContext.instance.drawArraysInstanced_Callback_4_(unwrap_jso(this), mode, first, count, instanceCount);
+  void drawArraysInstanced(int mode, int first, int count, int instanceCount) => _blink.BlinkWebGL2RenderingContext.instance.drawArraysInstanced_Callback_4_(this, mode, first, count, instanceCount);
   
   @DomName('WebGL2RenderingContext.drawBuffers')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawBuffers(List<int> buffers) => _blink.BlinkWebGL2RenderingContext.instance.drawBuffers_Callback_1_(unwrap_jso(this), buffers);
+  void drawBuffers(List<int> buffers) => _blink.BlinkWebGL2RenderingContext.instance.drawBuffers_Callback_1_(this, buffers);
   
   @DomName('WebGL2RenderingContext.drawElementsInstanced')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElementsInstanced(int mode, int count, int type, int offset, int instanceCount) => _blink.BlinkWebGL2RenderingContext.instance.drawElementsInstanced_Callback_5_(unwrap_jso(this), mode, count, type, offset, instanceCount);
+  void drawElementsInstanced(int mode, int count, int type, int offset, int instanceCount) => _blink.BlinkWebGL2RenderingContext.instance.drawElementsInstanced_Callback_5_(this, mode, count, type, offset, instanceCount);
   
   @DomName('WebGL2RenderingContext.drawRangeElements')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawRangeElements(int mode, int start, int end, int count, int type, int offset) => _blink.BlinkWebGL2RenderingContext.instance.drawRangeElements_Callback_6_(unwrap_jso(this), mode, start, end, count, type, offset);
+  void drawRangeElements(int mode, int start, int end, int count, int type, int offset) => _blink.BlinkWebGL2RenderingContext.instance.drawRangeElements_Callback_6_(this, mode, start, end, count, type, offset);
   
   @DomName('WebGL2RenderingContext.endQuery')
   @DocsEditable()
   @Experimental() // untriaged
-  void endQuery(int target) => _blink.BlinkWebGL2RenderingContext.instance.endQuery_Callback_1_(unwrap_jso(this), target);
+  void endQuery(int target) => _blink.BlinkWebGL2RenderingContext.instance.endQuery_Callback_1_(this, target);
   
   @DomName('WebGL2RenderingContext.endTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  void endTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.endTransformFeedback_Callback_0_(unwrap_jso(this));
+  void endTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.endTransformFeedback_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.fenceSync')
   @DocsEditable()
   @Experimental() // untriaged
-  Sync fenceSync(int condition, int flags) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.fenceSync_Callback_2_(unwrap_jso(this), condition, flags));
+  Sync fenceSync(int condition, int flags) => _blink.BlinkWebGL2RenderingContext.instance.fenceSync_Callback_2_(this, condition, flags);
   
   @DomName('WebGL2RenderingContext.framebufferTextureLayer')
   @DocsEditable()
   @Experimental() // untriaged
-  void framebufferTextureLayer(int target, int attachment, Texture texture, int level, int layer) => _blink.BlinkWebGL2RenderingContext.instance.framebufferTextureLayer_Callback_5_(unwrap_jso(this), target, attachment, unwrap_jso(texture), level, layer);
+  void framebufferTextureLayer(int target, int attachment, Texture texture, int level, int layer) => _blink.BlinkWebGL2RenderingContext.instance.framebufferTextureLayer_Callback_5_(this, target, attachment, texture, level, layer);
   
   @DomName('WebGL2RenderingContext.getActiveUniformBlockName')
   @DocsEditable()
   @Experimental() // untriaged
-  String getActiveUniformBlockName(Program program, int uniformBlockIndex) => _blink.BlinkWebGL2RenderingContext.instance.getActiveUniformBlockName_Callback_2_(unwrap_jso(this), unwrap_jso(program), uniformBlockIndex);
+  String getActiveUniformBlockName(Program program, int uniformBlockIndex) => _blink.BlinkWebGL2RenderingContext.instance.getActiveUniformBlockName_Callback_2_(this, program, uniformBlockIndex);
   
   @DomName('WebGL2RenderingContext.getActiveUniformBlockParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getActiveUniformBlockParameter(Program program, int uniformBlockIndex, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getActiveUniformBlockParameter_Callback_3_(unwrap_jso(this), unwrap_jso(program), uniformBlockIndex, pname));
+  Object getActiveUniformBlockParameter(Program program, int uniformBlockIndex, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getActiveUniformBlockParameter_Callback_3_(this, program, uniformBlockIndex, pname));
   
   @DomName('WebGL2RenderingContext.getActiveUniforms')
   @DocsEditable()
   @Experimental() // untriaged
-  List<int> getActiveUniforms(Program program, List<int> uniformIndices, int pname) => _blink.BlinkWebGL2RenderingContext.instance.getActiveUniforms_Callback_3_(unwrap_jso(this), unwrap_jso(program), uniformIndices, pname);
+  List<int> getActiveUniforms(Program program, List<int> uniformIndices, int pname) => _blink.BlinkWebGL2RenderingContext.instance.getActiveUniforms_Callback_3_(this, program, uniformIndices, pname);
   
   @DomName('WebGL2RenderingContext.getBufferSubData')
   @DocsEditable()
   @Experimental() // untriaged
-  void getBufferSubData(int target, int offset, ByteBuffer returnedData) => _blink.BlinkWebGL2RenderingContext.instance.getBufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(returnedData));
+  void getBufferSubData(int target, int offset, ByteBuffer returnedData) => _blink.BlinkWebGL2RenderingContext.instance.getBufferSubData_Callback_3_(this, target, offset, returnedData);
   
   @DomName('WebGL2RenderingContext.getFragDataLocation')
   @DocsEditable()
   @Experimental() // untriaged
-  int getFragDataLocation(Program program, String name) => _blink.BlinkWebGL2RenderingContext.instance.getFragDataLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name);
+  int getFragDataLocation(Program program, String name) => _blink.BlinkWebGL2RenderingContext.instance.getFragDataLocation_Callback_2_(this, program, name);
   
   @DomName('WebGL2RenderingContext.getIndexedParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getIndexedParameter(int target, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getIndexedParameter_Callback_2_(unwrap_jso(this), target, index));
+  Object getIndexedParameter(int target, int index) => (_blink.BlinkWebGL2RenderingContext.instance.getIndexedParameter_Callback_2_(this, target, index));
   
   @DomName('WebGL2RenderingContext.getInternalformatParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getInternalformatParameter(int target, int internalformat, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getInternalformatParameter_Callback_3_(unwrap_jso(this), target, internalformat, pname));
+  Object getInternalformatParameter(int target, int internalformat, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getInternalformatParameter_Callback_3_(this, target, internalformat, pname));
   
   @DomName('WebGL2RenderingContext.getQuery')
   @DocsEditable()
   @Experimental() // untriaged
-  Query getQuery(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getQuery_Callback_2_(unwrap_jso(this), target, pname));
+  Query getQuery(int target, int pname) => _blink.BlinkWebGL2RenderingContext.instance.getQuery_Callback_2_(this, target, pname);
   
   @DomName('WebGL2RenderingContext.getQueryParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getQueryParameter(Query query, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getQueryParameter_Callback_2_(unwrap_jso(this), unwrap_jso(query), pname));
+  Object getQueryParameter(Query query, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getQueryParameter_Callback_2_(this, query, pname));
   
   @DomName('WebGL2RenderingContext.getSamplerParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getSamplerParameter(Sampler sampler, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getSamplerParameter_Callback_2_(unwrap_jso(this), unwrap_jso(sampler), pname));
+  Object getSamplerParameter(Sampler sampler, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getSamplerParameter_Callback_2_(this, sampler, pname));
   
   @DomName('WebGL2RenderingContext.getSyncParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getSyncParameter(Sync sync, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getSyncParameter_Callback_2_(unwrap_jso(this), unwrap_jso(sync), pname));
+  Object getSyncParameter(Sync sync, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getSyncParameter_Callback_2_(this, sync, pname));
   
   @DomName('WebGL2RenderingContext.getTransformFeedbackVarying')
   @DocsEditable()
   @Experimental() // untriaged
-  ActiveInfo getTransformFeedbackVarying(Program program, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getTransformFeedbackVarying_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  ActiveInfo getTransformFeedbackVarying(Program program, int index) => _blink.BlinkWebGL2RenderingContext.instance.getTransformFeedbackVarying_Callback_2_(this, program, index);
   
   @DomName('WebGL2RenderingContext.getUniformBlockIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  int getUniformBlockIndex(Program program, String uniformBlockName) => _blink.BlinkWebGL2RenderingContext.instance.getUniformBlockIndex_Callback_2_(unwrap_jso(this), unwrap_jso(program), uniformBlockName);
+  int getUniformBlockIndex(Program program, String uniformBlockName) => _blink.BlinkWebGL2RenderingContext.instance.getUniformBlockIndex_Callback_2_(this, program, uniformBlockName);
   
   @DomName('WebGL2RenderingContext.getUniformIndices')
   @DocsEditable()
   @Experimental() // untriaged
-  List<int> getUniformIndices(Program program, List<String> uniformNames) => _blink.BlinkWebGL2RenderingContext.instance.getUniformIndices_Callback_2_(unwrap_jso(this), unwrap_jso(program), uniformNames);
+  List<int> getUniformIndices(Program program, List<String> uniformNames) => _blink.BlinkWebGL2RenderingContext.instance.getUniformIndices_Callback_2_(this, program, uniformNames);
   
   @DomName('WebGL2RenderingContext.invalidateFramebuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void invalidateFramebuffer(int target, List<int> attachments) => _blink.BlinkWebGL2RenderingContext.instance.invalidateFramebuffer_Callback_2_(unwrap_jso(this), target, attachments);
+  void invalidateFramebuffer(int target, List<int> attachments) => _blink.BlinkWebGL2RenderingContext.instance.invalidateFramebuffer_Callback_2_(this, target, attachments);
   
   @DomName('WebGL2RenderingContext.invalidateSubFramebuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void invalidateSubFramebuffer(int target, List<int> attachments, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.invalidateSubFramebuffer_Callback_6_(unwrap_jso(this), target, attachments, x, y, width, height);
+  void invalidateSubFramebuffer(int target, List<int> attachments, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.invalidateSubFramebuffer_Callback_6_(this, target, attachments, x, y, width, height);
   
   @DomName('WebGL2RenderingContext.isQuery')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isQuery(Query query) => _blink.BlinkWebGL2RenderingContext.instance.isQuery_Callback_1_(unwrap_jso(this), unwrap_jso(query));
+  bool isQuery(Query query) => _blink.BlinkWebGL2RenderingContext.instance.isQuery_Callback_1_(this, query);
   
   @DomName('WebGL2RenderingContext.isSampler')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isSampler(Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.isSampler_Callback_1_(unwrap_jso(this), unwrap_jso(sampler));
+  bool isSampler(Sampler sampler) => _blink.BlinkWebGL2RenderingContext.instance.isSampler_Callback_1_(this, sampler);
   
   @DomName('WebGL2RenderingContext.isSync')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isSync(Sync sync) => _blink.BlinkWebGL2RenderingContext.instance.isSync_Callback_1_(unwrap_jso(this), unwrap_jso(sync));
+  bool isSync(Sync sync) => _blink.BlinkWebGL2RenderingContext.instance.isSync_Callback_1_(this, sync);
   
   @DomName('WebGL2RenderingContext.isTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isTransformFeedback(TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.isTransformFeedback_Callback_1_(unwrap_jso(this), unwrap_jso(feedback));
+  bool isTransformFeedback(TransformFeedback feedback) => _blink.BlinkWebGL2RenderingContext.instance.isTransformFeedback_Callback_1_(this, feedback);
   
   @DomName('WebGL2RenderingContext.isVertexArray')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.isVertexArray_Callback_1_(unwrap_jso(this), unwrap_jso(vertexArray));
+  bool isVertexArray(VertexArrayObject vertexArray) => _blink.BlinkWebGL2RenderingContext.instance.isVertexArray_Callback_1_(this, vertexArray);
   
   @DomName('WebGL2RenderingContext.pauseTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  void pauseTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.pauseTransformFeedback_Callback_0_(unwrap_jso(this));
+  void pauseTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.pauseTransformFeedback_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.readBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void readBuffer(int mode) => _blink.BlinkWebGL2RenderingContext.instance.readBuffer_Callback_1_(unwrap_jso(this), mode);
+  void readBuffer(int mode) => _blink.BlinkWebGL2RenderingContext.instance.readBuffer_Callback_1_(this, mode);
   
   @DomName('WebGL2RenderingContext.renderbufferStorageMultisample')
   @DocsEditable()
   @Experimental() // untriaged
-  void renderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.renderbufferStorageMultisample_Callback_5_(unwrap_jso(this), target, samples, internalformat, width, height);
+  void renderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.renderbufferStorageMultisample_Callback_5_(this, target, samples, internalformat, width, height);
   
   @DomName('WebGL2RenderingContext.resumeTransformFeedback')
   @DocsEditable()
   @Experimental() // untriaged
-  void resumeTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.resumeTransformFeedback_Callback_0_(unwrap_jso(this));
+  void resumeTransformFeedback() => _blink.BlinkWebGL2RenderingContext.instance.resumeTransformFeedback_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.samplerParameterf')
   @DocsEditable()
   @Experimental() // untriaged
-  void samplerParameterf(Sampler sampler, int pname, num param) => _blink.BlinkWebGL2RenderingContext.instance.samplerParameterf_Callback_3_(unwrap_jso(this), unwrap_jso(sampler), pname, param);
+  void samplerParameterf(Sampler sampler, int pname, num param) => _blink.BlinkWebGL2RenderingContext.instance.samplerParameterf_Callback_3_(this, sampler, pname, param);
   
   @DomName('WebGL2RenderingContext.samplerParameteri')
   @DocsEditable()
   @Experimental() // untriaged
-  void samplerParameteri(Sampler sampler, int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.samplerParameteri_Callback_3_(unwrap_jso(this), unwrap_jso(sampler), pname, param);
+  void samplerParameteri(Sampler sampler, int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.samplerParameteri_Callback_3_(this, sampler, pname, param);
   
   @DomName('WebGL2RenderingContext.texImage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void texImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, TypedData pixels) => _blink.BlinkWebGL2RenderingContext.instance.texImage3D_Callback_10_(unwrap_jso(this), target, level, internalformat, width, height, depth, border, format, type, unwrap_jso(pixels));
+  void texImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, TypedData pixels) => _blink.BlinkWebGL2RenderingContext.instance.texImage3D_Callback_10_(this, target, level, internalformat, width, height, depth, border, format, type, pixels);
   
   @DomName('WebGL2RenderingContext.texStorage2D')
   @DocsEditable()
   @Experimental() // untriaged
-  void texStorage2D(int target, int levels, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.texStorage2D_Callback_5_(unwrap_jso(this), target, levels, internalformat, width, height);
+  void texStorage2D(int target, int levels, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.texStorage2D_Callback_5_(this, target, levels, internalformat, width, height);
   
   @DomName('WebGL2RenderingContext.texStorage3D')
   @DocsEditable()
   @Experimental() // untriaged
-  void texStorage3D(int target, int levels, int internalformat, int width, int height, int depth) => _blink.BlinkWebGL2RenderingContext.instance.texStorage3D_Callback_6_(unwrap_jso(this), target, levels, internalformat, width, height, depth);
+  void texStorage3D(int target, int levels, int internalformat, int width, int height, int depth) => _blink.BlinkWebGL2RenderingContext.instance.texStorage3D_Callback_6_(this, target, levels, internalformat, width, height, depth);
   
   void texSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int format_OR_width, int height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video, [int format, int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int) && (format is int) && (canvas_OR_data_OR_depth_OR_image_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_11_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video), format, type, unwrap_jso(pixels));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_11_(this, target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video, format, type, pixels);
       return;
     }
     if ((canvas_OR_data_OR_depth_OR_image_OR_video is ImageData || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(this, target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video);
       return;
     }
     if ((canvas_OR_data_OR_depth_OR_image_OR_video is ImageElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(this, target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video);
       return;
     }
     if ((canvas_OR_data_OR_depth_OR_image_OR_video is CanvasElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(this, target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video);
       return;
     }
     if ((canvas_OR_data_OR_depth_OR_image_OR_video is VideoElement || canvas_OR_data_OR_depth_OR_image_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (zoffset is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_data_OR_depth_OR_image_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage3D_Callback_8_(this, target, level, xoffset, yoffset, zoffset, format_OR_width, height_OR_type, canvas_OR_data_OR_depth_OR_image_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5602,60 +5311,60 @@
   @DomName('WebGL2RenderingContext.transformFeedbackVaryings')
   @DocsEditable()
   @Experimental() // untriaged
-  void transformFeedbackVaryings(Program program, List<String> varyings, int bufferMode) => _blink.BlinkWebGL2RenderingContext.instance.transformFeedbackVaryings_Callback_3_(unwrap_jso(this), unwrap_jso(program), varyings, bufferMode);
+  void transformFeedbackVaryings(Program program, List<String> varyings, int bufferMode) => _blink.BlinkWebGL2RenderingContext.instance.transformFeedbackVaryings_Callback_3_(this, program, varyings, bufferMode);
   
   @DomName('WebGL2RenderingContext.uniform1ui')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform1ui(UniformLocation location, int v0) => _blink.BlinkWebGL2RenderingContext.instance.uniform1ui_Callback_2_(unwrap_jso(this), unwrap_jso(location), v0);
+  void uniform1ui(UniformLocation location, int v0) => _blink.BlinkWebGL2RenderingContext.instance.uniform1ui_Callback_2_(this, location, v0);
   
   @DomName('WebGL2RenderingContext.uniform1uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform1uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform1uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  void uniform1uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform1uiv_Callback_2_(this, location, value);
   
   @DomName('WebGL2RenderingContext.uniform2ui')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform2ui(UniformLocation location, int v0, int v1) => _blink.BlinkWebGL2RenderingContext.instance.uniform2ui_Callback_3_(unwrap_jso(this), unwrap_jso(location), v0, v1);
+  void uniform2ui(UniformLocation location, int v0, int v1) => _blink.BlinkWebGL2RenderingContext.instance.uniform2ui_Callback_3_(this, location, v0, v1);
   
   @DomName('WebGL2RenderingContext.uniform2uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform2uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform2uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  void uniform2uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform2uiv_Callback_2_(this, location, value);
   
   @DomName('WebGL2RenderingContext.uniform3ui')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform3ui(UniformLocation location, int v0, int v1, int v2) => _blink.BlinkWebGL2RenderingContext.instance.uniform3ui_Callback_4_(unwrap_jso(this), unwrap_jso(location), v0, v1, v2);
+  void uniform3ui(UniformLocation location, int v0, int v1, int v2) => _blink.BlinkWebGL2RenderingContext.instance.uniform3ui_Callback_4_(this, location, v0, v1, v2);
   
   @DomName('WebGL2RenderingContext.uniform3uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform3uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform3uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  void uniform3uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform3uiv_Callback_2_(this, location, value);
   
   @DomName('WebGL2RenderingContext.uniform4ui')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform4ui(UniformLocation location, int v0, int v1, int v2, int v3) => _blink.BlinkWebGL2RenderingContext.instance.uniform4ui_Callback_5_(unwrap_jso(this), unwrap_jso(location), v0, v1, v2, v3);
+  void uniform4ui(UniformLocation location, int v0, int v1, int v2, int v3) => _blink.BlinkWebGL2RenderingContext.instance.uniform4ui_Callback_5_(this, location, v0, v1, v2, v3);
   
   @DomName('WebGL2RenderingContext.uniform4uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform4uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform4uiv_Callback_2_(unwrap_jso(this), unwrap_jso(location), value);
+  void uniform4uiv(UniformLocation location, List<int> value) => _blink.BlinkWebGL2RenderingContext.instance.uniform4uiv_Callback_2_(this, location, value);
   
   @DomName('WebGL2RenderingContext.uniformBlockBinding')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniformBlockBinding(Program program, int uniformBlockIndex, int uniformBlockBinding) => _blink.BlinkWebGL2RenderingContext.instance.uniformBlockBinding_Callback_3_(unwrap_jso(this), unwrap_jso(program), uniformBlockIndex, uniformBlockBinding);
+  void uniformBlockBinding(Program program, int uniformBlockIndex, int uniformBlockBinding) => _blink.BlinkWebGL2RenderingContext.instance.uniformBlockBinding_Callback_3_(this, program, uniformBlockIndex, uniformBlockBinding);
   
   void uniformMatrix2x3fv(UniformLocation location, bool transpose, value) {
     if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x3fv_Callback_3_(this, location, transpose, value);
       return;
     }
     if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x3fv_Callback_3_(this, location, transpose, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5663,11 +5372,11 @@
 
   void uniformMatrix2x4fv(UniformLocation location, bool transpose, value) {
     if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x4fv_Callback_3_(this, location, transpose, value);
       return;
     }
     if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2x4fv_Callback_3_(this, location, transpose, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5675,11 +5384,11 @@
 
   void uniformMatrix3x2fv(UniformLocation location, bool transpose, value) {
     if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x2fv_Callback_3_(this, location, transpose, value);
       return;
     }
     if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x2fv_Callback_3_(this, location, transpose, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5687,11 +5396,11 @@
 
   void uniformMatrix3x4fv(UniformLocation location, bool transpose, value) {
     if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x4fv_Callback_3_(this, location, transpose, value);
       return;
     }
     if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3x4fv_Callback_3_(this, location, transpose, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5699,11 +5408,11 @@
 
   void uniformMatrix4x2fv(UniformLocation location, bool transpose, value) {
     if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x2fv_Callback_3_(this, location, transpose, value);
       return;
     }
     if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x2fv_Callback_3_(this, location, transpose, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5711,11 +5420,11 @@
 
   void uniformMatrix4x3fv(UniformLocation location, bool transpose, value) {
     if ((value is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x3fv_Callback_3_(this, location, transpose, value);
       return;
     }
     if ((value is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(value));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4x3fv_Callback_3_(this, location, transpose, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5724,124 +5433,124 @@
   @DomName('WebGL2RenderingContext.vertexAttribDivisor')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribDivisor(int index, int divisor) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribDivisor_Callback_2_(unwrap_jso(this), index, divisor);
+  void vertexAttribDivisor(int index, int divisor) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribDivisor_Callback_2_(this, index, divisor);
   
   @DomName('WebGL2RenderingContext.vertexAttribI4i')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribI4i(int index, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4i_Callback_5_(unwrap_jso(this), index, x, y, z, w);
+  void vertexAttribI4i(int index, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4i_Callback_5_(this, index, x, y, z, w);
   
   @DomName('WebGL2RenderingContext.vertexAttribI4iv')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribI4iv(int index, List<int> v) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4iv_Callback_2_(unwrap_jso(this), index, v);
+  void vertexAttribI4iv(int index, List<int> v) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4iv_Callback_2_(this, index, v);
   
   @DomName('WebGL2RenderingContext.vertexAttribI4ui')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribI4ui(int index, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4ui_Callback_5_(unwrap_jso(this), index, x, y, z, w);
+  void vertexAttribI4ui(int index, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4ui_Callback_5_(this, index, x, y, z, w);
   
   @DomName('WebGL2RenderingContext.vertexAttribI4uiv')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribI4uiv(int index, List<int> v) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4uiv_Callback_2_(unwrap_jso(this), index, v);
+  void vertexAttribI4uiv(int index, List<int> v) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribI4uiv_Callback_2_(this, index, v);
   
   @DomName('WebGL2RenderingContext.vertexAttribIPointer')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribIPointer(int index, int size, int type, int stride, int offset) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribIPointer_Callback_5_(unwrap_jso(this), index, size, type, stride, offset);
+  void vertexAttribIPointer(int index, int size, int type, int stride, int offset) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribIPointer_Callback_5_(this, index, size, type, stride, offset);
   
   @DomName('WebGL2RenderingContext.waitSync')
   @DocsEditable()
   @Experimental() // untriaged
-  void waitSync(Sync sync, int flags, int timeout) => _blink.BlinkWebGL2RenderingContext.instance.waitSync_Callback_3_(unwrap_jso(this), unwrap_jso(sync), flags, timeout);
+  void waitSync(Sync sync, int flags, int timeout) => _blink.BlinkWebGL2RenderingContext.instance.waitSync_Callback_3_(this, sync, flags, timeout);
   
   @DomName('WebGL2RenderingContext.canvas')
   @DocsEditable()
   @Experimental() // untriaged
-  CanvasElement get canvas => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.canvas_Getter_(unwrap_jso(this)));
+  CanvasElement get canvas => _blink.BlinkWebGL2RenderingContext.instance.canvas_Getter_(this);
   
   @DomName('WebGL2RenderingContext.drawingBufferHeight')
   @DocsEditable()
   @Experimental() // untriaged
-  int get drawingBufferHeight => _blink.BlinkWebGL2RenderingContext.instance.drawingBufferHeight_Getter_(unwrap_jso(this));
+  int get drawingBufferHeight => _blink.BlinkWebGL2RenderingContext.instance.drawingBufferHeight_Getter_(this);
   
   @DomName('WebGL2RenderingContext.drawingBufferWidth')
   @DocsEditable()
   @Experimental() // untriaged
-  int get drawingBufferWidth => _blink.BlinkWebGL2RenderingContext.instance.drawingBufferWidth_Getter_(unwrap_jso(this));
+  int get drawingBufferWidth => _blink.BlinkWebGL2RenderingContext.instance.drawingBufferWidth_Getter_(this);
   
   @DomName('WebGL2RenderingContext.activeTexture')
   @DocsEditable()
   @Experimental() // untriaged
-  void activeTexture(int texture) => _blink.BlinkWebGL2RenderingContext.instance.activeTexture_Callback_1_(unwrap_jso(this), texture);
+  void activeTexture(int texture) => _blink.BlinkWebGL2RenderingContext.instance.activeTexture_Callback_1_(this, texture);
   
   @DomName('WebGL2RenderingContext.attachShader')
   @DocsEditable()
   @Experimental() // untriaged
-  void attachShader(Program program, Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.attachShader_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(shader));
+  void attachShader(Program program, Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.attachShader_Callback_2_(this, program, shader);
   
   @DomName('WebGL2RenderingContext.bindAttribLocation')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGL2RenderingContext.instance.bindAttribLocation_Callback_3_(unwrap_jso(this), unwrap_jso(program), index, name);
+  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGL2RenderingContext.instance.bindAttribLocation_Callback_3_(this, program, index, name);
   
   @DomName('WebGL2RenderingContext.bindBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.bindBuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(buffer));
+  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.bindBuffer_Callback_2_(this, target, buffer);
   
   @DomName('WebGL2RenderingContext.bindFramebuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.bindFramebuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(framebuffer));
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.bindFramebuffer_Callback_2_(this, target, framebuffer);
   
   @DomName('WebGL2RenderingContext.bindRenderbuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.bindRenderbuffer_Callback_2_(unwrap_jso(this), target, unwrap_jso(renderbuffer));
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.bindRenderbuffer_Callback_2_(this, target, renderbuffer);
   
   @DomName('WebGL2RenderingContext.bindTexture')
   @DocsEditable()
   @Experimental() // untriaged
-  void bindTexture(int target, Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.bindTexture_Callback_2_(unwrap_jso(this), target, unwrap_jso(texture));
+  void bindTexture(int target, Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.bindTexture_Callback_2_(this, target, texture);
   
   @DomName('WebGL2RenderingContext.blendColor')
   @DocsEditable()
   @Experimental() // untriaged
-  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGL2RenderingContext.instance.blendColor_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGL2RenderingContext.instance.blendColor_Callback_4_(this, red, green, blue, alpha);
   
   @DomName('WebGL2RenderingContext.blendEquation')
   @DocsEditable()
   @Experimental() // untriaged
-  void blendEquation(int mode) => _blink.BlinkWebGL2RenderingContext.instance.blendEquation_Callback_1_(unwrap_jso(this), mode);
+  void blendEquation(int mode) => _blink.BlinkWebGL2RenderingContext.instance.blendEquation_Callback_1_(this, mode);
   
   @DomName('WebGL2RenderingContext.blendEquationSeparate')
   @DocsEditable()
   @Experimental() // untriaged
-  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGL2RenderingContext.instance.blendEquationSeparate_Callback_2_(unwrap_jso(this), modeRGB, modeAlpha);
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGL2RenderingContext.instance.blendEquationSeparate_Callback_2_(this, modeRGB, modeAlpha);
   
   @DomName('WebGL2RenderingContext.blendFunc')
   @DocsEditable()
   @Experimental() // untriaged
-  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGL2RenderingContext.instance.blendFunc_Callback_2_(unwrap_jso(this), sfactor, dfactor);
+  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGL2RenderingContext.instance.blendFunc_Callback_2_(this, sfactor, dfactor);
   
   @DomName('WebGL2RenderingContext.blendFuncSeparate')
   @DocsEditable()
   @Experimental() // untriaged
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGL2RenderingContext.instance.blendFuncSeparate_Callback_4_(unwrap_jso(this), srcRGB, dstRGB, srcAlpha, dstAlpha);
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGL2RenderingContext.instance.blendFuncSeparate_Callback_4_(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
   
   void bufferData(int target, data_OR_size, int usage) {
     if ((usage is int) && (data_OR_size is int) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     if ((usage is int) && (data_OR_size is TypedData) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     if ((usage is int) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(unwrap_jso(this), target, unwrap_jso(data_OR_size), usage);
+      _blink.BlinkWebGL2RenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5849,11 +5558,11 @@
 
   void bufferSubData(int target, int offset, data) {
     if ((data is TypedData) && (offset is int) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
+      _blink.BlinkWebGL2RenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
       return;
     }
     if ((data is ByteBuffer || data == null) && (offset is int) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.bufferSubData_Callback_3_(unwrap_jso(this), target, offset, unwrap_jso(data));
+      _blink.BlinkWebGL2RenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -5862,457 +5571,457 @@
   @DomName('WebGL2RenderingContext.checkFramebufferStatus')
   @DocsEditable()
   @Experimental() // untriaged
-  int checkFramebufferStatus(int target) => _blink.BlinkWebGL2RenderingContext.instance.checkFramebufferStatus_Callback_1_(unwrap_jso(this), target);
+  int checkFramebufferStatus(int target) => _blink.BlinkWebGL2RenderingContext.instance.checkFramebufferStatus_Callback_1_(this, target);
   
   @DomName('WebGL2RenderingContext.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear(int mask) => _blink.BlinkWebGL2RenderingContext.instance.clear_Callback_1_(unwrap_jso(this), mask);
+  void clear(int mask) => _blink.BlinkWebGL2RenderingContext.instance.clear_Callback_1_(this, mask);
   
   @DomName('WebGL2RenderingContext.clearColor')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGL2RenderingContext.instance.clearColor_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGL2RenderingContext.instance.clearColor_Callback_4_(this, red, green, blue, alpha);
   
   @DomName('WebGL2RenderingContext.clearDepth')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearDepth(num depth) => _blink.BlinkWebGL2RenderingContext.instance.clearDepth_Callback_1_(unwrap_jso(this), depth);
+  void clearDepth(num depth) => _blink.BlinkWebGL2RenderingContext.instance.clearDepth_Callback_1_(this, depth);
   
   @DomName('WebGL2RenderingContext.clearStencil')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearStencil(int s) => _blink.BlinkWebGL2RenderingContext.instance.clearStencil_Callback_1_(unwrap_jso(this), s);
+  void clearStencil(int s) => _blink.BlinkWebGL2RenderingContext.instance.clearStencil_Callback_1_(this, s);
   
   @DomName('WebGL2RenderingContext.colorMask')
   @DocsEditable()
   @Experimental() // untriaged
-  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGL2RenderingContext.instance.colorMask_Callback_4_(unwrap_jso(this), red, green, blue, alpha);
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGL2RenderingContext.instance.colorMask_Callback_4_(this, red, green, blue, alpha);
   
   @DomName('WebGL2RenderingContext.compileShader')
   @DocsEditable()
   @Experimental() // untriaged
-  void compileShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.compileShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  void compileShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.compileShader_Callback_1_(this, shader);
   
   @DomName('WebGL2RenderingContext.compressedTexImage2D')
   @DocsEditable()
   @Experimental() // untriaged
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexImage2D_Callback_7_(unwrap_jso(this), target, level, internalformat, width, height, border, unwrap_jso(data));
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexImage2D_Callback_7_(this, target, level, internalformat, width, height, border, data);
   
   @DomName('WebGL2RenderingContext.compressedTexSubImage2D')
   @DocsEditable()
   @Experimental() // untriaged
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexSubImage2D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, width, height, format, unwrap_jso(data));
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGL2RenderingContext.instance.compressedTexSubImage2D_Callback_8_(this, target, level, xoffset, yoffset, width, height, format, data);
   
   @DomName('WebGL2RenderingContext.copyTexImage2D')
   @DocsEditable()
   @Experimental() // untriaged
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGL2RenderingContext.instance.copyTexImage2D_Callback_8_(unwrap_jso(this), target, level, internalformat, x, y, width, height, border);
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGL2RenderingContext.instance.copyTexImage2D_Callback_8_(this, target, level, internalformat, x, y, width, height, border);
   
   @DomName('WebGL2RenderingContext.copyTexSubImage2D')
   @DocsEditable()
   @Experimental() // untriaged
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.copyTexSubImage2D_Callback_8_(unwrap_jso(this), target, level, xoffset, yoffset, x, y, width, height);
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.copyTexSubImage2D_Callback_8_(this, target, level, xoffset, yoffset, x, y, width, height);
   
   @DomName('WebGL2RenderingContext.createBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Buffer createBuffer() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createBuffer_Callback_0_(unwrap_jso(this)));
+  Buffer createBuffer() => _blink.BlinkWebGL2RenderingContext.instance.createBuffer_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.createFramebuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Framebuffer createFramebuffer() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createFramebuffer_Callback_0_(unwrap_jso(this)));
+  Framebuffer createFramebuffer() => _blink.BlinkWebGL2RenderingContext.instance.createFramebuffer_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.createProgram')
   @DocsEditable()
   @Experimental() // untriaged
-  Program createProgram() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createProgram_Callback_0_(unwrap_jso(this)));
+  Program createProgram() => _blink.BlinkWebGL2RenderingContext.instance.createProgram_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.createRenderbuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Renderbuffer createRenderbuffer() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createRenderbuffer_Callback_0_(unwrap_jso(this)));
+  Renderbuffer createRenderbuffer() => _blink.BlinkWebGL2RenderingContext.instance.createRenderbuffer_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.createShader')
   @DocsEditable()
   @Experimental() // untriaged
-  Shader createShader(int type) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createShader_Callback_1_(unwrap_jso(this), type));
+  Shader createShader(int type) => _blink.BlinkWebGL2RenderingContext.instance.createShader_Callback_1_(this, type);
   
   @DomName('WebGL2RenderingContext.createTexture')
   @DocsEditable()
   @Experimental() // untriaged
-  Texture createTexture() => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.createTexture_Callback_0_(unwrap_jso(this)));
+  Texture createTexture() => _blink.BlinkWebGL2RenderingContext.instance.createTexture_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.cullFace')
   @DocsEditable()
   @Experimental() // untriaged
-  void cullFace(int mode) => _blink.BlinkWebGL2RenderingContext.instance.cullFace_Callback_1_(unwrap_jso(this), mode);
+  void cullFace(int mode) => _blink.BlinkWebGL2RenderingContext.instance.cullFace_Callback_1_(this, mode);
   
   @DomName('WebGL2RenderingContext.deleteBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteBuffer_Callback_1_(this, buffer);
   
   @DomName('WebGL2RenderingContext.deleteFramebuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteFramebuffer_Callback_1_(unwrap_jso(this), unwrap_jso(framebuffer));
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteFramebuffer_Callback_1_(this, framebuffer);
   
   @DomName('WebGL2RenderingContext.deleteProgram')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.deleteProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void deleteProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.deleteProgram_Callback_1_(this, program);
   
   @DomName('WebGL2RenderingContext.deleteRenderbuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteRenderbuffer_Callback_1_(unwrap_jso(this), unwrap_jso(renderbuffer));
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.deleteRenderbuffer_Callback_1_(this, renderbuffer);
   
   @DomName('WebGL2RenderingContext.deleteShader')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.deleteShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  void deleteShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.deleteShader_Callback_1_(this, shader);
   
   @DomName('WebGL2RenderingContext.deleteTexture')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteTexture(Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.deleteTexture_Callback_1_(unwrap_jso(this), unwrap_jso(texture));
+  void deleteTexture(Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.deleteTexture_Callback_1_(this, texture);
   
   @DomName('WebGL2RenderingContext.depthFunc')
   @DocsEditable()
   @Experimental() // untriaged
-  void depthFunc(int func) => _blink.BlinkWebGL2RenderingContext.instance.depthFunc_Callback_1_(unwrap_jso(this), func);
+  void depthFunc(int func) => _blink.BlinkWebGL2RenderingContext.instance.depthFunc_Callback_1_(this, func);
   
   @DomName('WebGL2RenderingContext.depthMask')
   @DocsEditable()
   @Experimental() // untriaged
-  void depthMask(bool flag) => _blink.BlinkWebGL2RenderingContext.instance.depthMask_Callback_1_(unwrap_jso(this), flag);
+  void depthMask(bool flag) => _blink.BlinkWebGL2RenderingContext.instance.depthMask_Callback_1_(this, flag);
   
   @DomName('WebGL2RenderingContext.depthRange')
   @DocsEditable()
   @Experimental() // untriaged
-  void depthRange(num zNear, num zFar) => _blink.BlinkWebGL2RenderingContext.instance.depthRange_Callback_2_(unwrap_jso(this), zNear, zFar);
+  void depthRange(num zNear, num zFar) => _blink.BlinkWebGL2RenderingContext.instance.depthRange_Callback_2_(this, zNear, zFar);
   
   @DomName('WebGL2RenderingContext.detachShader')
   @DocsEditable()
   @Experimental() // untriaged
-  void detachShader(Program program, Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.detachShader_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(shader));
+  void detachShader(Program program, Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.detachShader_Callback_2_(this, program, shader);
   
   @DomName('WebGL2RenderingContext.disable')
   @DocsEditable()
   @Experimental() // untriaged
-  void disable(int cap) => _blink.BlinkWebGL2RenderingContext.instance.disable_Callback_1_(unwrap_jso(this), cap);
+  void disable(int cap) => _blink.BlinkWebGL2RenderingContext.instance.disable_Callback_1_(this, cap);
   
   @DomName('WebGL2RenderingContext.disableVertexAttribArray')
   @DocsEditable()
   @Experimental() // untriaged
-  void disableVertexAttribArray(int index) => _blink.BlinkWebGL2RenderingContext.instance.disableVertexAttribArray_Callback_1_(unwrap_jso(this), index);
+  void disableVertexAttribArray(int index) => _blink.BlinkWebGL2RenderingContext.instance.disableVertexAttribArray_Callback_1_(this, index);
   
   @DomName('WebGL2RenderingContext.drawArrays')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGL2RenderingContext.instance.drawArrays_Callback_3_(unwrap_jso(this), mode, first, count);
+  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGL2RenderingContext.instance.drawArrays_Callback_3_(this, mode, first, count);
   
   @DomName('WebGL2RenderingContext.drawElements')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGL2RenderingContext.instance.drawElements_Callback_4_(unwrap_jso(this), mode, count, type, offset);
+  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGL2RenderingContext.instance.drawElements_Callback_4_(this, mode, count, type, offset);
   
   @DomName('WebGL2RenderingContext.enable')
   @DocsEditable()
   @Experimental() // untriaged
-  void enable(int cap) => _blink.BlinkWebGL2RenderingContext.instance.enable_Callback_1_(unwrap_jso(this), cap);
+  void enable(int cap) => _blink.BlinkWebGL2RenderingContext.instance.enable_Callback_1_(this, cap);
   
   @DomName('WebGL2RenderingContext.enableVertexAttribArray')
   @DocsEditable()
   @Experimental() // untriaged
-  void enableVertexAttribArray(int index) => _blink.BlinkWebGL2RenderingContext.instance.enableVertexAttribArray_Callback_1_(unwrap_jso(this), index);
+  void enableVertexAttribArray(int index) => _blink.BlinkWebGL2RenderingContext.instance.enableVertexAttribArray_Callback_1_(this, index);
   
   @DomName('WebGL2RenderingContext.finish')
   @DocsEditable()
   @Experimental() // untriaged
-  void finish() => _blink.BlinkWebGL2RenderingContext.instance.finish_Callback_0_(unwrap_jso(this));
+  void finish() => _blink.BlinkWebGL2RenderingContext.instance.finish_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.flush')
   @DocsEditable()
   @Experimental() // untriaged
-  void flush() => _blink.BlinkWebGL2RenderingContext.instance.flush_Callback_0_(unwrap_jso(this));
+  void flush() => _blink.BlinkWebGL2RenderingContext.instance.flush_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.framebufferRenderbuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.framebufferRenderbuffer_Callback_4_(unwrap_jso(this), target, attachment, renderbuffertarget, unwrap_jso(renderbuffer));
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.framebufferRenderbuffer_Callback_4_(this, target, attachment, renderbuffertarget, renderbuffer);
   
   @DomName('WebGL2RenderingContext.framebufferTexture2D')
   @DocsEditable()
   @Experimental() // untriaged
-  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGL2RenderingContext.instance.framebufferTexture2D_Callback_5_(unwrap_jso(this), target, attachment, textarget, unwrap_jso(texture), level);
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGL2RenderingContext.instance.framebufferTexture2D_Callback_5_(this, target, attachment, textarget, texture, level);
   
   @DomName('WebGL2RenderingContext.frontFace')
   @DocsEditable()
   @Experimental() // untriaged
-  void frontFace(int mode) => _blink.BlinkWebGL2RenderingContext.instance.frontFace_Callback_1_(unwrap_jso(this), mode);
+  void frontFace(int mode) => _blink.BlinkWebGL2RenderingContext.instance.frontFace_Callback_1_(this, mode);
   
   @DomName('WebGL2RenderingContext.generateMipmap')
   @DocsEditable()
   @Experimental() // untriaged
-  void generateMipmap(int target) => _blink.BlinkWebGL2RenderingContext.instance.generateMipmap_Callback_1_(unwrap_jso(this), target);
+  void generateMipmap(int target) => _blink.BlinkWebGL2RenderingContext.instance.generateMipmap_Callback_1_(this, target);
   
   @DomName('WebGL2RenderingContext.getActiveAttrib')
   @DocsEditable()
   @Experimental() // untriaged
-  ActiveInfo getActiveAttrib(Program program, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getActiveAttrib_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGL2RenderingContext.instance.getActiveAttrib_Callback_2_(this, program, index);
   
   @DomName('WebGL2RenderingContext.getActiveUniform')
   @DocsEditable()
   @Experimental() // untriaged
-  ActiveInfo getActiveUniform(Program program, int index) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getActiveUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
+  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGL2RenderingContext.instance.getActiveUniform_Callback_2_(this, program, index);
   
   @DomName('WebGL2RenderingContext.getAttachedShaders')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Shader> getAttachedShaders(Program program) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getAttachedShaders_Callback_1_(unwrap_jso(this), unwrap_jso(program)));
+  List<Shader> getAttachedShaders(Program program) => _blink.BlinkWebGL2RenderingContext.instance.getAttachedShaders_Callback_1_(this, program);
   
   @DomName('WebGL2RenderingContext.getAttribLocation')
   @DocsEditable()
   @Experimental() // untriaged
-  int getAttribLocation(Program program, String name) => _blink.BlinkWebGL2RenderingContext.instance.getAttribLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name);
+  int getAttribLocation(Program program, String name) => _blink.BlinkWebGL2RenderingContext.instance.getAttribLocation_Callback_2_(this, program, name);
   
   @DomName('WebGL2RenderingContext.getBufferParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getBufferParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getBufferParameter_Callback_2_(unwrap_jso(this), target, pname));
+  Object getBufferParameter(int target, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getBufferParameter_Callback_2_(this, target, pname));
   
   @DomName('WebGL2RenderingContext.getContextAttributes')
   @DocsEditable()
   @Experimental() // untriaged
-   getContextAttributes() => convertNativeDictionaryToDartDictionary(wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getContextAttributes_Callback_0_(unwrap_jso(this))));
+   getContextAttributes() => convertNativeDictionaryToDartDictionary((_blink.BlinkWebGL2RenderingContext.instance.getContextAttributes_Callback_0_(this)));
   
   @DomName('WebGL2RenderingContext.getError')
   @DocsEditable()
   @Experimental() // untriaged
-  int getError() => _blink.BlinkWebGL2RenderingContext.instance.getError_Callback_0_(unwrap_jso(this));
+  int getError() => _blink.BlinkWebGL2RenderingContext.instance.getError_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.getExtension')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getExtension(String name) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getExtension_Callback_1_(unwrap_jso(this), name));
+  Object getExtension(String name) => (_blink.BlinkWebGL2RenderingContext.instance.getExtension_Callback_1_(this, name));
   
   @DomName('WebGL2RenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getFramebufferAttachmentParameter_Callback_3_(unwrap_jso(this), target, attachment, pname));
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getFramebufferAttachmentParameter_Callback_3_(this, target, attachment, pname));
   
   @DomName('WebGL2RenderingContext.getParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getParameter(int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getParameter_Callback_1_(unwrap_jso(this), pname));
+  Object getParameter(int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getParameter_Callback_1_(this, pname));
   
   @DomName('WebGL2RenderingContext.getProgramInfoLog')
   @DocsEditable()
   @Experimental() // untriaged
-  String getProgramInfoLog(Program program) => _blink.BlinkWebGL2RenderingContext.instance.getProgramInfoLog_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  String getProgramInfoLog(Program program) => _blink.BlinkWebGL2RenderingContext.instance.getProgramInfoLog_Callback_1_(this, program);
   
   @DomName('WebGL2RenderingContext.getProgramParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getProgramParameter(Program program, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getProgramParameter_Callback_2_(unwrap_jso(this), unwrap_jso(program), pname));
+  Object getProgramParameter(Program program, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getProgramParameter_Callback_2_(this, program, pname));
   
   @DomName('WebGL2RenderingContext.getRenderbufferParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getRenderbufferParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getRenderbufferParameter_Callback_2_(unwrap_jso(this), target, pname));
+  Object getRenderbufferParameter(int target, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getRenderbufferParameter_Callback_2_(this, target, pname));
   
   @DomName('WebGL2RenderingContext.getShaderInfoLog')
   @DocsEditable()
   @Experimental() // untriaged
-  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.getShaderInfoLog_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.getShaderInfoLog_Callback_1_(this, shader);
   
   @DomName('WebGL2RenderingContext.getShaderParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getShaderParameter(Shader shader, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getShaderParameter_Callback_2_(unwrap_jso(this), unwrap_jso(shader), pname));
+  Object getShaderParameter(Shader shader, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getShaderParameter_Callback_2_(this, shader, pname));
   
   @DomName('WebGL2RenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
   @Experimental() // untriaged
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getShaderPrecisionFormat_Callback_2_(unwrap_jso(this), shadertype, precisiontype));
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGL2RenderingContext.instance.getShaderPrecisionFormat_Callback_2_(this, shadertype, precisiontype);
   
   @DomName('WebGL2RenderingContext.getShaderSource')
   @DocsEditable()
   @Experimental() // untriaged
-  String getShaderSource(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.getShaderSource_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  String getShaderSource(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.getShaderSource_Callback_1_(this, shader);
   
   @DomName('WebGL2RenderingContext.getSupportedExtensions')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> getSupportedExtensions() => _blink.BlinkWebGL2RenderingContext.instance.getSupportedExtensions_Callback_0_(unwrap_jso(this));
+  List<String> getSupportedExtensions() => _blink.BlinkWebGL2RenderingContext.instance.getSupportedExtensions_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.getTexParameter')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getTexParameter(int target, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getTexParameter_Callback_2_(unwrap_jso(this), target, pname));
+  Object getTexParameter(int target, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getTexParameter_Callback_2_(this, target, pname));
   
   @DomName('WebGL2RenderingContext.getUniform')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getUniform(Program program, UniformLocation location) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), unwrap_jso(location)));
+  Object getUniform(Program program, UniformLocation location) => (_blink.BlinkWebGL2RenderingContext.instance.getUniform_Callback_2_(this, program, location));
   
   @DomName('WebGL2RenderingContext.getUniformLocation')
   @DocsEditable()
   @Experimental() // untriaged
-  UniformLocation getUniformLocation(Program program, String name) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getUniformLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name));
+  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGL2RenderingContext.instance.getUniformLocation_Callback_2_(this, program, name);
   
   @DomName('WebGL2RenderingContext.getVertexAttrib')
   @DocsEditable()
   @Experimental() // untriaged
-  Object getVertexAttrib(int index, int pname) => wrap_jso(_blink.BlinkWebGL2RenderingContext.instance.getVertexAttrib_Callback_2_(unwrap_jso(this), index, pname));
+  Object getVertexAttrib(int index, int pname) => (_blink.BlinkWebGL2RenderingContext.instance.getVertexAttrib_Callback_2_(this, index, pname));
   
   @DomName('WebGL2RenderingContext.getVertexAttribOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGL2RenderingContext.instance.getVertexAttribOffset_Callback_2_(unwrap_jso(this), index, pname);
+  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGL2RenderingContext.instance.getVertexAttribOffset_Callback_2_(this, index, pname);
   
   @DomName('WebGL2RenderingContext.hint')
   @DocsEditable()
   @Experimental() // untriaged
-  void hint(int target, int mode) => _blink.BlinkWebGL2RenderingContext.instance.hint_Callback_2_(unwrap_jso(this), target, mode);
+  void hint(int target, int mode) => _blink.BlinkWebGL2RenderingContext.instance.hint_Callback_2_(this, target, mode);
   
   @DomName('WebGL2RenderingContext.isBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isBuffer(Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.isBuffer_Callback_1_(unwrap_jso(this), unwrap_jso(buffer));
+  bool isBuffer(Buffer buffer) => _blink.BlinkWebGL2RenderingContext.instance.isBuffer_Callback_1_(this, buffer);
   
   @DomName('WebGL2RenderingContext.isContextLost')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isContextLost() => _blink.BlinkWebGL2RenderingContext.instance.isContextLost_Callback_0_(unwrap_jso(this));
+  bool isContextLost() => _blink.BlinkWebGL2RenderingContext.instance.isContextLost_Callback_0_(this);
   
   @DomName('WebGL2RenderingContext.isEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isEnabled(int cap) => _blink.BlinkWebGL2RenderingContext.instance.isEnabled_Callback_1_(unwrap_jso(this), cap);
+  bool isEnabled(int cap) => _blink.BlinkWebGL2RenderingContext.instance.isEnabled_Callback_1_(this, cap);
   
   @DomName('WebGL2RenderingContext.isFramebuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.isFramebuffer_Callback_1_(unwrap_jso(this), unwrap_jso(framebuffer));
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGL2RenderingContext.instance.isFramebuffer_Callback_1_(this, framebuffer);
   
   @DomName('WebGL2RenderingContext.isProgram')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.isProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  bool isProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.isProgram_Callback_1_(this, program);
   
   @DomName('WebGL2RenderingContext.isRenderbuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.isRenderbuffer_Callback_1_(unwrap_jso(this), unwrap_jso(renderbuffer));
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGL2RenderingContext.instance.isRenderbuffer_Callback_1_(this, renderbuffer);
   
   @DomName('WebGL2RenderingContext.isShader')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.isShader_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
+  bool isShader(Shader shader) => _blink.BlinkWebGL2RenderingContext.instance.isShader_Callback_1_(this, shader);
   
   @DomName('WebGL2RenderingContext.isTexture')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isTexture(Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.isTexture_Callback_1_(unwrap_jso(this), unwrap_jso(texture));
+  bool isTexture(Texture texture) => _blink.BlinkWebGL2RenderingContext.instance.isTexture_Callback_1_(this, texture);
   
   @DomName('WebGL2RenderingContext.lineWidth')
   @DocsEditable()
   @Experimental() // untriaged
-  void lineWidth(num width) => _blink.BlinkWebGL2RenderingContext.instance.lineWidth_Callback_1_(unwrap_jso(this), width);
+  void lineWidth(num width) => _blink.BlinkWebGL2RenderingContext.instance.lineWidth_Callback_1_(this, width);
   
   @DomName('WebGL2RenderingContext.linkProgram')
   @DocsEditable()
   @Experimental() // untriaged
-  void linkProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.linkProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void linkProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.linkProgram_Callback_1_(this, program);
   
   @DomName('WebGL2RenderingContext.pixelStorei')
   @DocsEditable()
   @Experimental() // untriaged
-  void pixelStorei(int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.pixelStorei_Callback_2_(unwrap_jso(this), pname, param);
+  void pixelStorei(int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.pixelStorei_Callback_2_(this, pname, param);
   
   @DomName('WebGL2RenderingContext.polygonOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  void polygonOffset(num factor, num units) => _blink.BlinkWebGL2RenderingContext.instance.polygonOffset_Callback_2_(unwrap_jso(this), factor, units);
+  void polygonOffset(num factor, num units) => _blink.BlinkWebGL2RenderingContext.instance.polygonOffset_Callback_2_(this, factor, units);
   
   @DomName('WebGL2RenderingContext.readPixels')
   @DocsEditable()
   @Experimental() // untriaged
-  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGL2RenderingContext.instance.readPixels_Callback_7_(unwrap_jso(this), x, y, width, height, format, type, unwrap_jso(pixels));
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGL2RenderingContext.instance.readPixels_Callback_7_(this, x, y, width, height, format, type, pixels);
   
   @DomName('WebGL2RenderingContext.renderbufferStorage')
   @DocsEditable()
   @Experimental() // untriaged
-  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.renderbufferStorage_Callback_4_(unwrap_jso(this), target, internalformat, width, height);
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.renderbufferStorage_Callback_4_(this, target, internalformat, width, height);
   
   @DomName('WebGL2RenderingContext.sampleCoverage')
   @DocsEditable()
   @Experimental() // untriaged
-  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGL2RenderingContext.instance.sampleCoverage_Callback_2_(unwrap_jso(this), value, invert);
+  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGL2RenderingContext.instance.sampleCoverage_Callback_2_(this, value, invert);
   
   @DomName('WebGL2RenderingContext.scissor')
   @DocsEditable()
   @Experimental() // untriaged
-  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.scissor_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.scissor_Callback_4_(this, x, y, width, height);
   
   @DomName('WebGL2RenderingContext.shaderSource')
   @DocsEditable()
   @Experimental() // untriaged
-  void shaderSource(Shader shader, String string) => _blink.BlinkWebGL2RenderingContext.instance.shaderSource_Callback_2_(unwrap_jso(this), unwrap_jso(shader), string);
+  void shaderSource(Shader shader, String string) => _blink.BlinkWebGL2RenderingContext.instance.shaderSource_Callback_2_(this, shader, string);
   
   @DomName('WebGL2RenderingContext.stencilFunc')
   @DocsEditable()
   @Experimental() // untriaged
-  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilFunc_Callback_3_(unwrap_jso(this), func, ref, mask);
+  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilFunc_Callback_3_(this, func, ref, mask);
   
   @DomName('WebGL2RenderingContext.stencilFuncSeparate')
   @DocsEditable()
   @Experimental() // untriaged
-  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilFuncSeparate_Callback_4_(unwrap_jso(this), face, func, ref, mask);
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilFuncSeparate_Callback_4_(this, face, func, ref, mask);
   
   @DomName('WebGL2RenderingContext.stencilMask')
   @DocsEditable()
   @Experimental() // untriaged
-  void stencilMask(int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilMask_Callback_1_(unwrap_jso(this), mask);
+  void stencilMask(int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilMask_Callback_1_(this, mask);
   
   @DomName('WebGL2RenderingContext.stencilMaskSeparate')
   @DocsEditable()
   @Experimental() // untriaged
-  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilMaskSeparate_Callback_2_(unwrap_jso(this), face, mask);
+  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGL2RenderingContext.instance.stencilMaskSeparate_Callback_2_(this, face, mask);
   
   @DomName('WebGL2RenderingContext.stencilOp')
   @DocsEditable()
   @Experimental() // untriaged
-  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGL2RenderingContext.instance.stencilOp_Callback_3_(unwrap_jso(this), fail, zfail, zpass);
+  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGL2RenderingContext.instance.stencilOp_Callback_3_(this, fail, zfail, zpass);
   
   @DomName('WebGL2RenderingContext.stencilOpSeparate')
   @DocsEditable()
   @Experimental() // untriaged
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGL2RenderingContext.instance.stencilOpSeparate_Callback_4_(unwrap_jso(this), face, fail, zfail, zpass);
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGL2RenderingContext.instance.stencilOpSeparate_Callback_4_(this, face, fail, zfail, zpass);
   
   void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int) && (format is int) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_9_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video), format, type, unwrap_jso(pixels));
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_9_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(unwrap_jso(this), target, level, internalformat, format_OR_width, height_OR_type, unwrap_jso(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6321,32 +6030,32 @@
   @DomName('WebGL2RenderingContext.texParameterf')
   @DocsEditable()
   @Experimental() // untriaged
-  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGL2RenderingContext.instance.texParameterf_Callback_3_(unwrap_jso(this), target, pname, param);
+  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGL2RenderingContext.instance.texParameterf_Callback_3_(this, target, pname, param);
   
   @DomName('WebGL2RenderingContext.texParameteri')
   @DocsEditable()
   @Experimental() // untriaged
-  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.texParameteri_Callback_3_(unwrap_jso(this), target, pname, param);
+  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGL2RenderingContext.instance.texParameteri_Callback_3_(this, target, pname, param);
   
   void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_9_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video), type, unwrap_jso(pixels));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_9_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(unwrap_jso(this), target, level, xoffset, yoffset, format_OR_width, height_OR_type, unwrap_jso(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      _blink.BlinkWebGL2RenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6355,15 +6064,15 @@
   @DomName('WebGL2RenderingContext.uniform1f')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGL2RenderingContext.instance.uniform1f_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
+  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGL2RenderingContext.instance.uniform1f_Callback_2_(this, location, x);
   
   void uniform1fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform1fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6372,15 +6081,15 @@
   @DomName('WebGL2RenderingContext.uniform1i')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGL2RenderingContext.instance.uniform1i_Callback_2_(unwrap_jso(this), unwrap_jso(location), x);
+  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGL2RenderingContext.instance.uniform1i_Callback_2_(this, location, x);
   
   void uniform1iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform1iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform1iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6389,15 +6098,15 @@
   @DomName('WebGL2RenderingContext.uniform2f')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGL2RenderingContext.instance.uniform2f_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
+  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGL2RenderingContext.instance.uniform2f_Callback_3_(this, location, x, y);
   
   void uniform2fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform2fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6406,15 +6115,15 @@
   @DomName('WebGL2RenderingContext.uniform2i')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGL2RenderingContext.instance.uniform2i_Callback_3_(unwrap_jso(this), unwrap_jso(location), x, y);
+  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGL2RenderingContext.instance.uniform2i_Callback_3_(this, location, x, y);
   
   void uniform2iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform2iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform2iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6423,15 +6132,15 @@
   @DomName('WebGL2RenderingContext.uniform3f')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGL2RenderingContext.instance.uniform3f_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGL2RenderingContext.instance.uniform3f_Callback_4_(this, location, x, y, z);
   
   void uniform3fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform3fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6440,15 +6149,15 @@
   @DomName('WebGL2RenderingContext.uniform3i')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGL2RenderingContext.instance.uniform3i_Callback_4_(unwrap_jso(this), unwrap_jso(location), x, y, z);
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGL2RenderingContext.instance.uniform3i_Callback_4_(this, location, x, y, z);
   
   void uniform3iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform3iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform3iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6457,15 +6166,15 @@
   @DomName('WebGL2RenderingContext.uniform4f')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGL2RenderingContext.instance.uniform4f_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGL2RenderingContext.instance.uniform4f_Callback_5_(this, location, x, y, z, w);
   
   void uniform4fv(UniformLocation location, v) {
     if ((v is Float32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4fv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<num>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform4fv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4fv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6474,15 +6183,15 @@
   @DomName('WebGL2RenderingContext.uniform4i')
   @DocsEditable()
   @Experimental() // untriaged
-  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.uniform4i_Callback_5_(unwrap_jso(this), unwrap_jso(location), x, y, z, w);
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGL2RenderingContext.instance.uniform4i_Callback_5_(this, location, x, y, z, w);
   
   void uniform4iv(UniformLocation location, v) {
     if ((v is Int32List) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4iv_Callback_2_(this, location, v);
       return;
     }
     if ((v is List<int>) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniform4iv_Callback_2_(unwrap_jso(this), unwrap_jso(location), unwrap_jso(v));
+      _blink.BlinkWebGL2RenderingContext.instance.uniform4iv_Callback_2_(this, location, v);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6490,11 +6199,11 @@
 
   void uniformMatrix2fv(UniformLocation location, bool transpose, array) {
     if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2fv_Callback_3_(this, location, transpose, array);
       return;
     }
     if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix2fv_Callback_3_(this, location, transpose, array);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6502,11 +6211,11 @@
 
   void uniformMatrix3fv(UniformLocation location, bool transpose, array) {
     if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3fv_Callback_3_(this, location, transpose, array);
       return;
     }
     if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix3fv_Callback_3_(this, location, transpose, array);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6514,11 +6223,11 @@
 
   void uniformMatrix4fv(UniformLocation location, bool transpose, array) {
     if ((array is Float32List) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4fv_Callback_3_(this, location, transpose, array);
       return;
     }
     if ((array is List<num>) && (transpose is bool) && (location is UniformLocation || location == null)) {
-      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4fv_Callback_3_(unwrap_jso(this), unwrap_jso(location), transpose, unwrap_jso(array));
+      _blink.BlinkWebGL2RenderingContext.instance.uniformMatrix4fv_Callback_3_(this, location, transpose, array);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6527,25 +6236,25 @@
   @DomName('WebGL2RenderingContext.useProgram')
   @DocsEditable()
   @Experimental() // untriaged
-  void useProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.useProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void useProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.useProgram_Callback_1_(this, program);
   
   @DomName('WebGL2RenderingContext.validateProgram')
   @DocsEditable()
   @Experimental() // untriaged
-  void validateProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.validateProgram_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  void validateProgram(Program program) => _blink.BlinkWebGL2RenderingContext.instance.validateProgram_Callback_1_(this, program);
   
   @DomName('WebGL2RenderingContext.vertexAttrib1f')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1f_Callback_2_(unwrap_jso(this), indx, x);
+  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1f_Callback_2_(this, indx, x);
   
   void vertexAttrib1fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib1fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6554,15 +6263,15 @@
   @DomName('WebGL2RenderingContext.vertexAttrib2f')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2f_Callback_3_(unwrap_jso(this), indx, x, y);
+  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2f_Callback_3_(this, indx, x, y);
   
   void vertexAttrib2fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib2fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6571,15 +6280,15 @@
   @DomName('WebGL2RenderingContext.vertexAttrib3f')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3f_Callback_4_(unwrap_jso(this), indx, x, y, z);
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3f_Callback_4_(this, indx, x, y, z);
   
   void vertexAttrib3fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib3fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6588,15 +6297,15 @@
   @DomName('WebGL2RenderingContext.vertexAttrib4f')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4f_Callback_5_(unwrap_jso(this), indx, x, y, z, w);
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4f_Callback_5_(this, indx, x, y, z, w);
   
   void vertexAttrib4fv(int indx, values) {
     if ((values is Float32List) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4fv_Callback_2_(this, indx, values);
       return;
     }
     if ((values is List<num>) && (indx is int)) {
-      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4fv_Callback_2_(unwrap_jso(this), indx, unwrap_jso(values));
+      _blink.BlinkWebGL2RenderingContext.instance.vertexAttrib4fv_Callback_2_(this, indx, values);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -6605,12 +6314,12 @@
   @DomName('WebGL2RenderingContext.vertexAttribPointer')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribPointer_Callback_6_(unwrap_jso(this), indx, size, type, normalized, stride, offset);
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGL2RenderingContext.instance.vertexAttribPointer_Callback_6_(this, indx, size, type, normalized, stride, offset);
   
   @DomName('WebGL2RenderingContext.viewport')
   @DocsEditable()
   @Experimental() // untriaged
-  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.viewport_Callback_4_(unwrap_jso(this), x, y, width, height);
+  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGL2RenderingContext.instance.viewport_Callback_4_(this, x, y, width, height);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6627,21 +6336,13 @@
   // To suppress missing implicit constructor warnings.
   factory Sampler._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Sampler internalCreateSampler() {
-    return new Sampler._internalWrap();
-  }
 
-  factory Sampler._internalWrap() {
-    return new Sampler.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Sampler.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6656,21 +6357,13 @@
   // To suppress missing implicit constructor warnings.
   factory Shader._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Shader internalCreateShader() {
-    return new Shader._internalWrap();
-  }
 
-  factory Shader._internalWrap() {
-    return new Shader.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Shader.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6685,32 +6378,24 @@
   // To suppress missing implicit constructor warnings.
   factory ShaderPrecisionFormat._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static ShaderPrecisionFormat internalCreateShaderPrecisionFormat() {
-    return new ShaderPrecisionFormat._internalWrap();
-  }
 
-  factory ShaderPrecisionFormat._internalWrap() {
-    return new ShaderPrecisionFormat.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   ShaderPrecisionFormat.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('WebGLShaderPrecisionFormat.precision')
   @DocsEditable()
-  int get precision => _blink.BlinkWebGLShaderPrecisionFormat.instance.precision_Getter_(unwrap_jso(this));
+  int get precision => _blink.BlinkWebGLShaderPrecisionFormat.instance.precision_Getter_(this);
   
   @DomName('WebGLShaderPrecisionFormat.rangeMax')
   @DocsEditable()
-  int get rangeMax => _blink.BlinkWebGLShaderPrecisionFormat.instance.rangeMax_Getter_(unwrap_jso(this));
+  int get rangeMax => _blink.BlinkWebGLShaderPrecisionFormat.instance.rangeMax_Getter_(this);
   
   @DomName('WebGLShaderPrecisionFormat.rangeMin')
   @DocsEditable()
-  int get rangeMin => _blink.BlinkWebGLShaderPrecisionFormat.instance.rangeMin_Getter_(unwrap_jso(this));
+  int get rangeMin => _blink.BlinkWebGLShaderPrecisionFormat.instance.rangeMin_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6727,21 +6412,13 @@
   // To suppress missing implicit constructor warnings.
   factory Sync._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Sync internalCreateSync() {
-    return new Sync._internalWrap();
-  }
 
-  factory Sync._internalWrap() {
-    return new Sync.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Sync.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6756,21 +6433,13 @@
   // To suppress missing implicit constructor warnings.
   factory Texture._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static Texture internalCreateTexture() {
-    return new Texture._internalWrap();
-  }
 
-  factory Texture._internalWrap() {
-    return new Texture.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   Texture.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6786,21 +6455,13 @@
   // To suppress missing implicit constructor warnings.
   factory TransformFeedback._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static TransformFeedback internalCreateTransformFeedback() {
-    return new TransformFeedback._internalWrap();
-  }
 
-  factory TransformFeedback._internalWrap() {
-    return new TransformFeedback.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   TransformFeedback.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6815,21 +6476,13 @@
   // To suppress missing implicit constructor warnings.
   factory UniformLocation._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static UniformLocation internalCreateUniformLocation() {
-    return new UniformLocation._internalWrap();
-  }
 
-  factory UniformLocation._internalWrap() {
-    return new UniformLocation.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   UniformLocation.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6845,21 +6498,13 @@
   // To suppress missing implicit constructor warnings.
   factory VertexArrayObject._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VertexArrayObject internalCreateVertexArrayObject() {
-    return new VertexArrayObject._internalWrap();
-  }
 
-  factory VertexArrayObject._internalWrap() {
-    return new VertexArrayObject.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VertexArrayObject.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6876,21 +6521,13 @@
   // To suppress missing implicit constructor warnings.
   factory VertexArrayObjectOes._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static VertexArrayObjectOes internalCreateVertexArrayObjectOes() {
-    return new VertexArrayObjectOes._internalWrap();
-  }
 
-  factory VertexArrayObjectOes._internalWrap() {
-    return new VertexArrayObjectOes.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   VertexArrayObjectOes.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -6906,21 +6543,13 @@
   // To suppress missing implicit constructor warnings.
   factory _WebGL2RenderingContextBase._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static _WebGL2RenderingContextBase internalCreate_WebGL2RenderingContextBase() {
-    return new _WebGL2RenderingContextBase._internalWrap();
-  }
 
-  factory _WebGL2RenderingContextBase._internalWrap() {
-    return new _WebGL2RenderingContextBase.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   _WebGL2RenderingContextBase.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index ee79e22..2e26f43 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -29,22 +29,11 @@
 // FIXME: Can we make this private?
 @Deprecated("Internal Use Only")
 final web_sqlBlinkMap = {
-  'Database': () => SqlDatabase,
-  'SQLError': () => SqlError,
-  'SQLResultSet': () => SqlResultSet,
-  'SQLResultSetRowList': () => SqlResultSetRowList,
-  'SQLTransaction': () => SqlTransaction,
-
-};
-
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final web_sqlBlinkFunctionMap = {
-  'Database': () => SqlDatabase.internalCreateSqlDatabase,
-  'SQLError': () => SqlError.internalCreateSqlError,
-  'SQLResultSet': () => SqlResultSet.internalCreateSqlResultSet,
-  'SQLResultSetRowList': () => SqlResultSetRowList.internalCreateSqlResultSetRowList,
-  'SQLTransaction': () => SqlTransaction.internalCreateSqlTransaction,
+  'Database': () => SqlDatabase.instanceRuntimeType,
+  'SQLError': () => SqlError.instanceRuntimeType,
+  'SQLResultSet': () => SqlResultSet.instanceRuntimeType,
+  'SQLResultSetRowList': () => SqlResultSetRowList.instanceRuntimeType,
+  'SQLTransaction': () => SqlTransaction.instanceRuntimeType,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -109,68 +98,60 @@
   // To suppress missing implicit constructor warnings.
   factory SqlDatabase._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SqlDatabase internalCreateSqlDatabase() {
-    return new SqlDatabase._internalWrap();
-  }
 
-  factory SqlDatabase._internalWrap() {
-    return new SqlDatabase.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SqlDatabase.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('Database.version')
   @DocsEditable()
-  String get version => _blink.BlinkDatabase.instance.version_Getter_(unwrap_jso(this));
+  String get version => _blink.BlinkDatabase.instance.version_Getter_(this);
   
   void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.instance.changeVersion_Callback_5_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))), unwrap_jso(() => successCallback()));
+      _blink.BlinkDatabase.instance.changeVersion_Callback_5_(this, oldVersion, newVersion, callback, errorCallback, successCallback);
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.instance.changeVersion_Callback_4_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDatabase.instance.changeVersion_Callback_4_(this, oldVersion, newVersion, callback, errorCallback);
       return;
     }
     if (callback != null) {
-      _blink.BlinkDatabase.instance.changeVersion_Callback_3_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso((transaction) => callback(wrap_jso(transaction))));
+      _blink.BlinkDatabase.instance.changeVersion_Callback_3_(this, oldVersion, newVersion, callback);
       return;
     }
-    _blink.BlinkDatabase.instance.changeVersion_Callback_2_(unwrap_jso(this), oldVersion, newVersion);
+    _blink.BlinkDatabase.instance.changeVersion_Callback_2_(this, oldVersion, newVersion);
     return;
   }
 
   void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.instance.readTransaction_Callback_3_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))), unwrap_jso(() => successCallback()));
+      _blink.BlinkDatabase.instance.readTransaction_Callback_3_(this, callback, errorCallback, successCallback);
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.instance.readTransaction_Callback_2_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDatabase.instance.readTransaction_Callback_2_(this, callback, errorCallback);
       return;
     }
-    _blink.BlinkDatabase.instance.readTransaction_Callback_1_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))));
+    _blink.BlinkDatabase.instance.readTransaction_Callback_1_(this, callback);
     return;
   }
 
   void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.instance.transaction_Callback_3_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))), unwrap_jso(() => successCallback()));
+      _blink.BlinkDatabase.instance.transaction_Callback_3_(this, callback, errorCallback, successCallback);
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
+      _blink.BlinkDatabase.instance.transaction_Callback_2_(this, callback, errorCallback);
       return;
     }
-    _blink.BlinkDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))));
+    _blink.BlinkDatabase.instance.transaction_Callback_1_(this, callback);
     return;
   }
 
@@ -190,21 +171,13 @@
   // To suppress missing implicit constructor warnings.
   factory SqlError._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SqlError internalCreateSqlError() {
-    return new SqlError._internalWrap();
-  }
 
-  factory SqlError._internalWrap() {
-    return new SqlError.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SqlError.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SQLError.CONSTRAINT_ERR')
   @DocsEditable()
   static const int CONSTRAINT_ERR = 6;
@@ -239,11 +212,11 @@
 
   @DomName('SQLError.code')
   @DocsEditable()
-  int get code => _blink.BlinkSQLError.instance.code_Getter_(unwrap_jso(this));
+  int get code => _blink.BlinkSQLError.instance.code_Getter_(this);
   
   @DomName('SQLError.message')
   @DocsEditable()
-  String get message => _blink.BlinkSQLError.instance.message_Getter_(unwrap_jso(this));
+  String get message => _blink.BlinkSQLError.instance.message_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -261,32 +234,24 @@
   // To suppress missing implicit constructor warnings.
   factory SqlResultSet._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SqlResultSet internalCreateSqlResultSet() {
-    return new SqlResultSet._internalWrap();
-  }
 
-  factory SqlResultSet._internalWrap() {
-    return new SqlResultSet.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SqlResultSet.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SQLResultSet.insertId')
   @DocsEditable()
-  int get insertId => _blink.BlinkSQLResultSet.instance.insertId_Getter_(unwrap_jso(this));
+  int get insertId => _blink.BlinkSQLResultSet.instance.insertId_Getter_(this);
   
   @DomName('SQLResultSet.rows')
   @DocsEditable()
-  SqlResultSetRowList get rows => wrap_jso(_blink.BlinkSQLResultSet.instance.rows_Getter_(unwrap_jso(this)));
+  SqlResultSetRowList get rows => _blink.BlinkSQLResultSet.instance.rows_Getter_(this);
   
   @DomName('SQLResultSet.rowsAffected')
   @DocsEditable()
-  int get rowsAffected => _blink.BlinkSQLResultSet.instance.rowsAffected_Getter_(unwrap_jso(this));
+  int get rowsAffected => _blink.BlinkSQLResultSet.instance.rowsAffected_Getter_(this);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -304,32 +269,24 @@
   // To suppress missing implicit constructor warnings.
   factory SqlResultSetRowList._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SqlResultSetRowList internalCreateSqlResultSetRowList() {
-    return new SqlResultSetRowList._internalWrap();
-  }
 
-  factory SqlResultSetRowList._internalWrap() {
-    return new SqlResultSetRowList.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SqlResultSetRowList.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSQLResultSetRowList.instance.length_Getter_(unwrap_jso(this));
+  int get length => _blink.BlinkSQLResultSetRowList.instance.length_Getter_(this);
   
   Map operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
+    return _nativeIndexedGetter(index);
   }
 
-  Map _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Map _nativeIndexedGetter(int index) => convertNativeToDart_Dictionary(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(this, index));
 
   void operator[]=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -371,7 +328,7 @@
 
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
-  Object item(int index) => wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
+  Object item(int index) => convertNativeToDart_Dictionary(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(this, index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -392,35 +349,27 @@
   // To suppress missing implicit constructor warnings.
   factory SqlTransaction._() { throw new UnsupportedError("Not supported"); }
 
-  @Deprecated("Internal Use Only")
-  static SqlTransaction internalCreateSqlTransaction() {
-    return new SqlTransaction._internalWrap();
-  }
 
-  factory SqlTransaction._internalWrap() {
-    return new SqlTransaction.internal_();
-  }
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   SqlTransaction.internal_() { }
 
-  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
-  int get hashCode => unwrap_jso(this).hashCode;
-
   void executeSql(String sqlStatement, [List arguments, SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkSQLTransaction.instance.executeSql_Callback_4_(unwrap_jso(this), sqlStatement, arguments, unwrap_jso((transaction, resultSet) => callback(wrap_jso(transaction), wrap_jso(resultSet))), unwrap_jso((transaction, error) => errorCallback(wrap_jso(transaction), wrap_jso(error))));
+      _blink.BlinkSQLTransaction.instance.executeSql_Callback_4_(this, sqlStatement, arguments, callback, errorCallback);
       return;
     }
     if (callback != null) {
-      _blink.BlinkSQLTransaction.instance.executeSql_Callback_3_(unwrap_jso(this), sqlStatement, arguments, unwrap_jso((transaction, resultSet) => callback(wrap_jso(transaction), wrap_jso(resultSet))));
+      _blink.BlinkSQLTransaction.instance.executeSql_Callback_3_(this, sqlStatement, arguments, callback);
       return;
     }
     if (arguments != null) {
-      _blink.BlinkSQLTransaction.instance.executeSql_Callback_2_(unwrap_jso(this), sqlStatement, arguments);
+      _blink.BlinkSQLTransaction.instance.executeSql_Callback_2_(this, sqlStatement, arguments);
       return;
     }
-    _blink.BlinkSQLTransaction.instance.executeSql_Callback_1_(unwrap_jso(this), sqlStatement);
+    _blink.BlinkSQLTransaction.instance.executeSql_Callback_1_(this, sqlStatement);
     return;
   }
 
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 7cc7d20..fa1267b 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -299,19 +299,6 @@
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: StaticWarning # Please triage this failure.
 LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: StaticWarning # Please triage this failure.
 
-# Missing concrete implementation of setter 'XPathNSResolver.blink_jsObject' and getter 'XPathNSResolver.blink_jsObject'
-# TODO(terry): Dartium only because of implements instead of extends consider fixing by making blink_jsObject private
-#              with private wrap_jso and unwrap_jso in each library that delegates to the public wrap/unwrap_jso.
-LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: StaticWarning # Please triage this failure.
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: StaticWarning # Please triage this failure.
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: StaticWarning # Please triage this failure.
-LayoutTests/fast/xpath/attr-namespace_t01: StaticWarning # Please triage this failure.
-LayoutTests/fast/xpath/attr-namespace_t02: StaticWarning # Please triage this failure.
-LayoutTests/fast/xpath/node-name-case-sensitivity_t01: StaticWarning # Please triage this failure.
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: StaticWarning # Please triage this failure.
-LayoutTests/fast/xpath/py-dom-xpath/data_t01: StaticWarning # Please triage this failure.
-LayoutTests/fast/svg/getbbox_t01: StaticWarning # Please triage this failure.
-
 # co19 roll to Sep 29 2015 (3ed795ea02e022ef19c77cf1b6095b7c8f5584d0)
 Language/Classes/Abstract_Instance_Members/invocation_t03: MissingStaticWarning # Please triage this failure.
 Language/Classes/Abstract_Instance_Members/invocation_t04: MissingStaticWarning # Please triage this failure.
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 2d3d20f..2ca320e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -3233,18 +3233,13 @@
 LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
 LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-fillStyle-no-quirks-parsing_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-font-consistency_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-getImageData-largeNonintegralDimensions_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-lineDash-input-sequence_t01: RuntimeError # Please triage this failure
@@ -3261,70 +3256,15 @@
 LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError # Please triage this failure
@@ -3338,39 +3278,20 @@
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError, Timeout # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError, Timeout # Please triage this failure
+LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError, Timeout # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: Pass, RuntimeError # Please triage this failure
@@ -3418,7 +3339,6 @@
 LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError # Please triage this failure
@@ -3459,9 +3379,7 @@
 LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/dynamic-selector-list-pseudo_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError # Please triage this failure
@@ -3487,9 +3405,7 @@
 LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/sibling-selectors-dynamic_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError # Please triage this failure
@@ -3497,7 +3413,6 @@
 LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/css/style-sharing-type-and-readonly_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError # Please triage this failure
@@ -3523,7 +3438,6 @@
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # Please triage this failure
@@ -3548,22 +3462,19 @@
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: RuntimeError, Timeout # Please triage this failure
 LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/HTMLObjectElement/form/test1_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # Please triage this failure
@@ -3602,11 +3513,8 @@
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # Please triage this failure
@@ -3635,7 +3543,6 @@
 LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/dataset_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError # Please triage this failure
@@ -3871,7 +3778,6 @@
 LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # Issue 25941
 LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/loader/about-blank-hash-change_t01: Skip # Times out. Please triage this failure
@@ -3899,9 +3805,7 @@
 LayoutTests/fast/multicol/balance-unbreakable_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/break-properties_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/cssom-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/float-truncation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError # Please triage this failure
@@ -3913,7 +3817,6 @@
 LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/orphans-relayout_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError # Please triage this failure
@@ -4017,9 +3920,6 @@
 LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t02: RuntimeError # Please triage this failure
-LayoutTests/fast/tokenizer/entities_t03: RuntimeError # Please triage this failure
 LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/url/anchor_t01: RuntimeError # Please triage this failure
@@ -4102,8 +4002,6 @@
 LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/isContentEditable_A02_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
 LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
@@ -4144,7 +4042,6 @@
 LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError # Please triage this failure
 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/isContentEditable_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 76298ff..c550a6f 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -18,10 +18,14 @@
 [ $compiler == none && $runtime == dartium && $system == windows ]
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Issue 21605
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError # Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: Skip # Timesout Issue 26134
 
 [ $compiler == none && $runtime == dartium && $system != windows ]
 LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # co19-roll r761: Please triage this failure.
 
+[ $compiler == none && $runtime == dartium && $system == linux ]
+language/mixin_illegal_constructor_test/01: Skip # Issue 43
+
 [ $compiler == none && $runtime == dartium && ($system == windows || $system == linux) ]
 LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError # 45 roll webgl doesn't run on on windows/linux bots.
 LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError # 45 rollwebgl doesn't run on on windows/linux bots.
@@ -75,7 +79,6 @@
 LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -201,6 +204,9 @@
 Language/Libraries_and_Scripts/URIs/syntax_t14: RuntimeError # Please triage this failure.
 Language/Libraries_and_Scripts/URIs/syntax_t15: RuntimeError # Please triage this failure.
 Language/Metadata/before_variable_t01: RuntimeError # Please triage this failure.
+Language/Mixins/Mixin_Application/error_t01: Fail # co19 issue 43
+Language/Mixins/Mixin_Application/error_t02: Fail # co19 issue 43
+Language/Mixins/declaring_constructor_t01: Fail # co19 issue 43
 Language/Mixins/not_object_superclass_t01: Fail # Please triage this failure.
 Language/Mixins/reference_to_super_t01: Fail # Please triage this failure.
 Language/Statements/Assert/execution_t02: skip # co19 issue 734
@@ -562,10 +568,8 @@
 LayoutTests/fast/dynamic/insertAdjacentElement_t01: Skip # Timeout. co19-roll r786: Please triage this failure.
 LayoutTests/fast/dynamic/insertAdjacentHTML_t01: Pass, RuntimeError # co19 issue 11.
 LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/events/add-event-without-document_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Timeout # Dartium 45 roll. Issue 25754
 LayoutTests/fast/events/clipboard-clearData_t01: Skip # Timeout. co19-roll r786: Please triage this failure.
-LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: RuntimeError # Issue 22532
 LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Skip # Timeout. co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/div-focus_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -927,7 +931,6 @@
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/xpath/attr-namespace_t01: RuntimeError # Dartium JsInterop failure
 LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -1349,3 +1352,42 @@
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError #  45 Roll co19 test rewrite issue 25807
 WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/32
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-002_t01: RuntimeError # 45 roll issue https://github.com/dart-lang/co19/issues/33
+# Must fix failures below after JsInterop checkin.
+WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError # Issue 26134
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError # Issue 26134
+WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError # Issue 26134
+WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError # Issue 26134
+WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError # Issue 26134
+WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError # Issue 26134
+WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError # Issue 26134
+WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError # Issue 26134
+WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError # Issue 26134
+WebPlatformTest/dom/nodes/attributes/setAttribute_A01_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/Document/createElement-invalid-names_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/createDocumentType2_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/createElementNS_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/DOMException/prototype-object_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/Node/contains-method_t01: RuntimeError # Issue 26134
+LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # Issue 26134
+LayoutTests/fast/events/mutation-during-append-child_t01: RuntimeError # Issue 26134
+LayoutTests/fast/events/mutation-during-insert-before_t01: RuntimeError # Issue 26134
+LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: Skip # Issue 26134, timesout
+LibTest/html/Document/text_A01_t01: RuntimeError # Issue 26134
+LibTest/html/Document/insertBefore_A01_t01: RuntimeError # Issue 26134
+LibTest/html/Document/insertAllBefore_A01_t01: RuntimeError # Issue 26134
+LibTest/html/IFrameElement/insertBefore_A01_t01: RuntimeError # Issue 26134
+LibTest/html/IFrameElement/insertAllBefore_A01_t01: RuntimeError # Issue 26134
+LibTest/html/Element/text_A01_t01: RuntimeError # Issue 26134
+LibTest/html/Element/insertBefore_A01_t01: RuntimeError # Issue 26134
+LibTest/html/Element/insertAllBefore_A01_t01: RuntimeError # Issue 26134
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: Skip # Issue 26134, timeout
+html/cross_domain_iframe_test: RuntimeError # Issue 26134
diff --git a/tests/compiler/dart2js/analyze_api_test.dart b/tests/compiler/dart2js/analyze_api_test.dart
index 908ae11..e121190 100644
--- a/tests/compiler/dart2js/analyze_api_test.dart
+++ b/tests/compiler/dart2js/analyze_api_test.dart
@@ -19,6 +19,9 @@
  */
 // TODO(johnniwinther): Support canonical URIs as keys.
 const Map<String, List<String>> WHITE_LIST = const {
+  'sdk/lib/web_gl/dart2js/web_gl_dart2js.dart': const [
+    "is not defined for the class 'RenderingContext'", // Issue 26111
+  ],
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/analyze_helper.dart b/tests/compiler/dart2js/analyze_helper.dart
index 8db5912..70a1f22 100644
--- a/tests/compiler/dart2js/analyze_helper.dart
+++ b/tests/compiler/dart2js/analyze_helper.dart
@@ -17,6 +17,9 @@
 import 'package:compiler/src/source_file_provider.dart';
 import 'package:compiler/src/util/uri_extras.dart';
 
+/// Option for hiding whitelisted messages.
+const String HIDE_WHITELISTED = '--hide-whitelisted';
+
 /**
  * Map of whitelisted warnings and errors.
  *
@@ -34,12 +37,15 @@
   bool hasHint = false;
   bool hasErrors = false;
   bool lastWasWhitelisted = false;
+  bool showWhitelisted = true;
 
   Map<String, Map<dynamic/*String|MessageKind*/, int>> whiteListMap
       = new Map<String, Map<dynamic/*String|MessageKind*/, int>>();
+  List<MessageKind> skipList;
 
   CollectingDiagnosticHandler(
       Map<String, List/*<String|MessageKind>*/> whiteList,
+      this.skipList,
       SourceFileProvider provider)
       : super(provider) {
     whiteList.forEach((String file, List/*<String|MessageKind>*/ messageParts) {
@@ -85,6 +91,9 @@
     if (uri == null) {
       return false;
     }
+    if (skipList.contains(message.kind)) {
+      return true;
+    }
     String path = uri.path;
     for (String file in whiteListMap.keys) {
       if (path.contains(file)) {
@@ -113,6 +122,9 @@
       if (checkWhiteList(uri, message, text)) {
         // Suppress whitelisted warnings.
         lastWasWhitelisted = true;
+        if (showWhitelisted || verbose) {
+          super.report(message, uri, begin, end, text, kind);
+        }
         return;
       }
       hasWarnings = true;
@@ -121,6 +133,9 @@
       if (checkWhiteList(uri, message, text)) {
         // Suppress whitelisted hints.
         lastWasWhitelisted = true;
+        if (showWhitelisted || verbose) {
+          super.report(message, uri, begin, end, text, kind);
+        }
         return;
       }
       hasHint = true;
@@ -129,6 +144,9 @@
       if (checkWhiteList(uri, message, text)) {
         // Suppress whitelisted errors.
         lastWasWhitelisted = true;
+        if (showWhitelisted || verbose) {
+          super.report(message, uri, begin, end, text, kind);
+        }
         return;
       }
       hasErrors = true;
@@ -156,10 +174,17 @@
   TREE_SHAKING,
 }
 
+/// Analyzes the file(s) in [uriList] using the provided [mode] and checks that
+/// no messages (errors, warnings or hints) are emitted.
+///
+/// Messages can be generally allowed using [skipList] or on a per-file basis
+/// using [whiteList].
 Future analyze(List<Uri> uriList,
                Map<String, List/*<String|MessageKind>*/> whiteList,
                {AnalysisMode mode: AnalysisMode.ALL,
-                CheckResults checkResults}) async {
+                CheckResults checkResults,
+                List<String> options: const <String>[],
+                List<MessageKind> skipList: const <MessageKind>[]}) async {
   String testFileName =
       relativize(Uri.base, Platform.script, Platform.isWindows);
 
@@ -177,9 +202,9 @@
   var packageRoot =
       currentDirectory.resolve(Platform.packageRoot);
   var provider = new CompilerSourceFileProvider();
-  var handler = new CollectingDiagnosticHandler(whiteList, provider);
-  var options = <String>[Flags.analyzeOnly, '--categories=Client,Server',
-      Flags.showPackageWarnings];
+  var handler = new CollectingDiagnosticHandler(whiteList, skipList, provider);
+  options = <String>[Flags.analyzeOnly, '--categories=Client,Server',
+      Flags.showPackageWarnings]..addAll(options);
   switch (mode) {
     case AnalysisMode.URI:
     case AnalysisMode.MAIN:
@@ -191,6 +216,12 @@
     case AnalysisMode.TREE_SHAKING:
       break;
   }
+  if (options.contains(Flags.verbose)) {
+    handler.verbose = true;
+  }
+  if (options.contains(HIDE_WHITELISTED)) {
+    handler.showWhitelisted = false;
+  }
   var compiler = new CompilerImpl(
       provider,
       null,
@@ -212,12 +243,15 @@
 
   if (mode == AnalysisMode.URI) {
     for (Uri uri in uriList) {
+      print('Analyzing uri: $uri');
       await compiler.analyzeUri(uri);
     }
   } else if (mode != AnalysisMode.TREE_SHAKING) {
+    print('Analyzing libraries: $uriList');
     compiler.librariesToAnalyzeWhenRun = uriList;
     await compiler.run(null);
   } else {
+    print('Analyzing entry point: ${uriList.single}');
     await compiler.run(uriList.single);
   }
 
diff --git a/tests/compiler/dart2js/analyze_test_test.dart b/tests/compiler/dart2js/analyze_test_test.dart
index 5e28cf0..4a2321b 100644
--- a/tests/compiler/dart2js/analyze_test_test.dart
+++ b/tests/compiler/dart2js/analyze_test_test.dart
@@ -26,10 +26,6 @@
  */
 // TODO(johnniwinther): Support canonical URIs as keys.
 const Map<String, List/*<String|MessageKind>*/> WHITE_LIST = const {
-  // Several tests import mirrors; any of these might trigger the warning.
-  ".dart": const [
-      MessageKind.IMPORT_EXPERIMENTAL_MIRRORS,
-  ],
   "/test/src/util/": const [
       "Library 'package:async/async.dart' doesn't export a "
       "'ForkableStream' declaration.",
@@ -55,28 +51,50 @@
   "http_test.dart",
 ];
 
-main(List<String> arguments) {
-  bool verbose = arguments.contains('-v');
+const List<MessageKind> MESSAGE_SKIP_LIST = const <MessageKind>[
+  // TODO(johnniwinther): Support checking of this warning. (Issue 26132)
+  MessageKind.IMPORT_EXPERIMENTAL_MIRRORS,
+];
 
-  List<String> options = <String>[
-    Flags.analyzeOnly,
-    Flags.analyzeMain,
-    '--categories=Client,Server'];
-  if (verbose) {
+main(List<String> arguments) {
+  List<String> options = <String>[];
+  if (arguments.contains('-v') || arguments.contains(Flags.verbose)) {
     options.add(Flags.verbose);
   }
-  asyncTest(() async {
-    List<Uri> uriList = <Uri>[];
-    Directory dir =
-        new Directory.fromUri(Uri.base.resolve('tests/compiler/dart2js/'));
-    for (FileSystemEntity entity in dir.listSync(recursive: true)) {
-      if (entity is File && entity.path.endsWith('.dart')) {
-        Uri file = Uri.base.resolve(nativeToUriPath(entity.path));
-        if (!SKIP_LIST.any((skip) => file.path.contains(skip))) {
-          uriList.add(file);
+  List<Uri> uriList = <Uri>[];
+  for (String arg in arguments) {
+    if (!arg.startsWith('-')) {
+      for (String line in new File(arg).readAsLinesSync()) {
+        line = line.trim();
+        if (line.startsWith('Analyzing uri: ')) {
+          int filenameOffset = line.indexOf('tests/compiler/dart2js/');
+          if (filenameOffset != -1) {
+            uriList.add(Uri.base.resolve(
+                nativeToUriPath(line.substring(filenameOffset))));
+          }
         }
       }
     }
-    await analyze(uriList, WHITE_LIST, mode: AnalysisMode.URI);
+  }
+
+  asyncTest(() async {
+    if (uriList.isEmpty) {
+      Directory dir =
+          new Directory.fromUri(Uri.base.resolve('tests/compiler/dart2js/'));
+      for (FileSystemEntity entity in dir.listSync(recursive: true)) {
+        if (entity is File && entity.path.endsWith('.dart')) {
+          Uri file = Uri.base.resolve(nativeToUriPath(entity.path));
+          if (!SKIP_LIST.any((skip) => file.path.contains(skip))) {
+            uriList.add(file);
+          }
+        }
+      }
+    }
+    await analyze(
+        uriList,
+        WHITE_LIST,
+        mode: AnalysisMode.URI,
+        options: options,
+        skipList: MESSAGE_SKIP_LIST);
   });
 }
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index ec9c160..11a04b1 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -58,12 +58,18 @@
                 environment: environment,
                 packageConfig: packageConfig,
                 packagesDiscoveryProvider: findPackages)) {
-    scanner = new TestScanner(this);
-    resolver = new TestResolver(this, backend.constantCompilerTask);
     reporter = new TestDiagnosticReporter(this, super.reporter);
     test('Compiler');
   }
 
+  @override
+  ScannerTask createScannerTask() => new TestScanner(this);
+
+  @override
+  ResolverTask createResolverTask() {
+    return new TestResolver(this, backend.constantCompilerTask);
+  }
+
   Future<bool> run(Uri uri) {
     test('Compiler.run');
     return super.run(uri);
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 2d4862c..c08dbde 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -268,7 +268,7 @@
     return null;
   }
 
-  Future<Script> readScript(Spannable node, Uri uri) {
+  Future<Script> readScript(Uri uri, [Spannable spannable]) {
     SourceFile sourceFile = sourceFiles[uri.toString()];
     if (sourceFile == null) throw new ArgumentError(uri);
     return new Future.value(new Script(uri, uri, sourceFile));
diff --git a/tests/compiler/dart2js/serialization_analysis_test.dart b/tests/compiler/dart2js/serialization_analysis_test.dart
index e8c651d..19aedf7 100644
--- a/tests/compiler/dart2js/serialization_analysis_test.dart
+++ b/tests/compiler/dart2js/serialization_analysis_test.dart
@@ -242,6 +242,7 @@
       diagnosticHandler: diagnosticCollector,
       beforeRun: (Compiler compiler) {
         Deserializer deserializer = new Deserializer.fromText(
+            new DeserializationContext(),
             serializedData,
             const JsonSerializationDecoder());
         deserializer.plugins.add(compiler.backend.serialization.deserializer);
@@ -271,14 +272,14 @@
 }
 
 String serialize(Compiler compiler) {
-  Serializer serializer = new Serializer(const JsonSerializationEncoder());
+  Serializer serializer = new Serializer();
   serializer.plugins.add(compiler.backend.serialization.serializer);
   serializer.plugins.add(new WorldImpactSerializer(compiler.resolution));
 
   for (LibraryElement library in compiler.libraryLoader.libraries) {
     serializer.serialize(library);
   }
-  return serializer.toText();
+  return serializer.toText(const JsonSerializationEncoder());
 }
 
 const String WORLD_IMPACT_TAG = 'worldImpact';
diff --git a/tests/compiler/dart2js/serialization_library_test.dart b/tests/compiler/dart2js/serialization_library_test.dart
new file mode 100644
index 0000000..df59fbc
--- /dev/null
+++ b/tests/compiler/dart2js/serialization_library_test.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization_library_test;
+
+import 'dart:io';
+import 'memory_compiler.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common/names.dart';
+import 'package:compiler/src/constants/constructors.dart';
+import 'package:compiler/src/constants/expressions.dart';
+import 'package:compiler/src/dart_types.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/invariant.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/visitor.dart';
+import 'package:compiler/src/ordered_typeset.dart';
+import 'package:compiler/src/serialization/element_serialization.dart';
+import 'package:compiler/src/serialization/json_serializer.dart';
+import 'package:compiler/src/serialization/serialization.dart';
+
+import 'serialization_test.dart';
+
+main(List<String> arguments) {
+  // Ensure that we can print out constant expressions.
+  DEBUG_MODE = true;
+
+  Uri entryPoint;
+  String outPath;
+  int shardCount = 3;
+  bool prettyPrint = false;
+  for (String arg in arguments) {
+    if (arg.startsWith('--')) {
+      if (arg.startsWith('--out=')) {
+        outPath = arg.substring('--out='.length);
+      } else if (arg == '--pretty-print') {
+        prettyPrint = true;
+      } else if (arg.startsWith('--shards=')) {
+        shardCount = int.parse(arg.substring('--shards='.length));
+      } else {
+        print("Unknown option $arg");
+      }
+    } else {
+      if (entryPoint != null) {
+        print("Multiple entrypoints are not supported.");
+      }
+      entryPoint = Uri.parse(arg);
+    }
+  }
+  if (entryPoint == null) {
+    entryPoint = Uris.dart_core;
+  }
+  asyncTest(() async {
+    CompilationResult result = await runCompiler(
+        entryPoint: entryPoint, options: [Flags.analyzeAll]);
+    Compiler compiler = result.compiler;
+    testSerialization(compiler.libraryLoader.libraries,
+                      outPath: outPath,
+                      prettyPrint: prettyPrint,
+                      shardCount: shardCount);
+  });
+}
+
+void testSerialization(Iterable<LibraryElement> libraries1,
+                       {String outPath,
+                        bool prettyPrint,
+                        int shardCount: 3}) {
+  if (shardCount < 1 || shardCount > libraries1.length) {
+    shardCount = libraries1.length;
+  }
+  List<List<LibraryElement>> librarySplits = <List<LibraryElement>>[];
+  int offset = 0;
+  int shardSize = (libraries1.length / shardCount).ceil();
+  for (int shard = 0; shard < shardCount; shard++) {
+    List<LibraryElement> libraries = <LibraryElement>[];
+    for (int index = 0; index < shardSize; index++) {
+      if (offset + index < libraries1.length) {
+        libraries.add(libraries1.elementAt(offset + index));
+      }
+    }
+    librarySplits.add(libraries);
+    offset += shardSize;
+  }
+  print(librarySplits.join('\n'));
+  List<String> texts = <String>[];
+  for (int shard = 0; shard < shardCount; shard++) {
+    List<LibraryElement> libraries = librarySplits[shard];
+    Serializer serializer = new Serializer(
+        shouldInclude: (e) => libraries.contains(e.library));
+    for (LibraryElement library in libraries) {
+      serializer.serialize(library);
+    }
+    String text = serializer.toText(const JsonSerializationEncoder());
+    String outText = text;
+    if (prettyPrint) {
+      outText = serializer.prettyPrint();
+    }
+    if (outPath != null) {
+      String name = outPath;
+      String ext = '';
+      int dotPos = outPath.lastIndexOf('.');
+      if (dotPos != -1) {
+        name = outPath.substring(0, dotPos);
+        ext = outPath.substring(dotPos);
+      }
+      new File('$name$shard$ext').writeAsStringSync(outText);
+    } else if (prettyPrint) {
+      print(outText);
+    }
+    texts.add(text);
+  }
+  DeserializationContext deserializationContext =
+      new DeserializationContext();
+  for (int shard = 0; shard < shardCount; shard++) {
+    new Deserializer.fromText(
+        deserializationContext, texts[shard], const JsonSerializationDecoder());
+  }
+  List<LibraryElement> libraries2 = <LibraryElement>[];
+  for (LibraryElement library1 in libraries1) {
+    LibraryElement library2 =
+        deserializationContext.lookupLibrary(library1.canonicalUri);
+    if (library2 == null) {
+      throw new ArgumentError('No library ${library1.canonicalUri} found.');
+    }
+    checkLibraryContent('library1', 'library2', 'library', library1, library2);
+    libraries2.add(library2);
+  }
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/serialization_test.dart b/tests/compiler/dart2js/serialization_test.dart
index 3522c41..0f965a3 100644
--- a/tests/compiler/dart2js/serialization_test.dart
+++ b/tests/compiler/dart2js/serialization_test.dart
@@ -7,6 +7,7 @@
 import 'dart:io';
 import 'memory_compiler.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/constants/constructors.dart';
 import 'package:compiler/src/constants/expressions.dart';
 import 'package:compiler/src/dart_types.dart';
@@ -47,7 +48,7 @@
   }
   asyncTest(() async {
     CompilationResult result = await runCompiler(
-        entryPoint: entryPoint, options: ['--analyze-all']);
+        entryPoint: entryPoint, options: [Flags.analyzeAll]);
     Compiler compiler = result.compiler;
     testSerialization(compiler.libraryLoader.libraries,
                       outPath: outPath,
@@ -58,11 +59,11 @@
 void testSerialization(Iterable<LibraryElement> libraries1,
                        {String outPath,
                         bool prettyPrint}) {
-  Serializer serializer = new Serializer(const JsonSerializationEncoder());
+  Serializer serializer = new Serializer();
   for (LibraryElement library1 in libraries1) {
     serializer.serialize(library1);
   }
-  String text = serializer.toText();
+  String text = serializer.toText(const JsonSerializationEncoder());
   String outText = text;
   if (prettyPrint) {
     outText = serializer.prettyPrint();
@@ -74,6 +75,7 @@
   }
 
   Deserializer deserializer = new Deserializer.fromText(
+      new DeserializationContext(),
       text, const JsonSerializationDecoder());
   List<LibraryElement> libraries2 = <LibraryElement>[];
   for (LibraryElement library1 in libraries1) {
@@ -86,13 +88,14 @@
     libraries2.add(library2);
   }
 
-  Serializer serializer2 = new Serializer(const JsonSerializationEncoder());
+  Serializer serializer2 = new Serializer();
   for (LibraryElement library2 in libraries2) {
     serializer2.serialize(library2);
   }
-  String text2 = serializer2.toText();
+  String text2 = serializer2.toText(const JsonSerializationEncoder());
 
   Deserializer deserializer3 = new Deserializer.fromText(
+      new DeserializationContext(),
       text2, const JsonSerializationDecoder());
   for (LibraryElement library1 in libraries1) {
     LibraryElement library2 =
@@ -548,13 +551,28 @@
       Element member1 = element1.localLookup(name);
       Element member2 = element2.localLookup(name);
       if (member1 == null) {
-        print('Missing member for $member2 in\n ${members1.join('\n ')}');
-        continue;
+        String message =
+            'Missing member for $member2 in\n ${members1.join('\n ')}';
+        if (member2.isAbstractField) {
+          // TODO(johnniwinther): Ensure abstract fields are handled correctly.
+          print(message);
+          continue;
+        } else {
+          throw message;
+        }
       }
       if (member2 == null) {
-        print('Missing member for $member1 in\n ${members2.join('\n ')}');
-        continue;
+        String message =
+            'Missing member for $member1 in\n ${members2.join('\n ')}';
+        if (member1.isAbstractField) {
+          // TODO(johnniwinther): Ensure abstract fields are handled correctly.
+          print(message);
+          continue;
+        } else {
+          throw message;
+        }
       }
+      //print('Checking member ${member1} against ${member2}');
       visit(member1, member2);
     }
   }
@@ -621,6 +639,15 @@
         element1.interfaces.toList(),
         element2.interfaces.toList());
 
+    List<ConstructorElement> getConstructors(ClassElement cls) {
+      return cls.implementation.constructors.map((c) => c.declaration).toList();
+    }
+
+    checkElementLists(
+        element1, element2, 'constructors',
+        getConstructors(element1),
+        getConstructors(element2));
+
     visitMembers(element1, element2);
   }
 
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 021d7ba..4552337 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -107,9 +107,7 @@
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 list_as_map_test: Pass, Slow # TODO(kasperl): Please triage.
 
-[ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
-
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
+[ $compiler == dart2js && $runtime == safarimobilesim ]
 string_split_test: RuntimeError # Issue 21431
 
 [ $compiler == dart2js && $runtime == safarimobilesim ]
diff --git a/tests/corelib/double_parse_test.dart b/tests/corelib/double_parse_test.dart
index 6f7e8fb..9ea4569 100644
--- a/tests/corelib/double_parse_test.dart
+++ b/tests/corelib/double_parse_test.dart
@@ -1,6 +1,8 @@
 // Copyright (c) 2014 the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+// VMOptions=--no-use-field-guards
+// VMOptions=
 
 import "dart:math" show pow;
 import "package:expect/expect.dart";
diff --git a/tests/corelib/num_sign_test.dart b/tests/corelib/num_sign_test.dart
index d2ee968..3976f76 100644
--- a/tests/corelib/num_sign_test.dart
+++ b/tests/corelib/num_sign_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.
 // Test num.clamp.
+// VMOptions=--no-use-field-guards
+// VMOptions=
 
 import "package:expect/expect.dart";
 
diff --git a/tests/html/html.status b/tests/html/html.status
index c7df0fe..742f19d 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -7,16 +7,10 @@
 
 [ $compiler == none && ($runtime == dartium || $runtime == drt) ]
 
-js_array_test: Skip # Dartium JSInterop failure
 mirrors_js_typed_interop_test: Fail # Missing expected failure (Issue 25044)
 js_typed_interop_side_cast_exp_test: Fail, OK # tests dart2js-specific behavior.
 
-cross_domain_iframe_test: RuntimeError # Dartium JSInterop failure
-indexeddb_2_test: Fail # Dartium JSInterop failure. Identity preservation on array deferred copy.
-js_test/transferrables: RuntimeError # Dartium JSInterop failure
-js_test/JsArray: RuntimeError # Dartium JSInterop failure
 native_gc_test: Skip # Dartium JSInterop failure
-transferables_test: RuntimeError # Dartium JSInterop failure
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium ) ]
 worker_api_test: Fail # Issue 10223
@@ -64,6 +58,9 @@
 async_test: RuntimeError, OK  # Uses Isolate.spawn.
 isolates_test: RuntimeError, OK  # Uses Isolate.spawn.
 
+[ $compiler == none && ($runtime == drt || $runtime == dartium ) && $checked]
+cross_domain_iframe_test: RuntimeError # Issue 26134
+
 [ $compiler == none && ($runtime == drt || $runtime == dartium ) && $mode == debug ]
 websocket_test/websocket: Skip # Issue 17666
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Issue 17666
@@ -272,12 +269,12 @@
 media_stream_test/supported_MediaStreamEvent: Fail
 media_stream_test/supported_MediaStreamTrackEvent: Fail
 media_stream_test/supported_media: Fail
-performance_api_test/supported: Fail
 rtc_test/supported: Fail
 shadow_dom_test/supported: Fail
 speechrecognition_test/supported: Fail
 
 [ $runtime == safarimobilesim ]
+performance_api_test/supported: Fail
 indexeddb_1_test/supported: Fail
 element_types_test/supported_template: Fail
 xhr_test/json: Fail # Safari doesn't support JSON response type
diff --git a/tests/html/js_array_test.dart b/tests/html/js_array_test.dart
index 598cadf..753ced3 100644
--- a/tests/html/js_array_test.dart
+++ b/tests/html/js_array_test.dart
@@ -511,8 +511,10 @@
 
       expect(descriptor.value, equals("a"));
       expect(descriptor.writable, isTrue);
-      expect(descriptor.enumerable, isTrue);
-      expect(descriptor.configurable, isTrue);
+      // TODO(jacobr): commented out until https://github.com/dart-lang/sdk/issues/26128
+      // is fixed.
+      // expect(descriptor.enumerable, isTrue);
+      // expect(descriptor.configurable, isTrue);
 
       descriptor = getOwnPropertyDescriptor(list, "length");
       expect(descriptor.value, equals(2));
diff --git a/tests/html/js_test.dart b/tests/html/js_test.dart
index a902d59..ae9d9b3 100644
--- a/tests/html/js_test.dart
+++ b/tests/html/js_test.dart
@@ -240,34 +240,31 @@
       expect(identical(c1, c2), isTrue);
     });
 
-  /*
-    TODO(jacobr): enable this test when dartium supports maintaining proxy
-    equality.
-
     test('identical JS objects should have identical proxies', () {
       var o1 = new JsObject(context['Foo'], [1]);
       context['f1'] = o1;
       var o2 = context['f1'];
-      expect(equals(o1, o2), isTrue);
+      expect(identical(o1, o2), isTrue);
     });
 
+/*
+ TODO(jacobr): enable this test when dartium supports maintaining proxy
+    equality.
     test('identical Dart objects should have identical proxies', () {
       var o1 = new TestDartObject();
       expect(context.callMethod('identical', [o1, o1]), isTrue);
     });
-
-    test('identical Dart functions should have identical proxies', () {
-      var f1 = () => print("I'm a Function!");
-      expect(context.callMethod('identical', [f1, f1]), isTrue);
-    });
     */
 
-    // TODO(jacobr): switch from equals to indentical when dartium supports
-    // maintaining proxy equality.
-    test('identical JS functions should have equal proxies', () {
+    test('identical Dart functions should have identical proxies', () {
+      var f1 = allowInterop(() => print("I'm a Function!"));
+      expect(context.callMethod('identical', [f1, f1]), isTrue);
+    });
+
+    test('identical JS functions should have identical proxies', () {
       var f1 = context['Object'];
       var f2 = context['Object'];
-      expect(f1, equals(f2));
+      expect(identical(f1, f2), isTrue);
     });
 
     // TODO(justinfagnani): old tests duplicate checks above, remove
@@ -454,7 +451,7 @@
       expect(context['razzle'].apply([]), equals(42));
     });
 
-    test('JsFunction.apply on a function that uses "this"', () {
+    test('JsFunction.apply on a function that uses this', () {
       var object = new Object();
       expect(context['returnThis'].apply([], thisArg: object), same(object));
     });
@@ -517,7 +514,7 @@
     test('pass Array to JS', () {
       context['a'] = [1, 2, 3];
       expect(context.callMethod('isPropertyInstanceOf',
-          ['a', context['Array']]), isFalse);
+          ['a', context['Array']]), isTrue);
       var a = context['a'];
       expect(a, new isInstanceOf<List>());
       expect(a, isNot(new isInstanceOf<JsArray>()));
diff --git a/tests/html/wrapping_collections_test.dart b/tests/html/wrapping_collections_test.dart
index 176bcad..218d255 100644
--- a/tests/html/wrapping_collections_test.dart
+++ b/tests/html/wrapping_collections_test.dart
@@ -18,7 +18,7 @@
   });
 
   test("Access through dart:html", () {
-    var dartPerformance = wrap_jso(js.context['performance']);
+    var dartPerformance = js.JsNative.toTypedObject(js.context['performance']);
     var dartEntries = dartPerformance.getEntries();
     dartEntries.forEach((x) {
         expect(x is PerformanceEntry, isTrue);
diff --git a/tests/language/cha_deopt2_test.dart b/tests/language/cha_deopt2_test.dart
index 38274e0..d6b75ea 100644
--- a/tests/language/cha_deopt2_test.dart
+++ b/tests/language/cha_deopt2_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--optimization-counter-threshold=100 --no-background-compilation
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation --no-use-field-guards
 
 // Test lazy deoptimization at type checks with deferred loading.
 
diff --git a/tests/language/cha_deopt3_test.dart b/tests/language/cha_deopt3_test.dart
index 6dc964e..4c7db2b 100644
--- a/tests/language/cha_deopt3_test.dart
+++ b/tests/language/cha_deopt3_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--optimization-counter-threshold=100 --no-background-compilation
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation --no-use-field-guards
 
 // Test lazy deoptimization at type checks with interface implementation.
 
diff --git a/tests/language/const_redirect_skips_supertype_test.dart b/tests/language/const_redirect_skips_supertype_test.dart
new file mode 100644
index 0000000..c84aa62
--- /dev/null
+++ b/tests/language/const_redirect_skips_supertype_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// Since C redirects to C.named, it doesn't implicitly refer to B's
+// unnamed constructor.  Therefore there is no cycle.
+
+class B {
+  final x;
+  const B() : x = y;
+  const B.named() : x = null;
+}
+class C extends B {
+  const C() : this.named();
+  const C.named() : super.named();
+}
+const y = const C();
+
+main() {
+  print(y);
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 261ea59..766408b 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -153,10 +153,11 @@
 
 [ ($noopt || $compiler == precompiler || $compiler == dart2app) ]
 # Deferred loading happens eagerly
-regress_23408_test: RuntimeError
+regress_23408_test: Skip
 deferred_inheritance_constraints_test: Skip
-deferred_load_constants_test: Skip # multitest gets confused
-tearoff_basic_test: RuntimeError, Crash # Conflicting flag.
+deferred_global_test: Skip
+deferred_load_constants_test: Skip
+tearoff_basic_test: Skip
 
 vm/type_vm_test: RuntimeError # Expects line and column numbers
 vm/type_cast_vm_test: RuntimeError # Line number mismatch.
@@ -173,15 +174,11 @@
 generic_test: SkipByDesign # Requires checked mode.
 map_literal4_test: SkipByDesign # Requires checked mode.
 
-
 [ $runtime == dart_precompiled ]
-deferred_global_test: RuntimeError # Tries to produce a stack trace.
-ct_const2_test: Pass, Crash # Incompatible flag --compile_all
-hello_dart_test: Pass, Crash # Incompatible flag --compile_all
-
-implicit_closure_test: Pass, Crash # --use_slow_path
-
-deopt_inlined_function_lazy_test: Pass, Crash # Incompatible flag: --deoptimize-alot
+ct_const2_test: Skip # Incompatible flag: --compile_all
+hello_dart_test: Skip # Incompatible flag: --compile_all
+implicit_closure_test: Skip # Incompatible flag: --use_slow_path
+deopt_inlined_function_lazy_test: Skip # Incompatible flag: --deoptimize-alot
 
 [ $runtime == dart_product ]
 # Deferred loading happens eagerly (not sure why this works on precompiled code).
diff --git a/tests/language/nan_identical_test.dart b/tests/language/nan_identical_test.dart
index 5f171be..07b66f3 100644
--- a/tests/language/nan_identical_test.dart
+++ b/tests/language/nan_identical_test.dart
@@ -8,15 +8,14 @@
 
 import "package:expect/expect.dart";
 
-double uint64toDouble(int i) {
+double createOtherNAN() {
   var buffer = new Uint8List(8).buffer;
   var bdata = new ByteData.view(buffer);
-  bdata.setUint64(0, i);
-  return bdata.getFloat64(0);
-}
-
-double createOtherNAN() {
-  return uint64toDouble((1 << 64) - 2);
+  bdata.setFloat64(0, double.NAN);
+  bdata.setInt8(7, bdata.getInt8(7) ^ 1);  // Flip bit 0, big endian.
+  double result = bdata.getFloat64(0);
+  Expect.isTrue(result.isNaN);
+  return result;
 }
 
 main() {
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 6319860..b44b584c 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -105,7 +105,6 @@
 [ $runtime == safari || $runtime == safarimobilesim ]
 typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
 typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-mirrors/null_test: Fail # Issue 16831
 convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
 
 [ ($runtime == safari && $builder_tag == mac10_7)|| $runtime == safarimobilesim ]
@@ -262,6 +261,7 @@
 
 [ $compiler == dart2js && $runtime == safarimobilesim ]
 mirrors/mirrors_reader_test: SkipSlow # Times out. Issue 20806.
+mirrors/null_test: Fail # Issue 16831
 
 [ $compiler == dart2js && $runtime == jsshell ]
 async/schedule_microtask_test: Fail  # Preamble file does not correctly implement scheduleImmediate.
diff --git a/tests/lib/mirrors/mirror_in_static_init_test.dart b/tests/lib/mirrors/mirror_in_static_init_test.dart
index ae52922..471675e 100644
--- a/tests/lib/mirrors/mirror_in_static_init_test.dart
+++ b/tests/lib/mirrors/mirror_in_static_init_test.dart
@@ -19,7 +19,7 @@
 
 final int staticField = () {
   var lib = currentMirrorSystem().findLibrary(#mirror_in_static_init_test);
-  var lst = new List.from(lib.declarations.values);
+  var lst = new List.from(lib.declarations[#C].declarations.values);
   return 42;
 }();
 
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 7cd6257..730d959 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -116,7 +116,7 @@
 [ $compiler == dart2js && $cps_ir && $checked ]
 *: Skip # `assert` not implemented
 
-[ ($runtime == vm || $runtime == dart_product) && $mode == debug ]
+[ ($runtime == vm || $runtime == dart_product) ]
 precompilation_dart2js_test: Pass, Slow
 
 [ ($runtime == vm || $runtime == dart_product) && $arch == ia32 ]
@@ -127,6 +127,9 @@
 precompilation_test: SkipSlow
 precompilation_dart2js_test: SkipSlow
 
+[ ($runtime == vm || $runtime == dart_product) && ($arch == arm || $arch == arm64) ]
+io/file_stream_test: Skip # Issue 26109
+
 [ $compiler == dart2js && $jscl ]
 assert_test: RuntimeError, OK # Assumes unspecified fields on the AssertionError.
 deoptimization_test: RuntimeError, OK # Requires bigint.
diff --git a/tests/try/try.status b/tests/try/try.status
index d6d7ca7..f84f339 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -18,9 +18,11 @@
 web/incremental_compilation_update_test: SkipByDesign # Test uses eval, not supported in CSP mode.
 
 [ $runtime == safari || $runtime == safarimobilesim ]
-web/cursor_position_test: Fail # Issue 19836
 web/incremental_compilation_update_test: Skip # Safari may crash on this test.
 
+[ $runtime == safarimobilesim ]
+web/cursor_position_test: Fail # Issue 19836
+
 [ $runtime == safari && $checked ]
 # The following tests flake with this error:
 #   type '*Theme' is not a subtype of type 'Theme'
diff --git a/tools/VERSION b/tools/VERSION
index 4d89b8c..a42c595 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 16
 PATCH 0
-PRERELEASE 2
+PRERELEASE 3
 PRERELEASE_PATCH 0
diff --git a/tools/dartium/generate_app/generate_cached_patches.dart b/tools/dartium/generate_app/generate_cached_patches.dart
new file mode 100644
index 0000000..21ca4fb
--- /dev/null
+++ b/tools/dartium/generate_app/generate_cached_patches.dart
@@ -0,0 +1,18 @@
+// 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.
+
+import "dart:js" as js;
+
+void main() {
+  try {
+    var cached_files = js.createCachedPatchesFile();
+    print("$cached_files");
+  } catch (e) {
+    var workedElem = document.querySelector("#worked");
+    var failedElem = document.querySelector("#failed");
+    workedElem.style.dispay = 'none';
+    failedElem.style.visibility = 'inline';
+  }
+}
+
diff --git a/tools/dartium/generate_app/generate_cached_patches.html b/tools/dartium/generate_app/generate_cached_patches.html
new file mode 100644
index 0000000..e6c24b6
--- /dev/null
+++ b/tools/dartium/generate_app/generate_cached_patches.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+	<style>
+	    div {
+      background: #ffffff;
+      text-align: center;
+      width: 50%;
+      margin: 10% 10% 25% 25%;
+    }
+	
+    div#worked {
+      border: 5px solid green;
+      color: green;
+    }
+
+    div#failed {
+      border: 5px solid red;
+      color: red;
+    }
+
+	.cached_file_done {
+      font-family: arial;
+      font-size: 24pt;
+     }
+
+    .cached_file_name {
+      color: gray;
+      font-size: 16pt;
+      vertical-align: text-bottom;
+    }
+	</style>
+
+    <script async type="application/dart" src="generate_cached_patches.dart"></script>
+    <script async src="packages/browser/dart.js"></script>
+  </head> 
+	<body>
+      <div id=worked>
+        <span class=cached_file_done>Close Dartium</span><br/><br/>
+        <span class=cached_file_done>File: </span>
+        <span class=cached_file_name>sdk/lib/js/dartium/cached_patches.dart</span><br/><br/>
+        <span class=cached_file_done>GENERATED</span>
+      </div>
+      <div id=failed style="display: none;">
+        <span class=cached_file_done>FAILED</span><br/><br/>
+        <span class=cached_file_done>File: </span>
+        <span class=cached_file_name>sdk/lib/js/dartium/cached_patches.dart</span><br/><br/>
+        <span class=cached_file_done>NOT GENERATED</span>
+      </div>
+    </body>
+</html>
+
diff --git a/tools/dartium/generate_patches.sh b/tools/dartium/generate_patches.sh
new file mode 100755
index 0000000..ec2011a
--- /dev/null
+++ b/tools/dartium/generate_patches.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+#
+
+set -x
+
+#   generate_patches.sh [systems]
+#
+# Convenience script to generate patches for JsInterop under Dartium.  Do not call from build steps or tests
+# - call fremontcutbuilder and dartdomgenerator instead. Do not add 'real'
+# functionality here - change the python code instead.
+#
+# I find it essential to generate all the systems so I know if I am breaking
+# other systems.  My habit is to run:
+#
+#   ./go.sh
+
+# 1. After running go.sh libraries in sdk/lib may change.
+# 2. Build Dartium.
+# 3. Run this script and sdk/lib/js/dartium/cached_patches will be created.
+# 4. Rebuild Dartium.
+# 5. Commit files in sdk/lib
+
+LOCATION_DARTIUM="../../../out/Release"
+DARTIUM="$LOCATION_DARTIUM"
+
+DART_APP_LOCATION="file://"$PWD"/generate_app/generate_cached_patches.html"
+DARTIUM_ARGS=" --user-data-dir=out --disable-web-security --no-sandbox --enable-logging=stderr"
+CACHED_PATCHES_FILE=""$PWD"/../../sdk/lib/js/dartium/cached_patches.dart"
+
+if [[ "$1" != "" ]] ; then
+  DARTIM="$1"
+fi
+
+cmd=""$DARTIUM"/chrome "$DARTIUM_ARGS" "$DART_APP_LOCATION" 3>&1 1>&2- 2>&3 | \
+  (sed -n '/START_OF_CACHED_PATCHES/,/END_OF_CACHED_PATCHES/p') > "$CACHED_PATCHES_FILE""
+
+reset && eval "${cmd}"
+
+
diff --git a/tools/deps/dartium.deps/DEPS b/tools/deps/dartium.deps/DEPS
index 7187fd1..eea84da 100644
--- a/tools/deps/dartium.deps/DEPS
+++ b/tools/deps/dartium.deps/DEPS
@@ -9,7 +9,7 @@
 
 vars.update({
   "dartium_chromium_commit": "b16942297fc65fd478c6f46afd1c3aaecde77009",
-  "dartium_webkit_commit": "bf6d7afefd0ed68cae4a595a8fb8eea089303326",
+  "dartium_webkit_commit": "2223637e68ed9a95ee9bf07c2e597262e75f4b0c",
   "chromium_base_revision": "338390",
 
   # We use mirrors of all github repos to guarantee reproducibility and
@@ -53,6 +53,7 @@
   "pub_rev": "@9d707158fedc86fc2b02f62cdfe804902b098d9d",
   "pub_semver_tag": "@1.2.0",
   "quiver_tag": "@0.21.4",
+  "root_certificates_rev": "@aed07942ce98507d2be28cbd29e879525410c7fc",
   "shelf_rev": "@1e87b79b21ac5e6fa2f93576d6c06eaa65285ef4",
   "shelf_web_socket_rev": "@ff170cec2c0e4e5722cdf47c557be63b5035a602",
   "source_span_rev": "@42501132e43599a151ba6727d340e44442f86c05",
@@ -64,7 +65,7 @@
   "watcher_tag": "@0.9.5",
   "yaml_rev": "@563a5ffd4a800a2897b8f4dd6b19f2a370df2f2b",
   "zlib_rev": "@c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
-  "web_components_rev": "@0e636b534d9b12c9e96f841e6679398e91a986ec",
+  "web_components_rev": "@6349e09f9118dce7ae1b309af5763745e25a9d61",
   "WebCore_rev": "@a86fe28efadcfc781f836037a80f27e22a5dad17",
 
   "co19_rev": "@3ed795ea02e022ef19c77cf1b6095b7c8f5584d0",
@@ -137,6 +138,9 @@
       Var("chromium_git")
       + "/external/github.com/google/quiver-dart.git"
       + Var("quiver_tag"),
+  "src/dart/third_party/root_certificates":
+      (Var("github_mirror") % "root_certificates")
+      + Var("root_certificates_rev"),
   "src/dart/third_party/pkg/shelf":
       (Var("github_mirror") % "shelf") + Var("shelf_rev"),
   "src/dart/third_party/pkg/shelf_web_socket":
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 5b936a6..123447d 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -5181,44 +5181,6 @@
     },
     "WebGLRenderingContext": {
       "members": {
-        "bufferData": [
-          "/**",
-          "   * Buffers the specified data.",
-          "   *",
-          "   * The [bufferData] method is provided for WebGL API compatibility reasons, but",
-          "   * it is highly recommended that you use [bufferDataTyped] or [bufferByteData]",
-          "   * depending on your purposes.",
-          "   */"
-        ],
-        "bufferSubData": [
-          "/**",
-          "   * Buffers the specified subset of data.",
-          "   *",
-          "   * The [bufferSubData] method is provided for WebGL API compatibility reasons, but",
-          "   * it is highly recommended that you use [bufferSubDataTyped] or [bufferSubByteData]",
-          "   * depending on your purposes.",
-          "   */"
-        ],
-        "texImage2D": [
-          "/**",
-          "   * Updates the currently bound texture to [data].",
-          "   *",
-          "   * The [texImage2D] method is provided for WebGL API compatibility reasons, but it",
-          "   * is highly recommended that you use [texImage2DUntyped] or [texImage2DTyped]",
-          "   * (or for more specificity, the more specialized [texImage2DImageData],",
-          "   * [texImage2DCanvas], [texImage2DVideo]).",
-          "   */"
-        ],
-        "texSubImage2D": [
-          "/**",
-          "   * Updates a sub-rectangle of the currently bound texture to [data].",
-          "   *",
-          "   * The [texSubImage2D] method is provided for WebGL API compatibility reasons, but it",
-          "   * is highly recommended that you use [texSubImage2DUntyped] or [texSubImage2DTyped]",
-          "   * (or for more specificity, the more specialized [texSubImage2DImageData],",
-          "   * [texSubImage2DCanvas], [texSubImage2DVideo]).",
-          "   */"
-        ]
       }
     }
   },
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index a7863c4..3437c02 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -16927,12 +16927,24 @@
       "blitFramebuffer": {
         "support_level": "untriaged"
       },
+      "bufferByteData": {
+        "support_level": "untriaged"
+      },
       "bufferData": {
         "support_level": "untriaged"
       },
+      "bufferDataTyped": {
+        "support_level": "untriaged"
+      },
+      "bufferSubByteData": {
+        "support_level": "untriaged"
+      },
       "bufferSubData": {
         "support_level": "untriaged"
       },
+      "bufferSubDataTyped": {
+        "support_level": "untriaged"
+      },
       "canvas": {
         "support_level": "untriaged"
       },
@@ -17365,6 +17377,18 @@
       "texImage2D": {
         "support_level": "untriaged"
       },
+      "texImage2DCanvas": {
+        "support_level": "untriaged"
+      },
+      "texImage2DImage": {
+        "support_level": "untriaged"
+      },
+      "texImage2DImageData": {
+        "support_level": "untriaged"
+      },
+      "texImage2DVideo": {
+        "support_level": "untriaged"
+      },
       "texImage3D": {
         "support_level": "untriaged"
       },
@@ -17383,6 +17407,18 @@
       "texSubImage2D": {
         "support_level": "untriaged"
       },
+      "texSubImage2DCanvas": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2DImage": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2DImageData": {
+        "support_level": "untriaged"
+      },
+      "texSubImage2DVideo": {
+        "support_level": "untriaged"
+      },
       "texSubImage3D": {
         "support_level": "untriaged"
       },
diff --git a/tools/dom/scripts/css_code_generator.py b/tools/dom/scripts/css_code_generator.py
index 74de8e4..ef7555a 100644
--- a/tools/dom/scripts/css_code_generator.py
+++ b/tools/dom/scripts/css_code_generator.py
@@ -154,7 +154,7 @@
 $if DARTIUM
   bool _hasProperty(String propertyName) =>
   $if JSINTEROP
-      _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(unwrap_jso(this), propertyName) != null;
+      _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(this, propertyName);
   $else
       _blink.BlinkCSSStyleDeclaration.$__propertyQuery___Callback_1(this, propertyName);
   $endif
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index b528141..c0315df2 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -234,6 +234,25 @@
   _logger.info('Updating Css Properties.')
   css_code_generator.GenerateCssTemplateFile()
 
+CACHED_PATCHES = """
+// START_OF_CACHED_PATCHES
+// 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.
+
+// DO NOT EDIT GENERATED FILE.
+
+library cached_patches;
+
+var cached_patches = {
+    /********************************************************
+     *****                                              *****
+     *****  MUST RUN tools/dartium/generate_patches.sh  *****
+     *****                                              *****
+     ********************************************************/
+};
+"""
+
 def main():
   parser = optparse.OptionParser()
   parser.add_option('--parallel', dest='parallel',
@@ -327,6 +346,14 @@
           os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name),
           os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dartium'))
 
+    # Blow away the cached_patches.dart needs to be re-generated for Dartium
+    # see tools/dartium/generate_patches.sh
+    cached_patches_filename = os.path.join('..', '..', '..', 'sdk', 'lib', 'js', 'dartium',
+                                           'cached_patches.dart')
+    cached_patches = open(cached_patches_filename, 'w')
+    cached_patches.write(CACHED_PATCHES);
+    cached_patches.close()
+
   if '_blink' in systems:
     _logger.info('Generating dartium _blink file.')
     file_generation_start_time = time.time()
diff --git a/tools/dom/scripts/generate_blink_file.py b/tools/dom/scripts/generate_blink_file.py
index 6f274da..4beb0a5 100644
--- a/tools/dom/scripts/generate_blink_file.py
+++ b/tools/dom/scripts/generate_blink_file.py
@@ -7,9 +7,85 @@
 """Generates sdk/lib/_blink/dartium/_blink_dartium.dart file."""
 
 import os
-
+from sets import Set
 from generator import AnalyzeOperation, AnalyzeConstructor
 
+# This is list of all methods with native c++ implementations
+# If performing a dartium merge, the best practice is to comment out this list,
+# ensure everything runs, and then uncomment this list which might possibly
+# introduce breaking changes due to changes to these method signatures.
+_js_custom_members = Set([
+    'Document.createElement',
+    'Element.id',
+    'Element.tagName',
+    'Element.className',
+    'Element.setAttribute',
+    'Element.getAttribute',
+    # Consider adding this method so there is a fast path to access only
+    # element children.
+    # 'NonDocumentTypeChildNode.nextElementSibling',
+    'Node.appendChild', # actually not removed, just native implementation.
+    'Node.cloneNode',
+    'Node.insertBefore',    
+    'Node.lastChild',
+    'Node.firstChild',
+    'Node.parentElement',
+    'Node.parentNode',
+    'Node.childNodes',
+    'Node.removeChild',
+    'Node.contains',
+    'Node.nextSibling',
+    'Node.previousSibling',
+    'ChildNode.remove',
+    'Document.createTextNode',
+    'Window.location',
+    'Location.href',
+    'Node.querySelector',
+
+    'HTMLElement.hidden',
+    'HTMLElement.style',
+    'Element.attributes',
+    'Window.innerWidth',
+
+    'NodeList.length',
+    'NodeList.item',
+    'ParentNode.children',
+    'ParentNode.firstElementChild',
+    'ParentNode.lastElementChild',
+    'Event.target',
+    'MouseEvent.clientY',
+    'MouseEvent.clientX',
+
+    'Node.nodeType',
+    'Node.textContent',
+    
+    'HTMLCollection.length',
+    'HTMLCollection.item',
+    'Node.lastElementChild',
+    'Node.firstElementChild',
+    'HTMLElement_tabIndex',
+
+    'Element.clientWidth',
+    'Element.clientHeight',
+    'Document.body',
+    'Element.removeAttribute',
+    'Element.getBoundingClientRect',
+    'CSSStyleDeclaration.getPropertyValue',
+    'CSSStyleDeclaration.setProperty',
+    'CSSStyleDeclaration.__propertyQuery__',
+
+    # TODO(jacobr): consider implementing these methods as well as they show
+    # up in benchmarks for some sample applications.
+    #'Document.createEvent',
+    #'Document.initEvent',
+    #'EventTarget.dispatchEvent',
+     ])
+
+# Uncomment out this line  to short circuited native methods and run all of
+# dart:html through JS interop except for createElement which is slightly more
+# tightly natively wired.
+# _js_custom_members = Set([])
+
 HEADER = """/* Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
  * for details. All rights reserved. Use of this source code is governed by a
  * BSD-style license that can be found in the LICENSE file.
@@ -50,13 +126,14 @@
 
   static register(document, tag, customType, extendsTagName) native "Utils_register";
 
-  static createElement(document, tagName) native "Utils_createElement";
+  // Defines an interceptor if there is an appropriate JavaScript prototype to define it on.
+  // In any case, returns a typed JS wrapper compatibile with dart:html and the new
+  // typed JS Interop.
+  static defineInterceptorCustomElement(jsObject, Type type) native "Utils_defineInterceptorCustomElement";
+  static setInstanceInterceptor(o, Type type, {bool customElement: false}) native "Utils_setInstanceInterceptor";
 
-  static constructElement(element_type, jsObject) native "Utils_constructor_create";
-
+  // This method will throw if the element isn't actually a real Element.
   static initializeCustomElement(element) native "Utils_initializeCustomElement";
-
-  static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
 }
 
 class Blink_DOMWindowCrossFrame {
@@ -106,9 +183,63 @@
 }
 
 // Calls through JsNative but returns DomException instead of error strings.
+class Stats {
+  Stats(this.name) {
+    counts = new Map<String, int>();
+  }
+
+  String name;
+  Map<String, int> counts;
+  clear() {
+    counts.clear();
+  }
+
+  track(String v) {
+    counts[v] = counts.putIfAbsent(v, ()=> 0) + 1;
+  }
+  toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('================');
+    sb.write('$name ${counts.length}');
+    var keys = counts.keys.toList();
+    keys.sort((a,b) => counts[b].compareTo(counts[a]));
+    for (var key in keys) {
+      print("$key => ${counts[key]}");
+    }
+    sb.write('---------------');
+    sb.write('================');
+    return sb;
+  }
+}
+
+bool TRACK_STATS = true;
+dumpStats() {
+  print("------------ STATS ----------------");
+  print(Blink_JsNative_DomException.getPropertyStats.toString()); 
+  print(Blink_JsNative_DomException.setPropertyStats.toString());
+  print(Blink_JsNative_DomException.callMethodStats.toString());
+  print(Blink_JsNative_DomException.constructorStats.toString());
+  print("-----------------------------------");
+}
+
+clearStats() {
+  Blink_JsNative_DomException.getPropertyStats.clear();
+  Blink_JsNative_DomException.setPropertyStats.clear();
+  Blink_JsNative_DomException.callMethodStats.clear();  
+  Blink_JsNative_DomException.constructorStats.clear();  
+}
+
 class Blink_JsNative_DomException {
-  static getProperty(js.JsObject o, name) {
+  static var getPropertyStats = new Stats('get property');
+  static var setPropertyStats = new Stats('set property');
+  static var callMethodStats = new Stats('call method');
+  static var constructorStats = new Stats('constructor');
+
+  static var constructors = new Map<String, dynamic>();
+
+  static getProperty(o, String name) {
     try {
+      if (TRACK_STATS) getPropertyStats.track(name);
       return js.JsNative.getProperty(o, name);
     } catch (e) {
       // Re-throw any errors (returned as a string) as a DomException.
@@ -116,8 +247,51 @@
     }
   }
 
-  static callMethod(js.JsObject o, String method, List args) {
+  static propertyQuery(o, String name) {
     try {
+      if (TRACK_STATS) getPropertyStats.track('__propertyQuery__');
+      return js.JsNative.getProperty(o, name);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static callConstructor0(String name) {
+    try {
+      if (TRACK_STATS) constructorStats.track(name);
+      var constructor = constructors.putIfAbsent(name, () => js.context[name]);
+      return js.JsNative.callConstructor0(constructor);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static callConstructor(String name, List args) {
+    try {
+      if (TRACK_STATS) constructorStats.track(name);
+      var constructor = constructors.putIfAbsent(name, () => js.context[name]);
+      return js.JsNative.callConstructor(constructor, args);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static setProperty(o, String name, value) {
+    try {
+      if (TRACK_STATS) setPropertyStats.track(name);
+      return js.JsNative.setProperty(o, name, value);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new DomException.jsInterop(e);
+    }
+  }
+
+  static callMethod(o, String method, List args) {
+    try {
+      if (TRACK_STATS) callMethodStats.track(method);
       return js.JsNative.callMethod(o, method, args);
     } catch (e) {
       // Re-throw any errors (returned as a string) as a DomException.
@@ -137,38 +311,73 @@
 """
 
 #(interface_name)
-CONSTRUCTOR_0 = '  constructorCallback_0_() => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "%s"), []);\n\n'
+
+#
+CONSTRUCTOR_0 = ['  constructorCallback_0_()',
+                 ' => Blink_JsNative_DomException.callConstructor0("%s");\n\n',
+                 ' native "Blink_Constructor_%s";\n\n']
 
 #(argument_count, arguments, interface_name, arguments)
-CONSTRUCTOR_ARGS = '  constructorCallback_%s_(%s) => new js.JsObject(Blink_JsNative_DomException.getProperty(js.context, "%s"), [%s]);\n\n'
+CONSTRUCTOR_ARGS = ['  constructorCallback_%s_(%s)',
+   ' => Blink_JsNative_DomException.callConstructor("%s", [%s]);\n\n',
+   ' native "Blink_Constructor_Args_%s" /* %s */;\n\n']
 
 #(attribute_name, attribute_name)
-ATTRIBUTE_GETTER = '  %s_Getter_(mthis) => Blink_JsNative_DomException.getProperty(mthis, "%s");\n\n'
-ATTRIBUTE_SETTER = '  %s_Setter_(mthis, __arg_0) => mthis["%s"] = __arg_0;\n\n'
+ATTRIBUTE_GETTER = ['  %s_Getter_(mthis)',
+                    ' => Blink_JsNative_DomException.getProperty(mthis /* %s */, "%s");\n\n',
+                    ' native "Blink_Getter_%s_%s";\n\n'
+                    ]
+
+ATTRIBUTE_SETTER = ['  %s_Setter_(mthis, __arg_0)',
+                    ' => Blink_JsNative_DomException.setProperty(mthis /* %s */, "%s", __arg_0);\n\n',
+                    ' native "Blink_Setter_%s_%s";\n\n'
+                    ]
 
 #(operation_name, operationName)
-OPERATION_0 = '  %s_Callback_0_(mthis) => Blink_JsNative_DomException.callMethod(mthis, "%s", []);\n\n'
+OPERATION_0 = ['  %s_Callback_0_(mthis)',
+               ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", []);\n\n',
+               ' native "Blink_Operation_0_%s_%s";\n\n'
+               ]
 
 # getter, setter, deleter and propertyQuery code
-OPERATION_1 = '  $%s_Callback_1_(mthis, __arg_0) => Blink_JsNative_DomException.callMethod(mthis, "%s", [__arg_0]);\n\n'
-OPERATION_2 = '  $%s_Callback_2_(mthis, __arg_0, __arg_1) => Blink_JsNative_DomException.callMethod(mthis, "%s", [__arg_0, __arg_1]);\n\n'
-OPERATION_PQ = '  $%s_Callback_1_(mthis, __arg_0) => mthis[__arg_0];\n\n'
+OPERATION_1 = ['  $%s_Callback_1_(mthis, __arg_0)',
+               ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [__arg_0]);\n\n',
+               ' native "Blink_Operation_1_%s_%s";\n\n'
+               ]
+
+OPERATION_2 = ['  $%s_Callback_2_(mthis, __arg_0, __arg_1)',
+               ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [__arg_0, __arg_1]);\n\n',
+               ' native "Blink_Operation_2_%s_%s";\n\n']
+
+OPERATION_PQ = ['  $%s_Callback_1_(mthis, __arg_0)',
+                ' => Blink_JsNative_DomException.propertyQuery(mthis, __arg_0); /* %s */ \n\n',
+                ' native "Blink_Operation_PQ_%s";\n\n']
 
 #(operation_name, argument_count, arguments, operation_name, arguments)
 ARGUMENT_NUM = "__arg_%s"
-OPERATION_ARGS = '  %s_Callback_%s_(mthis, %s) => Blink_JsNative_DomException.callMethod(mthis, "%s", [%s]);\n\n'
+OPERATION_ARGS = ['  %s_Callback_%s_(mthis, %s)',
+                  ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [%s]);\n\n',
+                  ' native "Blink_Operation_%s_%s"; /* %s */\n\n']
+
+
 
 # get class property to make static call.
 CLASS_STATIC = 'Blink_JsNative_DomException.getProperty(js.context, "%s")'
 
 # name, classname_getproperty, name
-STATIC_ATTRIBUTE_GETTER = '  %s_Getter_() => Blink_JsNative_DomException.getProperty(%s, "%s");\n\n'
+STATIC_ATTRIBUTE_GETTER = ['  %s_Getter_()',
+                           ' => Blink_JsNative_DomException.getProperty(%s /* %s */, "%s");\n\n',
+                           ' /* %s */ native "Blink_Static_getter_%s_%s"']
 
 # name, classname_getproperty, name
-STATIC_OPERATION_0 = '  %s_Callback_0_() => Blink_JsNative_DomException.callMethod(%s, "%s", []);\n\n'
+STATIC_OPERATION_0 = ['  %s_Callback_0_()',
+                      ' => Blink_JsNative_DomException.callMethod(%s /* %s */, "%s", []);\n\n',
+                      ' /* %s */ native "Blink_Static_Operation_0_%s_%s']
 
 # name, argsCount, args, classname_getproperty, name, args
-STATIC_OPERATION_ARGS = '  %s_Callback_%s_(%s) => Blink_JsNative_DomException.callMethod(%s, "%s", [%s]);\n\n'
+STATIC_OPERATION_ARGS = ['  %s_Callback_%s_(%s)',
+                         ' => Blink_JsNative_DomException.callMethod(%s /* %s */, "%s", [%s]);\n\n',
+                         ' /* %s */ native "Blink_Static_Operations_%s_%s" /* %s */ \n\n']
 
 CLASS_DEFINITION_END = """}
 
@@ -197,6 +406,27 @@
 def rename_constructor(name):
   return constructor_renames[name] if name in constructor_renames else name
 
+
+def _Find_Match(interface_id, member, member_prefix, candidates):
+  member_name = interface_id + '.' + member
+  if member_name in candidates:
+    return member_name
+  member_name = interface_id + '.' + member_prefix + member
+  if member_name in candidates:
+    return member_name
+  member_name = interface_id + '.*'
+  if member_name in candidates:
+    return member_name
+
+def _Is_Native(interface, member):
+  return _Find_Match(interface, member, '', _js_custom_members)
+
+def Select_Stub(template, is_native):
+  if is_native:
+    return template[0] + template[2]
+  else:
+    return template[0] + template[1]
+
 def Generate_Blink(output_dir, database, type_registry):
   blink_filename = os.path.join(output_dir, '_blink_dartium.dart')
   blink_file = open(blink_filename, 'w')
@@ -226,7 +456,7 @@
       _Emit_Blink_Constructors(blink_file, analyzed_constructors)
     elif 'Constructor' in interface.ext_attrs:
       # Zero parameter constructor.
-      blink_file.write(CONSTRUCTOR_0 % rename_constructor(name))
+      blink_file.write(Select_Stub(CONSTRUCTOR_0, _Is_Native(name, 'constructor')) % rename_constructor(name))
 
     _Process_Attributes(blink_file, interface, interface.attributes)
     _Process_Operations(blink_file, interface, interface.operations)
@@ -250,27 +480,29 @@
 
   for callback_index in range(arg_min_count, arg_max_count):
     if callback_index == 0:
-      blink_file.write(CONSTRUCTOR_0 % (rename_constructor(name)))
+      blink_file.write(Select_Stub(CONSTRUCTOR_0, _Is_Native(name, 'constructor')) % (rename_constructor(name)))
     else:
       arguments = []
       for i in range(0, callback_index):
         arguments.append(ARGUMENT_NUM % i)
       argument_list = ', '.join(arguments)
-      blink_file.write(CONSTRUCTOR_ARGS % (callback_index, argument_list, rename_constructor(name), argument_list))
+      blink_file.write(
+        Select_Stub(CONSTRUCTOR_ARGS, _Is_Native(name, 'constructor')) % (callback_index, argument_list, rename_constructor(name), argument_list))
 
 def _Process_Attributes(blink_file, interface, attributes):
   # Emit an interface's attributes and operations.
   for attribute in sorted(attributes, ConstantOutputOrder):
     name = attribute.id
+    is_native = _Is_Native(interface.id, name)
     if attribute.is_read_only:
       if attribute.is_static:
         class_property = CLASS_STATIC % interface.id
-        blink_file.write(STATIC_ATTRIBUTE_GETTER % (name, class_property, name))
+        blink_file.write(Select_Stub(STATIC_ATTRIBUTE_GETTER, is_native) % (name, class_property, interface.id, name))
       else:
-        blink_file.write(ATTRIBUTE_GETTER % (name, name))
+        blink_file.write(Select_Stub(ATTRIBUTE_GETTER, is_native) % (name, interface.id, name))
     else:
-      blink_file.write(ATTRIBUTE_GETTER % (name, name))
-      blink_file.write(ATTRIBUTE_SETTER % (name, name))
+      blink_file.write(Select_Stub(ATTRIBUTE_GETTER, is_native) % (name, interface.id, name))
+      blink_file.write(Select_Stub(ATTRIBUTE_SETTER, is_native) % (name, interface.id, name))
 
 def _Process_Operations(blink_file, interface, operations):
   analyzeOperations = []
@@ -292,6 +524,7 @@
   analyzed = AnalyzeOperation(interface, analyzeOperations)
   (arg_min_count, arg_max_count) = generate_parameter_entries(analyzed.param_infos)
   name = analyzed.js_name
+  is_native = _Is_Native(interface.id, name)
 
   operation = analyzeOperations[0]
   if (name.startswith('__') and \
@@ -299,13 +532,13 @@
        'setter' in operation.specials or \
        'deleter' in operation.specials)):
     if name == '__propertyQuery__':
-      blink_file.write(OPERATION_PQ % (name))
+      blink_file.write(Select_Stub(OPERATION_PQ, is_native) % (name, interface.id))
     else:
       arg_min_count = arg_max_count
       if arg_max_count == 2:
-        blink_file.write(OPERATION_1 % (name, name))
+        blink_file.write(Select_Stub(OPERATION_1, is_native) % (name, interface.id, name))
       elif arg_max_count == 3:
-        blink_file.write(OPERATION_2 % (name, name))
+        blink_file.write(Select_Stub(OPERATION_2, is_native) % (name, interface.id, name))
       else:
         print "FATAL ERROR: _blink emitter operator %s.%s" % (interface.id, name)
         exit
@@ -316,9 +549,9 @@
     if callback_index == 0:
       if operation.is_static:
         class_property = CLASS_STATIC % interface.id
-        blink_file.write(STATIC_OPERATION_0 % (name, class_property, name))
+        blink_file.write(Select_Stub(STATIC_OPERATION_0, is_native) % (name, class_property, interface.id, name))
       else:
-        blink_file.write(OPERATION_0 % (name, name))
+        blink_file.write(Select_Stub(OPERATION_0, is_native) % (name, interface.id, name))
     else:
       arguments = []
       for i in range(0, callback_index):
@@ -326,6 +559,6 @@
       argument_list = ', '.join(arguments)
       if operation.is_static:
         class_property = CLASS_STATIC % interface.id
-        blink_file.write(STATIC_OPERATION_ARGS % (name, callback_index, argument_list, class_property, name, argument_list))
+        blink_file.write(Select_Stub(STATIC_OPERATION_ARGS, is_native) % (name, callback_index, argument_list, class_property, interface.id, name, argument_list))
       else:
-        blink_file.write(OPERATION_ARGS % (name, callback_index, argument_list, name, argument_list))
+        blink_file.write(Select_Stub(OPERATION_ARGS, is_native) % (name, callback_index, argument_list, interface.id, name, argument_list))
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 7e6fe8b..90f8b34 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -543,29 +543,28 @@
         type_id = p.type_id
         # Unwrap the type to get the JsObject if Type is:
         #
-        #    - known IDL type
         #    - type_id is None then it's probably a union type or overloaded
         #      it's a dynamic/any type
         #    - type is Object
         #
-        # JsObject maybe stored in the Dart class.
         if (wrap_unwrap_type_blink(type_id, type_registry)):
           type_is_callback = self.isCallback(type_registry, type_id)
           if (dart_js_interop and type_id == 'EventListener' and
               self.name in ['addEventListener', 'removeEventListener']):
-              # Events fired need use a JsFunction not a anonymous closure to
+              # Events fired need use a JSFunction not a anonymous closure to
               # insure the event can really be removed.
-              parameters.append('unwrap_jso(js.allowInterop(%s))' % p.name)
-          elif dart_js_interop and type_id == 'FontFaceSetForEachCallback':
+              parameters.append('js.allowInterop(%s)' % p.name)
+# These commented out cases don't actually generate any code.              
+#          elif dart_js_interop and type_id == 'FontFaceSetForEachCallback':
               # forEach is supported in the DOM for FontFaceSet as it iterates
               # over the Javascript Object the callback parameters are also
               # Javascript objects and must be wrapped.
-              parameters.append('unwrap_jso((fontFace, fontFaceAgain, set) => %s(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set)))' % p.name)
-          elif dart_js_interop and type_id == 'HeadersForEachCallback':
+ #             parameters.append('(fontFace, fontFaceAgain, set) => %s(fontFace, fontFaceAgain, wrap_jso(set))' % p.name)
+#          elif dart_js_interop and type_id == 'HeadersForEachCallback':
               # forEach is supported in the DOM for Headers as it iterates
               # over the Javascript Object the callback parameters are also
               # Javascript objects and must be wrapped.
-              parameters.append('unwrap_jso((String value, String key, map) => %s(value, key, wrap_jso(map)))' % p.name)
+#              parameters.append('(String value, String key, map) => %s(value, key, wrap_jso(map))' % p.name)
           elif dart_js_interop and type_is_callback and not(isRemoveOperation):
             # Any remove operation that has a a callback doesn't need wrapping.
             # TODO(terry): Kind of hacky but handles all the cases we care about
@@ -579,15 +578,15 @@
                 dart_type = type_registry.DartType(callback_arg.type.id) + ' '
               callback_args_decl.append('%s%s' % (dart_type, callback_arg.id))
               if wrap_unwrap_type_blink(callback_arg.type.id, type_registry):
-                callback_args_call.append('wrap_jso(%s)' % callback_arg.id)
+                callback_args_call.append(callback_arg.id)
               else:
                 callback_args_call.append(callback_arg.id)
-            parameters.append('unwrap_jso((%s) => %s(%s))' %
+            parameters.append('(%s) => %s(%s)' %
                               (", ".join(callback_args_decl),
-                               p.name,
-                               ", ".join(callback_args_call)))
+                              p.name,
+                              ", ".join(callback_args_call)))
           else:
-            parameters.append('unwrap_jso(%s)' % p.name)
+            parameters.append(p.name)
         else:
           if dart_js_interop:
             conversion = backend._InputConversion(p.type_id, self.declared_name)
@@ -1495,6 +1494,8 @@
   # Get the list type NNNN inside of List<NNNN>
   return return_type[5:-1] if isList(return_type) else return_type
 
+# TODO(jacobr): remove these obsolete methods as we don't actually
+# perform any wrapping.
 def wrap_unwrap_list_blink(return_type, type_registry):
   """Return True if the type is the list type is a blink know
      type e.g., List<Node>, List<FontFace>, etc."""
@@ -1508,14 +1509,9 @@
     unwrap_jso"""
     if return_type and return_type.startswith('Html'):
         return_type = return_type.replace('Html', 'HTML', 1)
-    return (type_registry.HasInterface(return_type) or not(return_type) or
+    return (not(return_type) or
             return_type == 'Object' or
-            return_type == 'dynamic' or
-            return_type == 'Future' or
-            return_type == 'SqlDatabase' or # renamed to Database
-            return_type == 'HTMLElement' or
-            return_type == 'MutationObserver' or
-            (return_type.endswith('[]') and return_type != 'DOMString[]'))
+            return_type == 'dynamic')
 
 def wrap_type_blink(return_type, type_registry):
     """Returns True if the type is a blink type that requires wrap_jso but
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 8e62fac..89e3c3a 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -626,7 +626,7 @@
             (factory_params, converted_arguments) = self._ConvertArgumentTypes(
                 stmts_emitter, arguments, argument_count, constructor_info)
             args = ', '.join(converted_arguments)
-            call_template = 'wrap_jso($FACTORY_NAME($FACTORY_PARAMS))'
+            call_template = '$FACTORY_NAME($FACTORY_PARAMS)'
         else:
             qualified_name = emitter.Format(
                 '$FACTORY.$NAME',
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 7bb618a..2712916 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -454,38 +454,6 @@
       '_createObjectUrlFromWebKitSource',
   'URL.createObjectURL(MediaStream stream)': 'createObjectUrlFromStream',
   'URL.createObjectURL(Blob blob)': 'createObjectUrlFromBlob',
-  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
-      'unsigned long internalformat, unsigned long format, unsigned long '
-      'type, ImageData pixels)': 'texImage2DImageData',
-  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
-      'unsigned long internalformat, unsigned long format, unsigned long '
-      'type, HTMLImageElement image)': 'texImage2DImage',
-  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
-      'unsigned long internalformat, unsigned long format, unsigned long '
-      'type, HTMLCanvasElement canvas)': 'texImage2DCanvas',
-  'WebGLRenderingContextBase.texImage2D(unsigned long target, long level, '
-      'unsigned long internalformat, unsigned long format, unsigned long '
-      'type, HTMLVideoElement video)': 'texImage2DVideo',
-  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
-      'long xoffset, long yoffset, unsigned long format, unsigned long type, '
-      'ImageData pixels)': 'texSubImage2DImageData',
-  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
-      'long xoffset, long yoffset, unsigned long format, unsigned long type, '
-      'HTMLImageElement image)': 'texSubImage2DImage',
-  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
-      'long xoffset, long yoffset, unsigned long format, unsigned long type, '
-      'HTMLCanvasElement canvas)': 'texSubImage2DCanvas',
-  'WebGLRenderingContextBase.texSubImage2D(unsigned long target, long level, '
-      'long xoffset, long yoffset, unsigned long format, unsigned long type, '
-      'HTMLVideoElement video)': 'texSubImage2DVideo',
-  'WebGLRenderingContextBase.bufferData(unsigned long target, '
-      'ArrayBuffer data, unsigned long usage)': 'bufferByteData',
-  'WebGLRenderingContextBase.bufferData(unsigned long target, '
-      'ArrayBufferView data, unsigned long usage)': 'bufferDataTyped',
-  'WebGLRenderingContextBase.bufferSubData(unsigned long target, '
-      'long long offset, ArrayBuffer data)': 'bufferSubByteData',
-  'WebGLRenderingContextBase.bufferSubData(unsigned long target, '
-      'long long offset, ArrayBufferView data)': 'bufferSubDataTyped',
   'WebSocket.send(ArrayBuffer data)': 'sendByteBuffer',
   'WebSocket.send(ArrayBufferView data)': 'sendTypedData',
   'WebSocket.send(DOMString data)': 'sendString',
@@ -525,10 +493,6 @@
   'CanvasRenderingContext2D.isPointInStroke',
   'CanvasRenderingContext2D.stroke',
   'Navigator.sendBeacon',
-  'WebGLRenderingContextBase.bufferData',
-  'WebGLRenderingContextBase.bufferSubData',
-  'WebGLRenderingContextBase.texImage2D',
-  'WebGLRenderingContextBase.texSubImage2D',
 ])
 
 for member in convert_to_future_members:
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 672d97e..efceff6 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -586,7 +586,7 @@
         class_modifiers = ''
       else:
         # For Dartium w/ JsInterop these suppressed interfaces are needed to
-        # instanciate the internal classes when wrap_jso is called for a JS object.
+        # instanciate the internal classes.
         if (self._renamer.ShouldSuppressInterface(self._interface) and
             not(isinstance(self._backend, Dart2JSBackend)) and
             self._options.dart_js_interop):
@@ -600,21 +600,10 @@
 
     class_name = self._interface_type_info.implementation_name()
 
-    js_interop_equivalence_op = \
-      '  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);\n' \
-      + '  int get hashCode => unwrap_jso(this).hashCode;\n'
-    # ClientRect overrides the equivalence operator.
-    if interface_name == 'ClientRect' or interface_name == 'DomRectReadOnly':
-        js_interop_equivalence_op = ''
-
     js_interop_wrapper = '''
 
   @Deprecated("Internal Use Only")
-  static {0} internalCreate{0}() {{
-    return new {0}._internalWrap();
-  }}
-
-  external factory {0}._internalWrap();
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   {0}.internal_() : super.internal_();
@@ -622,19 +611,13 @@
 '''.format(class_name)
     if base_class == 'NativeFieldWrapperClass2' or base_class == 'DartHtmlDomObject':
         js_interop_wrapper = '''
-  @Deprecated("Internal Use Only")
-  static {0} internalCreate{0}() {{
-    return new {0}._internalWrap();
-  }}
 
-  factory {0}._internalWrap() {{
-    return new {0}.internal_();
-  }}
+  @Deprecated("Internal Use Only")
+  external static Type get instanceRuntimeType;
 
   @Deprecated("Internal Use Only")
   {0}.internal_() {{ }}
-
-{1}'''.format(class_name, js_interop_equivalence_op)
+'''.format(class_name)
         # Change to use the synthesized class so we can construct with a mixin
         # classes prefixed with name of NativeFieldWrapperClass2 don't have a
         # default constructor so classes with mixins can't be new'd.
@@ -1285,13 +1268,9 @@
     emitters = library_emitter.Emit(
         self._template, AUXILIARY_DIR=massage_path(auxiliary_dir))
     if isinstance(emitters, tuple):
-      if self._dart_js_interop:
-        imports_emitter, map_emitter, function_emitter = emitters
-      else:
-        imports_emitter, map_emitter = emitters
-        function_emitter = None
+      imports_emitter, map_emitter = emitters
     else:
-      imports_emitter, map_emitter, function_emitter = emitters, None, None
+      imports_emitter, map_emitter = emitters, None
 
     for path in sorted(self._paths):
       relpath = os.path.relpath(path, library_file_dir)
@@ -1304,26 +1283,10 @@
       items.sort()
       for (idl_name, dart_name) in items:
         map_emitter.Emit(
-          "  '$IDL_NAME': () => $DART_NAME,\n",
+          "  '$IDL_NAME': () => $DART_NAME.instanceRuntimeType,\n",
           IDL_NAME=idl_name,
           DART_NAME=dart_name)
 
-    # Emit the $!TYPE_FUNCTION_MAP
-    if function_emitter:
-      items = self._typeMap.items()
-      items.sort()
-      for (idl_name, dart_name) in items:
-        # DOMStringMap is in the abstract list but is used as a concrete class
-        # in Dartium.
-        if not IsPureInterface(idl_name):
-          # Handle classes that are concrete (abstract can't be instantiated).
-          function_emitter.Emit(
-            "  '$IDL_NAME': () => $DART_NAME.internalCreate$DART_NAME,\n",
-            IDL_NAME=idl_name,
-            DART_NAME=dart_name)
-      if self._dart_path.endswith('html_dartium.dart'):
-        function_emitter.Emit("  'polymer-element': () => HtmlElement.internalCreateHtmlElement,\n")
-
 
 # ------------------------------------------------------------------------------
 
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 1fd37f4..6d0c94d 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -22,6 +22,8 @@
               'password', 'pathname', 'port', 'protocol',
               'search', 'username']
 
+_promise_to_future = Conversion('convertNativePromiseToDartFuture', 'dynamic', 'Future')
+
 def array_type(data_type):
     matched = re.match(r'([\w\d_\s]+)\[\]', data_type)
     if not matched:
@@ -108,6 +110,16 @@
   def CustomJSMembers(self):
     return {}
 
+  def _OutputConversion(self, idl_type, member):
+    conversion = FindConversion(idl_type, 'get', self._interface.id, member)
+    # TODO(jacobr) handle promise consistently in dart2js and dartium.
+    if idl_type == 'Promise':
+      return _promise_to_future
+    if conversion:
+      if conversion.function_name in ('_convertNativeToDart_Window', '_convertNativeToDart_EventTarget', 'convertNativeToDart_DateTime', 'convertNativeToDart_ImageData'):
+        return None
+    return conversion
+
   def _InputConversion(self, idl_type, member):
     return FindConversion(idl_type, 'set', self._interface.id, member)
 
@@ -250,7 +262,7 @@
         self._members_emitter.Emit(
             '\n  @DocsEditable()\n'
             '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
-            'wrap_jso($TOPLEVEL_NAME($OUTPARAMETERS));\n',
+            '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
             INTERFACE_NAME=self._interface_type_info.interface_name(),
             FACTORY_METHOD_NAME=factory_method_name,
             PARAMETERS=typed_formals,
@@ -272,7 +284,7 @@
         self._interface, self._interface.id, '  ')
 
     self._members_emitter.Emit(
-        '\n  $(ANNOTATIONS)factory $CTOR($PARAMS) => wrap_jso(_create($FACTORY_PARAMS));\n',
+        '\n  $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n',
         ANNOTATIONS=annotations,
         CTOR=constructor_info._ConstructorFullName(self._DartType),
         PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
@@ -536,7 +548,7 @@
         # JsObject maybe stored in the Dart class.
         return_wrap_jso = wrap_return_type_blink(return_type, attr.type.id, self._type_registry)
     wrap_unwrap_list.append(return_wrap_jso)       # wrap_jso the returned object
-    wrap_unwrap_list.append(self._dart_use_blink)  # this must be unwrap_jso
+    wrap_unwrap_list.append(self._dart_use_blink) 
 
     # This seems to have been replaced with Custom=Getter (see above), but
     # check to be sure we don't see the old syntax
@@ -545,10 +557,13 @@
     auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
     native_entry = \
         self.DeriveNativeEntry(attr.id, 'Getter', None)
+    output_conversion = self._OutputConversion(attr.type.id, attr.id)
+
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
         dart_declaration, attr.is_static, return_type, parameters,
         native_suffix, is_custom, auto_scope_setup, native_entry=native_entry,
-        wrap_unwrap_list=wrap_unwrap_list, dictionary_return=dictionary_returned)
+        wrap_unwrap_list=wrap_unwrap_list, dictionary_return=dictionary_returned,
+        output_conversion=output_conversion)
     if is_custom:
       return
 
@@ -583,9 +598,7 @@
 
     # Is the setter value a DartClass (that has a JsObject) or the type is
     # None (it's a dynamic/any type) then unwrap_jso before passing to blink.
-    parameters = ['unwrap_jso(value)' if (isinstance(type_info, InterfaceIDLTypeInfo) or
-                                          not(attr.type.id) or ptype == 'Object')
-                  else 'value']
+    parameters = ['value']
 
     dart_declaration = 'set %s(%s value)' % (html_name, ptype)
     is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
@@ -651,6 +664,12 @@
       self._EmitExplicitIndexedGetter(dart_element_type)
     else:
       is_custom = any((op.id == 'item' and _IsCustom(op)) for op in self._interface.operations)
+
+      output_conversion = self._OutputConversion(element_type, 'item')
+      conversion_name = ''
+      if output_conversion:
+        conversion_name = output_conversion.function_name
+
       # First emit a toplevel function to do the native call
       # Calls to this are emitted elsewhere,
       dart_native_name, resolver_string = \
@@ -663,40 +682,22 @@
                                         dart_native_name)
 
       type_info = self._TypeInfo(element_type)
-      # Does nativeIndexGetter return a DartClass (JsObject) if so wrap_jso.
-      wrap_jso_start = ''
-      wrap_jso_end = ''
-      if (isinstance(type_info, InterfaceIDLTypeInfo) or
-          wrap_type_blink(type_info.narrow_dart_type(), self._type_registry)):
-          wrap_jso_start = 'wrap_jso('
-          wrap_jso_end = ')'
       blinkNativeIndexed = """
   $TYPE operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return %s$(DART_NATIVE_NAME)(unwrap_jso(this), index)%s;
+    return _nativeIndexedGetter(index);
   }
 
-  $TYPE _nativeIndexedGetter(int index) => %s$(DART_NATIVE_NAME)(unwrap_jso(this), index)%s;
-""" % (wrap_jso_start, wrap_jso_end, wrap_jso_start, wrap_jso_end)
-      # Wrap the type to store the JsObject if Type is:
-      #
-      #    - known IDL type
-      #    - type_id is None then it's probably a union type or overloaded
-      #      it's a dynamic/any type
-      #    - type is Object
-      #
-      # JsObject maybe stored in the Dart class.
-      if isinstance(type_info, InterfaceIDLTypeInfo) or not(type_info) or dart_element_type == 'Object':
-          blinkNativeIndexedGetter = \
-              ' {0}$(DART_NATIVE_NAME)(unwrap_jso(this), index){1};\n'.format('wrap_jso(', ')')
-      else:
-          blinkNativeIndexedGetter = \
-              ' $(DART_NATIVE_NAME)(unwrap_jso(this), index);\n'
+  $TYPE _nativeIndexedGetter(int index) => $(CONVERSION_NAME)($(DART_NATIVE_NAME)(this, index));
+"""
+      blinkNativeIndexedGetter = \
+          ' $(DART_NATIVE_NAME)(this, index);\n'
       self._members_emitter.Emit(blinkNativeIndexed,
                                  DART_NATIVE_NAME=dart_qualified_name,
                                  TYPE=self.SecureOutputType(element_type),
-                                 INTERFACE=self._interface.id)
+                                 INTERFACE=self._interface.id,
+                                 CONVERSION_NAME=conversion_name)
 
     if self._HasNativeIndexSetter():
       self._EmitNativeIndexSetter(dart_element_type)
@@ -798,6 +799,8 @@
 
     operation = info.operations[0]
 
+    output_conversion = self._OutputConversion(operation.type.id, operation.id)
+
     dictionary_returned = False
     # Return type for dictionary is any (untyped).
     if operation.type.id == 'Dictionary':
@@ -821,20 +824,14 @@
     if self._dart_use_blink:
         # Wrap the type to store the JsObject if Type is:
         #
-        #    - known IDL type
-        #    - type_id is None then it's probably a union type or overloaded
         #      it's a dynamic/any type
         #    - type is Object
         #
         # JsObject maybe stored in the Dart class.
         return_wrap_jso = wrap_return_type_blink(return_type, info.type_name, self._type_registry)
         return_type_info = self._type_registry.TypeInfo(info.type_name)
-        if (isinstance(return_type_info, SequenceIDLTypeInfo) and
-            not isinstance(return_type_info._item_info, PrimitiveIDLTypeInfo)):
-                return_wrap_jso = True
     # wrap_jso the returned object
     wrap_unwrap_list.append(return_wrap_jso)
-    # The 'this' parameter must be unwrap_jso
     wrap_unwrap_list.append(self._dart_use_blink)
 
     if info.callback_args:
@@ -852,7 +849,8 @@
         native_suffix, is_custom, auto_scope_setup,
         native_entry=native_entry,
         wrap_unwrap_list=wrap_unwrap_list,
-        dictionary_return=dictionary_returned)
+        dictionary_return=dictionary_returned,
+        output_conversion=output_conversion)
       if not is_custom:
         self._GenerateOperationNativeCallback(operation, operation.arguments, cpp_callback_name, auto_scope_setup)
     else:
@@ -880,7 +878,7 @@
       base_name = '_%s_%s' % (operation.id, version)
       static = True
       if not operation.is_static:
-        actuals = ['unwrap_jso(this)' if self._dart_use_blink else 'this'] + actuals
+        actuals = ['this'] + actuals
         formals = ['mthis'] + formals
       actuals_s = ", ".join(actuals)
       formals_s = ", ".join(formals)
@@ -892,10 +890,7 @@
       overload_name = \
           self.DeriveQualifiedBlinkName(self._interface.id,
                                         overload_base_name)
-      if return_wrap_jso:
-          call_emitter.Emit('wrap_jso($NAME($ARGS))', NAME=overload_name, ARGS=actuals_s)
-      else:
-          call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
+      call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
       auto_scope_setup = \
         self._GenerateAutoSetupScope(base_name, native_suffix)
       cpp_callback_name = self._GenerateNativeBinding(
@@ -927,7 +922,7 @@
   def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
       static, return_type, parameters, native_suffix, is_custom,
       auto_scope_setup=True, emit_metadata=True, emit_to_native=False,
-      native_entry=None, wrap_unwrap_list=[], dictionary_return=False):
+      native_entry=None, wrap_unwrap_list=[], dictionary_return=False, output_conversion=None):
     metadata = []
     if emit_metadata:
       metadata = self._metadata.GetFormattedMetadata(
@@ -946,10 +941,7 @@
 
     if not static:
         formals = ", ".join(['mthis'] + parameters)
-        if wrap_unwrap_list and wrap_unwrap_list[1]:
-            actuals = ", ".join(['unwrap_jso(this)'] + parameters)
-        else:
-            actuals = ", ".join(['this'] + parameters)
+        actuals = ", ".join(['this'] + parameters)
     else:
         formals = ", ".join(parameters)
         actuals = ", ".join(parameters)
@@ -969,11 +961,17 @@
             emit_template = '''
   $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);
   '''
-            if wrap_unwrap_list and wrap_unwrap_list[0]:
+            if output_conversion and not dictionary_return:
+              conversion_template = '''
+  $METADATA$DART_DECLARATION => %s($DART_NAME($ACTUALS));
+  '''
+              emit_template = conversion_template % output_conversion.function_name
+
+            elif wrap_unwrap_list and wrap_unwrap_list[0]:
                 if return_type == 'Rectangle':
                     jso_util_method = 'make_dart_rectangle'
                 elif wrap_unwrap_list[0]:
-                    jso_util_method = 'wrap_jso'
+                    jso_util_method = ''
 
                 if dictionary_return:
                   emit_jso_template = '''
diff --git a/tools/dom/src/dartium_CustomElementSupport.dart b/tools/dom/src/dartium_CustomElementSupport.dart
index e769e88..c957145 100644
--- a/tools/dom/src/dartium_CustomElementSupport.dart
+++ b/tools/dom/src/dartium_CustomElementSupport.dart
@@ -29,40 +29,11 @@
   }
 
   Element upgrade(element) {
-    var jsObject;
-    var tag;
-    var isNativeElementExtension = false;
-
-    try {
-      tag = _getCustomElementName(element);
-    } catch (e) {
-      isNativeElementExtension = element.localName == _extendsTag;
+    // Only exact type matches are supported- cannot be a subclass.
+    if (element.runtimeType != _nativeType) {
+      throw new ArgumentError('element is not subclass of $_nativeType');
     }
-
-    if (element.runtimeType == HtmlElement || element.runtimeType == TemplateElement) {
-      if (tag != _extendsTag) {
-        throw new UnsupportedError('$tag is not registered.');
-      }
-      jsObject = unwrap_jso(element);
-    } else if (element.runtimeType == js.JsObject) {
-      // It's a Polymer core element (written in JS).
-      jsObject = element;
-    } else if (isNativeElementExtension) {
-      // Extending a native element.
-      jsObject = element.blink_jsObject;
-
-      // Element to extend is the real tag.
-      tag = element.localName;
-    } else if (tag != null && element.localName != tag) {
-      throw new UnsupportedError('Element is incorrect type. Got ${element.runtimeType}, expected native Html or Svg element to extend.');
-    } else if (tag == null) {
-      throw new UnsupportedError('Element is incorrect type. Got ${element.runtimeType}, expected HtmlElement/JsObject.');
-    }
-
-    // Remember Dart class to tagName for any upgrading done in wrap_jso.
-    addCustomElementType(tag, _type, _extendsTag);
-
-    return _createCustomUpgrader(_type, jsObject);
+    return _createCustomUpgrader(_type, element);
   }
 }
 
diff --git a/tools/dom/src/dartium_KeyEvent.dart b/tools/dom/src/dartium_KeyEvent.dart
index 9997689..b0a494a 100644
--- a/tools/dom/src/dartium_KeyEvent.dart
+++ b/tools/dom/src/dartium_KeyEvent.dart
@@ -30,13 +30,7 @@
 @Experimental()
 class KeyEvent extends _WrappedEvent implements KeyboardEvent {
   /** Needed because KeyboardEvent is implements.
-   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
-   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
-   *               functions that delegate to a public wrap/unwrap_jso.
    */
-  @Deprecated("Internal Use Only")
-  js.JsObject blink_jsObject;
-
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
diff --git a/tools/dom/src/dartium_WrappedEvent.dart b/tools/dom/src/dartium_WrappedEvent.dart
index 2364158..a4e0ace 100644
--- a/tools/dom/src/dartium_WrappedEvent.dart
+++ b/tools/dom/src/dartium_WrappedEvent.dart
@@ -6,15 +6,14 @@
 
 /**
  * Helper class to implement custom events which wrap DOM events.
+ * TODO(jacobr): consider using dart JsNative.$setInstanceInterceptor
+ * instead of using wrappers as that would allow passing these wrappers
+ * back through dispatchEvent unlike the current implementation.
+ * See https://github.com/dart-lang/sdk/issues/16869
  */
 class _WrappedEvent implements Event {
   /** Needed because KeyboardEvent is implements.
-   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
-   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
-   *               functions that delegate to a public wrap/unwrap_jso.
    */
-  js.JsObject blink_jsObject;
-
   final Event wrapped;
 
   /** The CSS selector involved with event delegation. */
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index 2aad83f..97487bf 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -124,8 +124,6 @@
     }
   }
 
-  static maybeUnwrapJso(obj) => unwrap_jso(obj);
-
   static List convertToList(List list) {
     // FIXME: [possible optimization]: do not copy the array if Dart_IsArray is fine w/ it.
     final length = list.length;
@@ -189,15 +187,14 @@
     return element;
   }
 
-  static window() => wrap_jso(js.context['window']);
-
   static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   static void spawnDomHelper(Function f, int replyTo) =>
       _blink.Blink_Utils.spawnDomHelper(f, replyTo);
 
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) => wrap_jso(_blink.Blink_Utils.spawnDomUri(uri));
+  // TODO(jacobr): IS THIS RIGHT? I worry we have broken conversion from Promise to Future.
+  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -774,13 +771,13 @@
     return [
         "inspect",
         (o) {
-          host.callMethod("_inspect", [unwrap_jso(o)]);
+          js.JsNative.callMethod(host, "_inspect", [o]);
           return o;
         },
         "dir",
-        window().console.dir,
+        window.console.dir,
         "dirxml",
-        window().console.dirxml
+        window.console.dirxml
         // FIXME: add copy method.
         ];
   }
@@ -804,38 +801,34 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-    String extendsTagName) => _blink.Blink_Utils.register(unwrap_jso(document), tag, customType, extendsTagName);
+    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
 
   static Element createElement(Document document, String tagName) =>
-      wrap_jso(_blink.Blink_Utils.createElement(unwrap_jso(document), tagName));
-
-  static Element changeElementWrapper(HtmlElement element, Type type) =>
-      wrap_jso(_blink.Blink_Utils.changeElementWrapper(unwrap_jso(element), type));
+      _blink.Blink_Utils.createElement(document, tagName);
 }
 
+// TODO(jacobr): this seems busted. I believe we are actually
+// giving users real windows for opener, parent, top, etc.
+// Or worse, we are probaly returning a raw JSObject.
 class _DOMWindowCrossFrame extends DartHtmlDomObject implements
     WindowBase {
-  /** Needed because KeyboardEvent is implements.
-   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
-   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
-   *               functions that delegate to a public wrap/unwrap_jso.
-   */
-  js.JsObject blink_jsObject;
 
   _DOMWindowCrossFrame.internal();
+  
+  static _createSafe(win) => _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame);
 
   // Fields.
-  HistoryBase get history => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_history(unwrap_jso(this)));
-  LocationBase get location => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_location(unwrap_jso(this)));
-  bool get closed => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_closed(unwrap_jso(this)));
-  WindowBase get opener => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_opener(unwrap_jso(this)));
-  WindowBase get parent => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_parent(unwrap_jso(this)));
-  WindowBase get top => wrap_jso(_blink.Blink_DOMWindowCrossFrame.get_top(unwrap_jso(this)));
+  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
+  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
+  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
+  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
+  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
+  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
 
   // Methods.
-  void close() => _blink.Blink_DOMWindowCrossFrame.close(unwrap_jso(this));
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-      _blink.Blink_DOMWindowCrossFrame.postMessage(unwrap_jso(this),
+      _blink.Blink_DOMWindowCrossFrame.postMessage(this,
          convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
 
   // Implementation support.
@@ -869,9 +862,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() => _blink.Blink_HistoryCrossFrame.back(unwrap_jso(this));
-  void forward() => _blink.Blink_HistoryCrossFrame.forward(unwrap_jso(this));
-  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(unwrap_jso(this), distance);
+  void back() => _blink.Blink_HistoryCrossFrame.back(this);
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -881,7 +874,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(unwrap_jso(this), h);
+  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 30400a1..ead9d63 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -150,7 +150,4 @@
   throw new UnimplementedError();
 }
 
-/// Dartium functions that are a NOOP in dart2js.
-unwrap_jso(dartClass_instance) => dartClass_instance;
-wrap_jso(jsObject) => jsObject;
 createCustomUpgrader(Type customElementClass, $this) => $this;
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index 66a18e0..c92c27e 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -37,7 +37,6 @@
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:indexed_db' show indexed_dbBlinkMap;
-import 'dart:indexed_db' show indexed_dbBlinkFunctionMap;
 import 'dart:isolate';
 import 'dart:js' as js;
 import "dart:convert";
@@ -49,17 +48,14 @@
 import 'dart:typed_data';
 import 'dart:web_gl' as gl;
 import 'dart:web_gl' show web_glBlinkMap;
-import 'dart:web_gl' show web_glBlinkFunctionMap;
 import 'dart:web_sql';
 // Not actually used, but imported since dart:html can generate these objects.
 import 'dart:svg' as svg;
 import 'dart:svg' show svgBlinkMap;
-import 'dart:svg' show svgBlinkFunctionMap;
 import 'dart:svg' show Matrix;
 import 'dart:svg' show SvgSvgElement;
 import 'dart:web_audio' as web_audio;
 import 'dart:web_audio' show web_audioBlinkMap;
-import 'dart:web_audio' show web_audioBlinkFunctionMap;
 import 'dart:_blink' as _blink;
 import 'dart:developer';
 
@@ -118,7 +114,7 @@
   }
 $if DARTIUM
 $if JSINTEROP
-  _window = wrap_jso(js.JsNative.getProperty(js.context, 'window'));
+  _window = js.JsNative.toTypedObject(js.context);
 $else
   _window = _Utils.window();
 $endif
@@ -161,11 +157,19 @@
   'JsObject': () => js.JsObject,
   'JsFunction': () => js.JsFunction,
   'JsArray': () => js.JsArray,
+  // We have to call .instanceRuntimeType as these classes have a private
+  // implementation class defined dynamically at runtime via a patch file.
+  'JSObject': () => js.JSObject.instanceRuntimeType,
+  'JSFunction': () => js.JSFunction.instanceRuntimeType,
+  'JSArray': () => js.JSArray.instanceRuntimeType,
 $!TYPE_MAP
 };
 
 // TODO(leafp): We may want to move this elsewhere if html becomes
 // a package to avoid dartium depending on pkg:html.
+@Deprecated("Internal Use Only")
+getHtmlCreateType(String key) => _getType(key);
+
 Type _getType(String key) {
   var result;
 
@@ -252,102 +256,15 @@
   return null;
 }
 
+// TODO(jacobr): it would be nice to place this in a consistent place for dart2js and dartium.
+_convertNativeToDart_XHR_Response(o) {
+  if (o is Document) {
+    return o;
+  }
+  return convertNativeToDart_SerializedScriptValue(o);
+}
+
 $if JSINTEROP
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final htmlBlinkFunctionMap = {
-$!TYPE_FUNCTION_MAP
-};
-
-// TODO(terry): We may want to move this elsewhere if html becomes
-// a package to avoid dartium depending on pkg:html.
-@Deprecated("Internal Use Only")
-getHtmlCreateFunction(String key) {
-  var result;
-
-  // TODO(vsm): Add Cross Frame and JS types here as well.
-
-  // Check the html library.
-  result = _getHtmlFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the web gl library.
-  result = _getWebGlFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the indexed db library.
-  result = _getIndexDbFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the web audio library.
-  result = _getWebAudioFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the web sql library.
-  result = _getWebSqlFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  // Check the svg library.
-  result = _getSvgFunction(key);
-  if (result != null) {
-    return result;
-  }
-
-  return null;
-}
-
-Function _getHtmlFunction(String key) {
-  if (htmlBlinkFunctionMap.containsKey(key)) {
-    return htmlBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getWebGlFunction(String key) {
-  if (web_glBlinkFunctionMap.containsKey(key)) {
-    return web_glBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getIndexDbFunction(String key) {
-  if (indexed_dbBlinkFunctionMap.containsKey(key)) {
-    return indexed_dbBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getWebAudioFunction(String key) {
-  if (web_audioBlinkFunctionMap.containsKey(key)) {
-    return web_audioBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getWebSqlFunction(String key) {
-  if (web_sqlBlinkFunctionMap.containsKey(key)) {
-    return web_sqlBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
-Function _getSvgFunction(String key) {
-  if (svgBlinkFunctionMap.containsKey(key)) {
-    return svgBlinkFunctionMap[key]();
-  }
-  return null;
-}
-
 
 /******************************************************************************
  **********                                                          **********
@@ -368,22 +285,14 @@
   var jsObject;
   var tag = "";
   var runtimeType = element.runtimeType;
-  if (runtimeType == HtmlElement) {
-    tag = element.localName;
-  } else if (runtimeType == TemplateElement) {
+  if (runtimeType == TemplateElement) {
     // Data binding with a Dart class.
     tag = element.attributes['is'];
-  } else if (runtimeType == js.JsObject) {
-    // It's a Polymer core element (written in JS).
-    // Make sure it's an element anything else we can ignore.
-    if (element.hasProperty('nodeType') && element['nodeType'] == 1) {
-      if (js.JsNative.callMethod(element, 'hasAttribute', ['is'])) {
-        // It's data binding use the is attribute.
-        tag = js.JsNative.callMethod(element, 'getAttribute', ['is']);
-      } else {
-        // It's a custom element we want the local name.
-        tag = element['localName'];
-      }
+  } else if (element is HtmlElement) {
+    tag = element.attributes['is'];
+    if (tag == null) {
+      // It's a custom element we want the local name.
+      tag = element.localName;
     }
   } else {
     throw new UnsupportedError('Element is incorrect type. Got ${runtimeType}, expected HtmlElement/HtmlTemplate/JsObject.');
@@ -412,12 +321,16 @@
   }
 }
 
+// TODO(jacobr): we shouldn't be generating this call in the dart:html
+// bindings but we are.
+_convertDartToNative_EventTarget(target) => target;
+
 @Deprecated("Internal Use Only")
 Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
   var result = new Map();
   var keys = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object'), 'keys', [jsObject]);
   for (var key in keys) {
-    result[key] = wrap_jso(js.JsNative.getProperty(jsObject, key));
+    result[key] = js.JsNative.getProperty(jsObject, key);
   }
   return result;
 }
@@ -426,25 +339,7 @@
  * Upgrade the JS HTMLElement to the Dart class.  Used by Dart's Polymer.
  */
 _createCustomUpgrader(Type customElementClass, $this) {
-  var dartClass;
-  try {
-    dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
-  } catch (e) {
-    // Did the dartClass get allocated but the created failed?  Otherwise, other
-    // components inside of this failed somewhere (could be JS custom element).
-    if (dartClass != null) {
-      // Yes, mark as didn't upgrade.
-      dartClass._badUpgrade();
-    }
-    throw e;
-  } finally {
-    // Need to remember the Dart class that was created for this custom so
-    // return it and setup the blink_jsObject to the $this that we'll be working
-    // with as we talk to blink.
-    js.setDartHtmlWrapperFor($this, dartClass);
-  }
-
-  return dartClass;
+  return _blink.Blink_Utils.setInstanceInterceptor($this, customElementClass, customElement: true);
 }
 
 $else
diff --git a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
index ef3928c..dee0cac 100644
--- a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
@@ -112,10 +112,66 @@
 $!TYPE_MAP
 };
 
-$if JSINTEROP
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final indexed_dbBlinkFunctionMap = {
-$!TYPE_FUNCTION_MAP
-};
-$endif
+
+//
+// Per http://www.w3.org/TR/IndexedDB/#key-construct
+//
+// "A value is said to be a valid key if it is one of the following types: Array
+// JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [ECMA-262] or float
+// [WEBIDL]. However Arrays are only valid keys if every item in the array is
+// defined and is a valid key (i.e. sparse arrays can not be valid keys) and if
+// the Array doesn't directly or indirectly contain itself. Any non-numeric
+// properties are ignored, and thus does not affect whether the Array is a valid
+// key. Additionally, if the value is of type float, it is only a valid key if
+// it is not NaN, and if the value is of type Date it is only a valid key if its
+// [[PrimitiveValue]] internal property, as defined by [ECMA-262], is not NaN."
+
+// What is required is to ensure that an Lists in the key are actually
+// JavaScript arrays, and any Dates are JavaScript Dates.
+
+
+/**
+ * Converts a native IDBKey into a Dart object.
+ *
+ * May return the original input.  May mutate the original input (but will be
+ * idempotent if mutation occurs).  It is assumed that this conversion happens
+ * on native IDBKeys on all paths that return IDBKeys from native DOM calls.
+ *
+ * If necessary, JavaScript Dates are converted into Dart Dates.
+ */
+_convertNativeToDart_IDBKey(nativeKey) {
+  containsDate(object) {
+    if (object is DateTime) return true;
+    if (object is List) {
+      for (int i = 0; i < object.length; i++) {
+        if (containsDate(object[i])) return true;
+      }
+    }
+    return false;  // number, string.
+  }
+  if (nativeKey is DateTime) {
+    throw new UnimplementedError('Key containing DateTime');
+  }
+  // TODO: Cache conversion somewhere?
+  return nativeKey;
+}
+
+/**
+ * Converts a Dart object into a valid IDBKey.
+ *
+ * May return the original input.  Does not mutate input.
+ *
+ * If necessary, [dartKey] may be copied to ensure all lists are converted into
+ * JavaScript Arrays and Dart Dates into JavaScript Dates.
+ */
+_convertDartToNative_IDBKey(dartKey) {
+  // TODO: Implement.
+  return dartKey;
+}
+
+
+
+/// May modify original.  If so, action is idempotent.
+_convertNativeToDart_IDBAny(object) {
+  return convertNativeToDart_AcceptStructuredClone(object, mustCopy: false);
+}
\ No newline at end of file
diff --git a/tools/dom/templates/html/dartium/svg_dartium.darttemplate b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
index ab2a99d..17f119b 100644
--- a/tools/dom/templates/html/dartium/svg_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
@@ -28,11 +28,3 @@
 final svgBlinkMap = {
 $!TYPE_MAP
 };
-
-$if JSINTEROP
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final svgBlinkFunctionMap = {
-$!TYPE_FUNCTION_MAP
-};
-$endif
diff --git a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
index 43b42c9..b9c02a7 100644
--- a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
@@ -22,11 +22,3 @@
 final web_audioBlinkMap = {
 $!TYPE_MAP
 };
-
-$if JSINTEROP
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final web_audioBlinkFunctionMap = {
-$!TYPE_FUNCTION_MAP
-};
-$endif
diff --git a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
index 7cc4289..2258b2e 100644
--- a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
@@ -24,11 +24,3 @@
 final web_glBlinkMap = {
 $!TYPE_MAP
 };
-
-$if JSINTEROP
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final web_glBlinkFunctionMap = {
-$!TYPE_FUNCTION_MAP
-};
-$endif
diff --git a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
index 21ef127..03135a3 100644
--- a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
@@ -30,11 +30,3 @@
 final web_sqlBlinkMap = {
 $!TYPE_MAP
 };
-
-$if JSINTEROP
-// FIXME: Can we make this private?
-@Deprecated("Internal Use Only")
-final web_sqlBlinkFunctionMap = {
-$!TYPE_FUNCTION_MAP
-};
-$endif
\ No newline at end of file
diff --git a/tools/dom/templates/html/impl/impl_Blob.darttemplate b/tools/dom/templates/html/impl/impl_Blob.darttemplate
index 0b12452..e2617c2 100644
--- a/tools/dom/templates/html/impl/impl_Blob.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Blob.darttemplate
@@ -31,15 +31,15 @@
     // TODO: any coercions on the elements of blobParts, e.g. coerce a typed
     // array to ArrayBuffer if it is a total view.
 
-    var parts = convertDartToNative_List(blobParts.map(unwrap_jso).toList());
+    var parts = convertDartToNative_List(blobParts);
     if (type == null && endings == null) {
-      return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_1_(parts));
+      return _blink.BlinkBlob.instance.constructorCallback_1_(parts);
     }
     var bag = {};
     if (type != null) bag['type'] = type;
     if (endings != null) bag['endings'] = endings;
-    return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_2_(parts,
-        convertDartToNative_Dictionary(bag)));
+    return _blink.BlinkBlob.instance.constructorCallback_2_(parts,
+        convertDartToNative_Dictionary(bag));
   }
   $endif
 $endif
diff --git a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index 7cb4628..495011e2 100644
--- a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -63,7 +63,7 @@
 $if DARTIUM
   bool _hasProperty(String propertyName) =>
   $if JSINTEROP
-      _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(unwrap_jso(this), propertyName) != null;
+      _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(this, propertyName);
   $else
       _blink.BlinkCSSStyleDeclaration.$__propertyQuery___Callback_1(this, propertyName);
   $endif
diff --git a/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate b/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
index e16b74a..b2a787e 100644
--- a/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CustomEvent.darttemplate
@@ -23,9 +23,7 @@
     // first-chance exceptions. Can expand this list in the future as needed.
     if (detail is List || detail is Map || detail is String || detail is num) {
       try {
-$if DART2JS
         detail = convertDartToNative_SerializedScriptValue(detail);
-$endif
         e._initCustomEvent(type, canBubble, cancelable, detail);
       } catch(_) {
         e._initCustomEvent(type, canBubble, cancelable, null);
@@ -34,11 +32,6 @@
       e._initCustomEvent(type, canBubble, cancelable, null);
     }
 
-$if DARTIUM
-    // Need for identity.
-    js.setDartHtmlWrapperFor(e.blink_jsObject, e);
-
-$endif
     return e;
   }
 
diff --git a/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate b/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate
index 31455d6..ab0442a 100644
--- a/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DataTransferItemList.darttemplate
@@ -15,7 +15,7 @@
     // TODO(alanknight): I think that all the __getter__ generators should just
     // do property access, but that's major surgery. This one is a problem, so
     // just hard-code it for now.
-    return _blink.Blink_JsNative_DomException.getProperty(unwrap_jso(this), index);
+    return _blink.Blink_JsNative_DomException.getProperty(this, index);
 $endif
   }
 
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index ca0705a..9dae6c7 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -68,23 +68,9 @@
         ? _createElement_2(tagName)
         : _createElement(tagName, typeExtension);
 $else
-    var newElement = (typeExtension == null) ?
-      _blink.BlinkDocument.instance.createElement_Callback_1_(unwrap_jso(this), tagName) :
-      _blink.BlinkDocument.instance.createElement_Callback_2_(unwrap_jso(this), tagName, typeExtension);
-
-    var wrapped = js.getDartHtmlWrapperFor(newElement);  // Here's our Dart class.
-    if (wrapped != null) {
-      wrapped.blink_jsObject = newElement;
-    } else {
-      wrapped = wrap_jso(newElement);
-      if (wrapped == null) {
-        wrapped = wrap_jso_custom_element(newElement);
-      } else {
-        js.setDartHtmlWrapperFor(wrapped.blink_jsObject, wrapped);
-      }
-    }
-
-    return wrapped;
+    return (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElement_Callback_1_(this, tagName) :
+      _blink.BlinkDocument.instance.createElement_Callback_2_(this, tagName, typeExtension);
 $endif
   }
 
@@ -110,25 +96,9 @@
         ? _createElementNS_2(namespaceURI, qualifiedName)
         : _createElementNS(namespaceURI, qualifiedName, typeExtension);
 $else
-    var newElement = (typeExtension == null) ?
-      _blink.BlinkDocument.instance.createElementNS_Callback_2_(unwrap_jso(this), namespaceURI, qualifiedName) :
-      _blink.BlinkDocument.instance.createElementNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, typeExtension);
-
-    var wrapped;
-
-    wrapped = js.getDartHtmlWrapperFor(newElement);  // Here's our Dart class.
-    if (wrapped != null) {
-      wrapped.blink_jsObject = newElement;
-    } else {
-      wrapped = wrap_jso(newElement);
-      if (wrapped == null) {
-        wrapped = wrap_jso_custom_element(newElement);
-      } else {
-        js.setDartHtmlWrapperFor(wrapped.blink_jsObject, wrapped);  // Here's our Dart class.
-      }
-    }
-
-    return wrapped;
+    return (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElementNS_Callback_2_(this, namespaceURI, qualifiedName) :
+      _blink.BlinkDocument.instance.createElementNS_Callback_3_(this, namespaceURI, qualifiedName, typeExtension);    
 $endif
   }
 
diff --git a/tools/dom/templates/html/impl/impl_DocumentType.darttemplate b/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
index 88e7e6e..aad4158 100644
--- a/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
@@ -9,8 +9,8 @@
 $!MEMBERS
 $if DARTIUM
   // Override this methods for Dartium _DocumentType can't be abstract.
-  Element get nextElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.nextElementSibling_Getter_(unwrap_jso(this)));
-  Element get previousElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.previousElementSibling_Getter_(unwrap_jso(this)));
+  Element get nextElementSibling => _blink.BlinkDocumentType.instance.nextElementSibling_Getter_(this);
+  Element get previousElementSibling => _blink.BlinkDocumentType.instance.previousElementSibling_Getter_(this);
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 4b8173b..399e90d 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -380,7 +380,15 @@
    *     }
    *     document.registerElement('x-custom', CustomElement);
    */
+$if DART2JS
   Element.created() : super._created();
+$else
+  Element.created() : super._created() {
+    // Validate that this is a custom element & possibly perform additional
+    // initialization.
+    _blink.Blink_Utils.initializeCustomElement(this);
+  }
+$endif
 
   /**
    * Creates the HTML element specified by the tag name.
@@ -1483,24 +1491,20 @@
   static var _htmlCollection = js.context["HTMLCollection"];
   static var _nodeList = js.context["NodeList"];
 
+  static const _evilAttributeNames =
+      const ['attributes', 'lastChild', 'children', 'childNodes'];
+
   static bool _hasCorruptedAttributes(Element element) {
-    var attributes = unwrap_jso(element)["attributes"];
-    if (!attributes.instanceof(_namedNodeMap)) {
-      return true;
-    }
-    var childNodes = unwrap_jso(element.childNodes);
-    var length = childNodes["length"];
-    var lastChild = unwrap_jso(element.lastChild);
-    if (null != lastChild &&
-        lastChild != childNodes[length - 1]) {
-      return true;
-    }
-    var children = unwrap_jso(element._children);
-    if (null != children) { // On Safari, children can apparently be null.
-      if (!children.instanceof(_htmlCollection) ||
-          children.instanceof(_nodeList)) {
-	return true;
-      }
+    // We have trusted access to children and to attributes of objects,
+    // so we can inspect directly for attempts at DOM clobbering.
+    var child = element.firstChild;
+    while( child != null)  {
+      if (child is Element) {
+      for (var attributeName in ["id", "name"]) {
+        var childAttribute = child.getAttribute(attributeName);
+        if (_evilAttributeNames.contains(childAttribute)) return true;
+      }}
+      child = child.nextNode;
     }
     return false;
   }
@@ -1509,6 +1513,7 @@
   static bool _hasCorruptedAttributesAdditionalCheck(Element element) => false;
 $endif
 
+$if DART2JS
   static String _safeTagName(element) {
     String result = 'element tag unavailable';
     try {
@@ -1518,6 +1523,15 @@
     } catch (e) {}
     return result;
   }
+$else
+  static String _safeTagName(element) {
+    try {
+      // Safe as we plumb directly to a C++ native method.
+      return element.tagName;
+    } catch (e) {}
+    return 'element tag unavailable';
+  }
+$endif  
 
 $if DART2JS
   @DomName('Element.offsetParent')
@@ -1570,52 +1584,52 @@
 
 $else
   // Need to explicitly delegate because Element is no longer abstract for Dartium.
-  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
-  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
+  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(this);
+  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(this);
 
   @DomName('Element.offsetParent')
   @DocsEditable()
-  Element get offsetParent => wrap_jso(_blink.BlinkElement.instance.offsetParent_Getter_(unwrap_jso(this)));
+  Element get offsetParent => _blink.BlinkElement.instance.offsetParent_Getter_(this);
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this));
+  int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(this);
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(unwrap_jso(this));
+  int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(this);
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(unwrap_jso(this));
+  int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(this);
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(unwrap_jso(this));
+  int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(this);
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(unwrap_jso(this)).round();
+  int get scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(unwrap_jso(this)).round();
+  int get scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
+  set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(this, value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(unwrap_jso(this)).round();
+  int get scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(this).round();
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
+  set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(this, value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(unwrap_jso(this)).round();
+  int get scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(this).round();
 $endif
 
 $!MEMBERS
diff --git a/tools/dom/templates/html/impl/impl_FileReader.darttemplate b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
index ba5278f..d698e37 100644
--- a/tools/dom/templates/html/impl/impl_FileReader.darttemplate
+++ b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
@@ -13,7 +13,7 @@
 $if DART2JS
     var res = JS('Null|String|NativeByteBuffer', '#.result', this);
 $else
-    var res = _blink.BlinkFileReader.instance.result_Getter_(unwrap_jso(this));
+    var res = _blink.BlinkFileReader.instance.result_Getter_(this);
 $endif
     if (res is ByteBuffer) {
       return new Uint8List.view(res);
diff --git a/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
index 838a8be..e8da200 100644
--- a/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
@@ -10,9 +10,9 @@
 $if JSINTEROP
   factory AudioElement([String src]) {
     if (src == null)
-      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_0_());
+      return _blink.BlinkHTMLAudioElement.instance.constructorCallback_0_();
     else
-      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src));
+      return _blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src);
   }
 $else
   factory AudioElement([String src]) => new AudioElement._(src);
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 61fc715..7768aad 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -413,9 +413,6 @@
       }
       var elemProto = js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'Object'), "create", [js.JsNative.getProperty(baseElement, 'prototype')]);
 
-      // Remember for any upgrading done in wrap_jso.
-      addCustomElementType(tag, customElementClass, extendsTag);
-
       // TODO(terry): Hack to stop recursion re-creating custom element when the
       //              created() constructor of the custom element does e.g.,
       //
@@ -427,77 +424,42 @@
       //              until stack overflow.
       //
       //              See https://github.com/dart-lang/sdk/issues/23666
-      int creating = 0;
+      int creating = 0; // TODO(jacobr): I think I broke thise case. Will fix monday.
 
       // If any JS code is hooked we want to call it too.
-      var oldCreatedCallback = elemProto['createdCallback'];
-      var oldAttributeChangedCallback = elemProto['attributeChangedCallback'];
-      var oldAttachedCallback = elemProto['attachedCallback'];
-      var oldDetachedCallback = elemProto['detachedCallback'];
+      var oldCreatedCallback = js.JsNative.getProperty(elemProto, 'createdCallback');
+      var oldAttributeChangedCallback = js.JsNative.getProperty(elemProto, 'attributeChangedCallback');
+      var oldAttachedCallback = js.JsNative.getProperty(elemProto, 'attachedCallback');
+      var oldDetachedCallback = js.JsNative.getProperty(elemProto, 'detachedCallback');
 
-      // TODO(jacobr): warning:
-      elemProto['createdCallback'] = js.JsNative.withThis(($this) {
-        if (_getJSClassName(reflectClass(customElementClass).superclass) != null && creating < 2) {
-          creating++;
-
-          var dartClass;
-          try {
-            if (extendsTag != null) {
-              // If we're extending a native element then create that element.
-              // Then upgrade that element to the customElementClass through
-              // normal flow.
-              dartClass = document.createElement(extendsTag);
-              js.setDartHtmlWrapperFor($this, dartClass);
-              dartClass.blink_jsObject = $this;
-            }
-
-            // Upgrade to the CustomElement Dart class.
-            dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
-          } catch (e) {
-            // Got a problem make it an HtmlElement and rethrow the error.
-            dartClass = HtmlElement.internalCreateHtmlElement();
-            // We need to remember the JS object (because constructElement failed
-            // it normally sets up the blink_jsObject.
-            dartClass.blink_jsObject = $this;
-
-            // Mark to only try this once don't try upgrading from HtmlElement
-            // to the user's Dart class - we had a problem.
-            dartClass._badUpgrade();
-            throw e;
-          } finally {
-            // Need to remember the Dart class that was created for this custom so
-            // return it and setup the blink_jsObject to the $this that we'll be working
-            // with as we talk to blink.
-            js.setDartHtmlWrapperFor($this, dartClass);
-
-            creating--;
-          }
-        }
-
+      js.JsNative.setProperty(elemProto, 'createdCallback', js.allowInteropCaptureThis(($this) {
+        // The created callback has already been called by the very act of passing a JS
+        // custom element from JS to Dart.
         if (oldCreatedCallback != null)
-          oldCreatedCallback.apply([], thisArg: unwrap_jso($this));
-      });
-      elemProto['attributeChangedCallback'] = new js.JsFunction.withThis(($this, attrName, oldVal, newVal) {
+          oldCreatedCallback.apply([], thisArg: $this);
+      }));
+      js.JsNative.setProperty(elemProto, 'attributeChangedCallback', js.allowInteropCaptureThis(($this, attrName, oldVal, newVal) {
         $this.attributeChanged(attrName, oldVal, newVal);
 
         if (oldAttributeChangedCallback != null)
-          oldAttributeChangedCallback.apply([], thisArg: unwrap_jso($this));
-      });
-      elemProto['attachedCallback'] = new js.JsFunction.withThis(($this) {
+          oldAttributeChangedCallback.apply([], thisArg: $this);
+      }));
+      js.JsNative.setProperty(elemProto, 'attachedCallback', js.allowInteropCaptureThis(($this) {
         $this.attached();
 
         if (oldAttachedCallback != null)
-          oldAttachedCallback.apply([], thisArg: unwrap_jso($this));
-      });
-      elemProto['detachedCallback'] = new js.JsFunction.withThis(($this) {
+          oldAttachedCallback.apply([], thisArg: $this);
+      }));
+      js.JsNative.setProperty(elemProto, 'detachedCallback', js.allowInteropCaptureThis(($this) {
         $this.detached();
 
         if (oldDetachedCallback != null)
-          oldDetachedCallback.apply([], thisArg: unwrap_jso($this));
-      });
+          oldDetachedCallback.apply([], thisArg: $this);
+      }));
       // document.registerElement('x-foo', {prototype: elemProto, extends: extendsTag});
       var jsMap = new js.JsObject.jsify({'prototype': elemProto, 'extends': extendsTag});
-      js.JsNative.callMethod(js.JsNative.getProperty(js.context, 'document'), 'registerElement', [tag, jsMap]);
+      _blink.Blink_Utils.defineInterceptorCustomElement(elemProto, customElementClass);
+      js.JsNative.callMethod(document, 'registerElement', [tag, jsMap]);
     }
 $endif
   }
diff --git a/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate
index 1d12631..2f16d16 100644
--- a/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLElement.darttemplate
@@ -7,18 +7,4 @@
 @DocsEditable()
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 $!MEMBERS
-$if DARTIUM
-  // Flags to only try upgrading once. If there's a failure don't try upgrading
-  // anymore.
-  bool _badUpgradeOccurred = false;
-
-  /// Required for SDK Infrastructure. Internal use only.
-  ///
-  /// Did this encounter a failure attempting to upgrade to
-  /// a custom element.
-  @Deprecated("Required for SDK Infrastructure. Internal use only.")
-  bool get isBadUpgrade => _badUpgradeOccurred;
-
-  void _badUpgrade() { _badUpgradeOccurred = true; }
-$endif
 }
diff --git a/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate b/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate
index 8a74ad3..3d396ef 100644
--- a/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate
+++ b/tools/dom/templates/html/impl/impl_IDBDatabase.darttemplate
@@ -72,14 +72,14 @@
     if (storeName_OR_storeNames == null) {
       throw new ArgumentError("stores may not be null in transaction");
     } else if (storeName_OR_storeNames is String || storeName_OR_storeNames is DomStringList) {
-      names = unwrap_jso(storeName_OR_storeNames);
+      names = storeName_OR_storeNames;
     } else if (storeName_OR_storeNames is List<String>) {
       names = convertDartToNative_List(storeName_OR_storeNames);
     } else {
       throw new ArgumentError("Invalid store(s) $store_Name_OR_storeNames");
     }
 
-    return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), names, mode));
+    return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, names, mode);
   }
 
   Transaction transactionList(List<String> storeNames, String mode) => transaction(storeNames, mode);
diff --git a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
index 19d77d1..1b13a76 100644
--- a/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_MessageEvent.darttemplate
@@ -35,7 +35,7 @@
   @DomName('MessageEvent.data')
   @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(
-      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+      _blink.BlinkMessageEvent.instance.data_Getter_(this));
 
 $else
   // TODO(alanknight): This really should be generated by the
diff --git a/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate b/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
index de07dcb..8a3e409 100644
--- a/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
+++ b/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
@@ -20,13 +20,7 @@
   }
 $if DARTIUM
   @DocsEditable()
-  $if JSINTEROP
-  static MutationObserver _create(callback) => wrap_jso(_blink.BlinkMutationObserver.instance.constructorCallback_1_((mutations, observer) {
-    callback(wrap_jso(mutations), wrap_jso(observer));
-  }));
-  $else
   static MutationObserver _create(callback) => _blink.BlinkMutationObserver.instance.constructorCallback_1_(callback);
-  $endif
 $endif
 
   /**
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index 17bc601..4362733 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -200,14 +200,7 @@
 $if DART2JS
   Node._created() : super._created();
 $else
-  Node._created() : super._created() {
-    // By this point blink_jsObject should be setup if it's not then we weren't
-    // called by the registerElement createdCallback - probably created() was
-    // called directly which is verboten.
-    if (this.blink_jsObject == null) {
-      throw new DomException.jsInterop("the created constructor cannot be called directly");
-    }
-  }
+  Node._created() : super._created();
 $endif
 
   /**
@@ -304,7 +297,7 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes => wrap_jso(_blink.BlinkNode.instance.childNodes_Getter_(unwrap_jso(this)));
+  List<Node> get childNodes => _blink.BlinkNode.instance.childNodes_Getter_(this);
 $else
   /**
    * A list of this node's children.
diff --git a/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
index 1aa46f4..9983a3e 100644
--- a/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
@@ -9,11 +9,11 @@
 $!MEMBERS
 $if DARTIUM
   // Override these methods for Dartium _SVGCursorElement can't be abstract.
-  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
-  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
-  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGCursorElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGCursorElement.instance.href_Getter_(unwrap_jso(this)));
-  bool hasExtension(String extension) => _blink.BlinkSVGCursorElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
+  StringList get requiredExtensions => _blink.BlinkSVGCursorElement.instance.requiredExtensions_Getter_(this);
+  StringList get requiredFeatures => _blink.BlinkSVGCursorElement.instance.requiredFeatures_Getter_(this);
+  StringList get systemLanguage => _blink.BlinkSVGCursorElement.instance.systemLanguage_Getter_(this);
+  AnimatedString get href => _blink.BlinkSVGCursorElement.instance.href_Getter_(this);
+  bool hasExtension(String extension) => _blink.BlinkSVGCursorElement.instance.hasExtension_Callback_1_(this, extension);
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
index b41f7ec..fec3eb6 100644
--- a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
@@ -146,18 +146,8 @@
 
 $if JSINTEROP
   set _svgClassName(AnimatedString value) =>
-      _blink.BlinkSVGElement.instance.className_Setter_(unwrap_jso(this), unwrap_jso(value));
+      _blink.BlinkSVGElement.instance.className_Setter_(this, value);
 
-  String get className => _svgClassName.baseVal;
-
-  // Unbelievable hack. We can't create an SvgAnimatedString, but we can get
-  // the existing one and change its baseVal. Then we call the blink setter directly
-  // TODO(alanknight): Handle suppressing the SVGAnimated<*> better
-  set className(String s) {
-    var oldClass = _svgClassName;
-    oldClass.baseVal = s;
-    _svgClassName = oldClass;
-  }
 $endif
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
index 96363a8..6f51e04 100644
--- a/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
@@ -9,11 +9,11 @@
 $!MEMBERS
 $if DARTIUM
   // Override these methods for Dartium _SVGFEDropShadowElement can't be abstract.
-  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.height_Getter_(unwrap_jso(this)));
-  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.result_Getter_(unwrap_jso(this)));
-  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.width_Getter_(unwrap_jso(this)));
-  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.x_Getter_(unwrap_jso(this)));
-  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.y_Getter_(unwrap_jso(this)));
+  AnimatedLength get height => _blink.BlinkSVGFEDropShadowElement.instance.height_Getter_(this);
+  AnimatedString get result => _blink.BlinkSVGFEDropShadowElement.instance.result_Getter_(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDropShadowElement.instance.width_Getter_(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDropShadowElement.instance.x_Getter_(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDropShadowElement.instance.y_Getter_(this);
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
index 4c88084..fd1178e 100644
--- a/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
@@ -9,7 +9,7 @@
 $!MEMBERS
 $if DARTIUM
   // Override these methods for Dartium _SVGGlyphRefElement can't be abstract.
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGGlyphRefElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGGlyphRefElement.instance.href_Getter_(this);
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
index 59e012e..649cbcf 100644
--- a/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
@@ -9,7 +9,7 @@
 $!MEMBERS
 $if DARTIUM
   // Override these methods for Dartium _SVGMPathElement can't be abstract.
-  AnimatedString get href => wrap_jso(_blink.BlinkSVGMPathElement.instance.href_Getter_(unwrap_jso(this)));
+  AnimatedString get href => _blink.BlinkSVGMPathElement.instance.href_Getter_(this);
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate b/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
index 42a803f..4cfa667 100644
--- a/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ServiceWorkerMessageEvent.darttemplate
@@ -17,7 +17,7 @@
   @DomName('ServiceWorkerMessageEvent.data')
   @DocsEditable()
   dynamic get data => convertNativeToDart_SerializedScriptValue(
-      _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+      _blink.BlinkMessageEvent.instance.data_Getter_(this));
 $else
   // TODO(alanknight): This really should be generated by the
   // _OutputConversion in the systemnative.py script, but that doesn't
diff --git a/tools/dom/templates/html/impl/impl_Touch.darttemplate b/tools/dom/templates/html/impl/impl_Touch.darttemplate
index bab04a5..889485d 100644
--- a/tools/dom/templates/html/impl/impl_Touch.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Touch.darttemplate
@@ -20,14 +20,14 @@
   int get __radiusX => JS('num', '#.radiusX', this).round();
   int get __radiusY => JS('num', '#.radiusY', this).round();
 $else
-  int get __clientX => _blink.BlinkTouch.instance.clientX_Getter_(unwrap_jso(this)).round();
-  int get __clientY => _blink.BlinkTouch.instance.clientY_Getter_(unwrap_jso(this)).round();
-  int get __screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this)).round();
-  int get __screenY => _blink.BlinkTouch.instance.screenY_Getter_(unwrap_jso(this)).round();
-  int get __pageX => _blink.BlinkTouch.instance.pageX_Getter_(unwrap_jso(this)).round();
-  int get __pageY => _blink.BlinkTouch.instance.pageY_Getter_(unwrap_jso(this)).round();
-  int get __radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(unwrap_jso(this)).round();
-  int get __radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this)).round();
+  int get __clientX => _blink.BlinkTouch.instance.clientX_Getter_(this).round();
+  int get __clientY => _blink.BlinkTouch.instance.clientY_Getter_(this).round();
+  int get __screenX => _blink.BlinkTouch.instance.screenX_Getter_(this).round();
+  int get __screenY => _blink.BlinkTouch.instance.screenY_Getter_(this).round();
+  int get __pageX => _blink.BlinkTouch.instance.pageX_Getter_(this).round();
+  int get __pageY => _blink.BlinkTouch.instance.pageY_Getter_(this).round();
+  int get __radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(this).round();
+  int get __radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(this).round();
 $endif
 
   @DomName('Touch.clientX')
diff --git a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
index a78940e..029a38b 100644
--- a/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WebGLRenderingContext.darttemplate
@@ -11,85 +11,68 @@
    * Sets the currently bound texture to [data].
    *
    * [data] can be either an [ImageElement], a
-   * [CanvasElement], a [VideoElement], or an [ImageData] object.
+   * [CanvasElement], a [VideoElement], [TypedData] or an [ImageData] object.
    *
-   * To use [texImage2d] with a TypedData object, use [texImage2dTyped].
-   *
+   * This is deprecated in favor of [texImage2D].
    */
-$if DART2JS
-  @JSName('texImage2D')
-  void texImage2DUntyped(int targetTexture, int levelOfDetail, 
-      int internalFormat, int format, int type, data) native;
-$else
-  void texImage2DUntyped(int targetTexture, int levelOfDetail, 
+  @Deprecated("Use texImage2D")
+  void texImage2DUntyped(int targetTexture, int levelOfDetail,
       int internalFormat, int format, int type, data) {
-    if (data is ImageElement) {
-      texImage2DImage(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    } else if (data is ImageData) {
-      texImage2DImageData(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    } else if (data is CanvasElement) {
-      texImage2DCanvas(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    } else {
-      texImage2DVideo(targetTexture, levelOfDetail, internalFormat, format,
-          type, data);
-    }
+    texImage2D(targetText, levelOfDetail, internalFormat, format, type, data);
   }
-$endif
 
   /**
    * Sets the currently bound texture to [data].
+   *
+   * This is deprecated in favour of [texImage2D].
    */
-$if DART2JS
-  @JSName('texImage2D')
-  void texImage2DTyped(int targetTexture, int levelOfDetail,
-      int internalFormat, int width, int height, int border, int format,
-      int type, TypedData data) native;
-$else
+  @Deprecated("Use texImage2D")
   void texImage2DTyped(int targetTexture, int levelOfDetail, int internalFormat,
       int width, int height, int border, int format, int type, TypedData data) {
     texImage2D(targetTexture, levelOfDetail, internalFormat,
         width, height, border, format, type, data);
   }
-$endif
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
    *
    * [data] can be either an [ImageElement], a
-   * [CanvasElement], a [VideoElement], or an [ImageData] object.
-   *
-   * To use [texSubImage2d] with a TypedData object, use [texSubImage2dTyped].
+   * [CanvasElement], a [VideoElement], [TypedData] or an [ImageData] object.
    *
    */
-$if DART2JS
-  @JSName('texSubImage2D')
+  @Deprecated("Use texSubImage2D")
   void texSubImage2DUntyped(int targetTexture, int levelOfDetail,
-      int xOffset, int yOffset, int format, int type, data) native;
-$else
-  void texSubImage2DUntyped(int targetTexture, int levelOfDetail, 
       int xOffset, int yOffset, int format, int type, data) {
     texSubImage2D(targetTexture, levelOfDetail, xOffset, yOffset,
         format, type, data);
   }
-$endif
 
   /**
    * Updates a sub-rectangle of the currently bound texture to [data].
    */
-$if DART2JS
-  @JSName('texSubImage2D')
+  @Deprecated("Use texSubImage2D")
   void texSubImage2DTyped(int targetTexture, int levelOfDetail,
       int xOffset, int yOffset, int width, int height, int border, int format,
-      int type, TypedData data) native;
-$else
-  void texSubImage2DTyped(int targetTexture, int levelOfDetail,
-      int xOffset, int yOffset, int width, int height, int format,
       int type, TypedData data) {
     texSubImage2D(targetTexture, levelOfDetail, xOffset, yOffset,
         width, height, format, type, data);
   }
-$endif
+
+  /**
+   * Set the bufferData to [data].
+   */
+  @Deprecated("Use bufferData")
+  void bufferDataTyped(int target, TypedData data, int usage) {
+    bufferData2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        format, type, data);
+  }
+
+  /**
+   * Set the bufferSubData to [data].
+   */
+  @Deprecated("Use bufferSubData")
+  void bufferSubDataTyped(int target, TypedData data, int usage) {
+    bufferSubData2D(targetTexture, levelOfDetail, xOffset, yOffset,
+        format, type, data);
+  }
 }
diff --git a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
index d4f5d3f..f141680 100644
--- a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
@@ -44,7 +44,7 @@
         type, convertDartToNative_Dictionary(options));
 
 $else
-    return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_2_(type, convertDartToNative_Dictionary(options)));
+    return _blink.BlinkWheelEvent.instance.constructorCallback_2_(type, convertDartToNative_Dictionary(options));
 $endif
   }
 
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index 0b64409..521fd00 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -297,19 +297,19 @@
 $else
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  int get pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(unwrap_jso(this)).round();
+  int get pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(this).round();
 
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  int get pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(unwrap_jso(this)).round();
+  int get pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(this).round();
 
   @DomName('Window.scrollX')
   @DocsEditable()
-  int get scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(unwrap_jso(this)).round();
+  int get scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(this).round();
 
   @DomName('Window.scrollY')
   @DocsEditable()
-  int get scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(unwrap_jso(this)).round();
+  int get scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(this).round();
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate b/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
index 73623a9..97ace81 100644
--- a/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
@@ -9,15 +9,15 @@
 $!MEMBERS
 $if DARTIUM
   // Override these methods for Dartium _WorkerLocation can't be abstract.
-  String get hash => _blink.BlinkWorkerLocation.instance.hash_Getter_(unwrap_jso(this));
-  String get host => _blink.BlinkWorkerLocation.instance.host_Getter_(unwrap_jso(this));
-  String get hostname => _blink.BlinkWorkerLocation.instance.hostname_Getter_(unwrap_jso(this));
-  String get href => _blink.BlinkWorkerLocation.instance.href_Getter_(unwrap_jso(this));
-  String get origin => _blink.BlinkWorkerLocation.instance.origin_Getter_(unwrap_jso(this));
-  String get pathname => _blink.BlinkWorkerLocation.instance.pathname_Getter_(unwrap_jso(this));
-  String get port => _blink.BlinkWorkerLocation.instance.port_Getter_(unwrap_jso(this));
-  String get protocol => _blink.BlinkWorkerLocation.instance.protocol_Getter_(unwrap_jso(this));
-  String get search => _blink.BlinkWorkerLocation.instance.search_Getter_(unwrap_jso(this));
+  String get hash => _blink.BlinkWorkerLocation.instance.hash_Getter_(this);
+  String get host => _blink.BlinkWorkerLocation.instance.host_Getter_(this);
+  String get hostname => _blink.BlinkWorkerLocation.instance.hostname_Getter_(this);
+  String get href => _blink.BlinkWorkerLocation.instance.href_Getter_(this);
+  String get origin => _blink.BlinkWorkerLocation.instance.origin_Getter_(this);
+  String get pathname => _blink.BlinkWorkerLocation.instance.pathname_Getter_(this);
+  String get port => _blink.BlinkWorkerLocation.instance.port_Getter_(this);
+  String get protocol => _blink.BlinkWorkerLocation.instance.protocol_Getter_(this);
+  String get search => _blink.BlinkWorkerLocation.instance.search_Getter_(this);
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate b/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
index 137390c..18707fb 100644
--- a/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
@@ -9,15 +9,15 @@
 $!MEMBERS
 $if DARTIUM
   // Override these methods for Dartium _WorkerNavigator can't be abstract.
-  String get appCodeName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
-  String get appName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
-  String get appVersion => _blink.BlinkWorkerNavigator.instance.appVersion_Getter_(unwrap_jso(this));
-  bool get dartEnabled => _blink.BlinkWorkerNavigator.instance.dartEnabled_Getter_(unwrap_jso(this));
-  String get platform => _blink.BlinkWorkerNavigator.instance.platform_Getter_(unwrap_jso(this));
-  String get product => _blink.BlinkWorkerNavigator.instance.product_Getter_(unwrap_jso(this));
-  String get userAgent => _blink.BlinkWorkerNavigator.instance.userAgent_Getter_(unwrap_jso(this));
-  int get hardwareConcurrency => _blink.BlinkWorkerNavigator.instance.hardwareConcurrency_Getter_(unwrap_jso(this));
-  bool get onLine => _blink.BlinkWorkerNavigator.instance.onLine_Getter_(unwrap_jso(this));
+  String get appCodeName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(this);
+  String get appName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(this);
+  String get appVersion => _blink.BlinkWorkerNavigator.instance.appVersion_Getter_(this);
+  bool get dartEnabled => _blink.BlinkWorkerNavigator.instance.dartEnabled_Getter_(this);
+  String get platform => _blink.BlinkWorkerNavigator.instance.platform_Getter_(this);
+  String get product => _blink.BlinkWorkerNavigator.instance.product_Getter_(this);
+  String get userAgent => _blink.BlinkWorkerNavigator.instance.userAgent_Getter_(this);
+  int get hardwareConcurrency => _blink.BlinkWorkerNavigator.instance.hardwareConcurrency_Getter_(this);
+  bool get onLine => _blink.BlinkWorkerNavigator.instance.onLine_Getter_(this);
 $endif
 }
 
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index 7ee15d1..9ad00f6 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -404,9 +404,9 @@
 $if JSINTEROP
   void open(String method, String url, {bool async, String user, String password}) {
     if (async == null && user == null && password == null) {
-      _blink.BlinkXMLHttpRequest.instance.open_Callback_2_(unwrap_jso(this), method, url);
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_2_(this, method, url);
     } else {
-      _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(unwrap_jso(this), method, url, async, user, password);
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(this, method, url, async, user, password);
     }
   }
 $else
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index a4abf47..0fe9f18 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -2634,16 +2634,6 @@
 }
 
 bool shouldRetryCommand(CommandOutput output) {
-  var command = output.command;
-  // We rerun tests on Safari because 6.2 and 7.1 are flaky. Issue 21434.
-  if (command is BrowserTestCommand &&
-      command.retry &&
-      command.browser == 'safari' &&
-      output is BrowserControllerTestOutcome &&
-      output._rawOutcome != Expectation.PASS) {
-    return true;
-  }
-
   if (!output.successful) {
     List<String> stdout, stderr;
 
@@ -2668,6 +2658,7 @@
     }
 
     // We currently rerun dartium tests, see issue 14074.
+    final command = output.command;
     if (command is BrowserTestCommand &&
         command.retry &&
         command.browser == 'dartium') {
