Version 2.14.0-64.0.dev

Merge commit '8488b37aae8d2305e30069e4cc63ee13fb2b5c38' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 8af538d..ca2f072 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-04-27T17:23:41.776651",
+  "generated": "2021-04-29T10:51:01.320402",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
diff --git a/DEPS b/DEPS
index 10f29bf..bbac264 100644
--- a/DEPS
+++ b/DEPS
@@ -163,7 +163,7 @@
   "test_process_tag": "2.0.0",
   "term_glyph_rev": "6a0f9b6fb645ba75e7a00a4e20072678327a0347",
   "test_reflective_loader_rev": "54e930a11c372683792e22bddad79197728c91ce",
-  "test_rev": "e673623f45d75ccec750d35271b0b4d1423e9fac",
+  "test_rev": "433f1d8726f9c1484007588470b17830a5e97a12",
   "typed_data_tag": "f94fc57b8e8c0e4fe4ff6cfd8290b94af52d3719",
   "usage_rev": "5b7317ba89166f3cf1af98cb280a4cc8e78f25f9",
   "vector_math_rev": "0c9f5d68c047813a6dcdeb88ba7a42daddf25025",
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
index ec70e94..d0ad288d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "dart:core" as core;
-import "package:test_core/test_core.dart" as tes;
-import "package:test_api/src/frontend/expect.dart" as exp;
+import "package:test_core/scaffolding.dart" as sca;
+import "package:test_api/src/expect/expect.dart" as exp;
 
 import "package:test/test.dart";
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
@@ -18,7 +18,7 @@
     } =>#t3);
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
-  tes::test(() → Null {
+  sca::test(() → Null {
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 2);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(), false);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
index 71dc247..8a6a03a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
@@ -1,8 +1,8 @@
 library #lib;
 import self as self;
 import "generated/foo.pb.dart" as pb;
-import "package:test_core/test_core.dart" as tes;
-import "package:test_api/src/frontend/expect.dart" as exp;
+import "package:test_core/scaffolding.dart" as sca;
+import "package:test_api/src/expect/expect.dart" as exp;
 import "dart:core" as core;
 
 import "package:test/test.dart";
@@ -11,7 +11,7 @@
 [@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>]static field core::List<core::int*>* buffer = <core::int*>[10, 4, 8, 5, 16, 4, 26, 9, 10, 3, 102, 111, 111, 18, 2, 8, 42, 34, 9, 10, 3, 122, 111, 112, 18, 2, 8, 3, 40, 43, 50, 0, 58, 0];
 static method main() → dynamic {
   pb::FooKeep* foo = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>] self::buffer);
-  tes::test(() → Null {
+  sca::test(() → Null {
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 42);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}, 43);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
index b750159..df6916b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "dart:core" as core;
-import "package:test_core/test_core.dart" as tes;
+import "package:test_core/scaffolding.dart" as sca;
 import "package:protobuf/protobuf.dart" as pro;
-import "package:test_api/src/frontend/expect.dart" as exp;
-import "package:test_api/src/frontend/throws_matcher.dart" as thr;
+import "package:test_api/src/expect/expect.dart" as exp;
+import "package:test_api/src/expect/throws_matcher.dart" as thr;
 
 import "package:test/test.dart";
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
@@ -20,13 +20,13 @@
     } =>#t3);
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
-  tes::test(() → Null {
+  sca::test(() → Null {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.freeze] [@vm.inferred-type.metadata=!? (skip check)] foo.{pro::GeneratedMessage::freeze}();
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 2);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(), false);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}, 43);
-    exp::expect(() → void => [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(), [@vm.inferred-type.metadata=library package:test_api/src/frontend/throws_matcher.dart::Throws] thr::throwsA());
+    exp::expect(() → void => [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.clearClearKeep] [@vm.inferred-type.metadata=!? (skip check)] foo.{pb::FooKeep::clearClearKeep}(), [@vm.inferred-type.metadata=library package:test_api/src/expect/throws_matcher.dart::Throws] thr::throwsA());
   });
 }
 library foo.pb.dart /*isNonNullableByDefault*/;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index b25a9bd..6ade06e 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -16953,6 +16953,8 @@
   @JSName('clearWatch')
   void _clearWatch(int watchID) native;
 
+  @Creates('Geoposition')
+  @Creates('PositionError')
   void _getCurrentPosition(_PositionCallback successCallback,
       [_PositionErrorCallback? errorCallback, Map? options]) {
     if (options != null) {
@@ -16972,14 +16974,22 @@
   }
 
   @JSName('getCurrentPosition')
+  @Creates('Geoposition')
+  @Creates('PositionError')
   void _getCurrentPosition_1(
       successCallback, _PositionErrorCallback? errorCallback, options) native;
   @JSName('getCurrentPosition')
+  @Creates('Geoposition')
+  @Creates('PositionError')
   void _getCurrentPosition_2(
       successCallback, _PositionErrorCallback? errorCallback) native;
   @JSName('getCurrentPosition')
+  @Creates('Geoposition')
+  @Creates('PositionError')
   void _getCurrentPosition_3(successCallback) native;
 
+  @Creates('Geoposition')
+  @Creates('PositionError')
   int _watchPosition(_PositionCallback successCallback,
       [_PositionErrorCallback? errorCallback, Map? options]) {
     if (options != null) {
@@ -16996,12 +17006,18 @@
   }
 
   @JSName('watchPosition')
+  @Creates('Geoposition')
+  @Creates('PositionError')
   int _watchPosition_1(
       successCallback, _PositionErrorCallback? errorCallback, options) native;
   @JSName('watchPosition')
+  @Creates('Geoposition')
+  @Creates('PositionError')
   int _watchPosition_2(successCallback, _PositionErrorCallback? errorCallback)
       native;
   @JSName('watchPosition')
+  @Creates('Geoposition')
+  @Creates('PositionError')
   int _watchPosition_3(successCallback) native;
 }
 
@@ -17021,7 +17037,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.
 
-@Native("Position")
+@Native("Position,GeolocationPosition")
 class Geoposition extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory Geoposition._() {
@@ -25723,13 +25739,13 @@
 // WARNING: Do not edit - generated code.
 
 @Unstable()
-typedef void _PositionCallback(Geoposition position);
+typedef void _PositionCallback(position);
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 @Unstable()
-@Native("PositionError")
+@Native("PositionError,GeolocationPositionError")
 class PositionError extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory PositionError._() {
diff --git a/tools/VERSION b/tools/VERSION
index f0e2f0a..5c5e3c3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 63
+PRERELEASE 64
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 7dbf7aa..7b6f549 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -8567,6 +8567,17 @@
     },
     "support_level": "stable"
   },
+  "GeolocationPosition": {
+    "members": {
+      "coords": {
+        "support_level": "untriaged"
+      },
+      "timestamp": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Geoposition": {
     "comment": "http://dev.w3.org/geo/api/spec-source.html#position",
     "dart_action": "unstable",
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 4479d2d..b33dc8d 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -386,7 +386,7 @@
 interface ImageData {
     [DartSuppress] ImageDataColorSettings getColorSettings();
     // Below needs 'any' because ImageDataArray is union of (Uint8ClampedArray
-    // or Uint16Array or Float32Array) 
+    // or Uint16Array or Float32Array)
     [DartSuppress] readonly attribute any dataUnion;
 };
 
@@ -648,3 +648,7 @@
     [DartSuppress, CEReactions] attribute DOMString nonce;
     [CEReactions] attribute DOMString? nonce;
 };
+
+// PositionCallback can be used on a deprecated Position object,
+// a GeolocationPosition object, or a Firefox-specific object.
+callback PositionCallback = void(object position);
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 4909c41..ee4d4a4 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -171,6 +171,16 @@
             "@Creates('JSExtendableArray|GamepadButton')",
             "@Returns('JSExtendableArray')",
         ],
+        # Creates a GeolocationPosition or a GeolocationPositionError for a
+        # callback. See issue #45562.
+        'Geolocation.getCurrentPosition': [
+            "@Creates('Geoposition')",
+            "@Creates('PositionError')",
+        ],
+        'Geolocation.watchPosition': [
+            "@Creates('Geoposition')",
+            "@Creates('PositionError')",
+        ],
         'HTMLCanvasElement.getContext': [
             "@Creates('CanvasRenderingContext2D|RenderingContext|RenderingContext2')",
             "@Returns('CanvasRenderingContext2D|RenderingContext|RenderingContext2|Null')",
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 0a07e20..d8ad435 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -292,7 +292,7 @@
         'ApplicationCache':
         'ApplicationCache,DOMApplicationCache,OfflineResourceList',
         'Event':
-        'Event,InputEvent,SubmitEvent', # Workaround for issue 40901.
+        'Event,InputEvent,SubmitEvent',  # Workaround for issue 40901.
         'HTMLTableCellElement':
         'HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement',
         'GainNode':
@@ -311,6 +311,10 @@
         'OscillatorNode,Oscillator',
         'PannerNode':
         'PannerNode,AudioPannerNode,webkitAudioPannerNode',
+        'Position':
+        'Position,GeolocationPosition',
+        'PositionError':
+        'PositionError,GeolocationPositionError',
         'RTCPeerConnection':
         'RTCPeerConnection,webkitRTCPeerConnection,mozRTCPeerConnection',
         'RTCIceCandidate':