Version 2.12.0-78.0.dev

Merge commit 'c62709e87b0ae8b289b5e72389dcfe41518681e0' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 8315206..f616daa 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -258,6 +258,12 @@
       "languageVersion": "2.12"
     },
     {
+      "name": "file",
+      "rootUri": "../third_party/pkg/file/packages/file",
+      "packageUri": "lib/",
+      "languageVersion": "2.12"
+    },
+    {
       "name": "fixnum",
       "rootUri": "../third_party/pkg/fixnum",
       "packageUri": "lib/",
@@ -284,7 +290,7 @@
       "name": "glob",
       "rootUri": "../third_party/pkg/glob",
       "packageUri": "lib/",
-      "languageVersion": "2.2"
+      "languageVersion": "2.12"
     },
     {
       "name": "html",
diff --git a/DEPS b/DEPS
index 70e73aa..cee5f0a 100644
--- a/DEPS
+++ b/DEPS
@@ -104,7 +104,8 @@
   "dartdoc_rev" : "d79877d0764ce23ffea7055049f8da5dffce0308",
   "ffi_rev": "a5d4232cd38562c75a3ed847baa340e399538028",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
-  "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
+  "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
+  "glob_rev": "7c0ef8d4fa086f6b185c4dd724b700e7d7ad8f79",
   "html_rev": "22f17e97fedeacaa1e945cf84d8016284eed33a6",
   "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_rev" : "f1d1c9c024a293ab0a0e16f8b7632e87c708b448",
@@ -335,6 +336,9 @@
       Var("dart_git") + "ffi.git" + "@" + Var("ffi_rev"),
   Var("dart_root") + "/third_party/pkg/fixnum":
       Var("dart_git") + "fixnum.git" + "@" + Var("fixnum_rev"),
+  Var("dart_root") + "/third_party/pkg/file":
+      Var("dart_git") + "external/github.com/google/file.dart/"
+      + "@" + Var("file_rev"),
   Var("dart_root") + "/third_party/pkg/glob":
       Var("dart_git") + "glob.git" + "@" + Var("glob_rev"),
   Var("dart_root") + "/third_party/pkg/html":
diff --git a/pkg/test_runner/lib/src/browser_controller.dart b/pkg/test_runner/lib/src/browser_controller.dart
index 708d185..fce0fca 100644
--- a/pkg/test_runner/lib/src/browser_controller.dart
+++ b/pkg/test_runner/lib/src/browser_controller.dart
@@ -298,8 +298,8 @@
     // We run killAndResetSafari in a Zone as opposed to running an external
     // process. The Zone allows us to collect its output, and protect the rest
     // of the test infrastructure against errors in it.
-    runZoned(zoneWrapper,
-        zoneSpecification: specification, onError: handleUncaughtError);
+    runZonedGuarded(zoneWrapper, handleUncaughtError,
+        zoneSpecification: specification);
 
     try {
       await completer.future;
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 91e0731..6f5d5f2 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -862,7 +862,6 @@
 
     print("Cannot create URL for path $file. Not in build or dart directory.");
     exit(1);
-    throw "unreachable";
   }
 
   String _uriForBrowserTest(String pathComponent) {
diff --git a/pkg/test_runner/pubspec.yaml b/pkg/test_runner/pubspec.yaml
index be9765a..9fad3c1 100644
--- a/pkg/test_runner/pubspec.yaml
+++ b/pkg/test_runner/pubspec.yaml
@@ -22,10 +22,14 @@
 dev_dependencies:
   expect:
     path: ../expect
-  glob:
-    path: ../../third_party/pkg/glob    
+  file: any
+  glob: any
 dependency_overrides:
   # Other packages in the dependency graph have normal hosted dependencies on
   # this, so just override it to force the local one.
   args:
     path: ../../third_party/pkg/args
+  file:
+    path: ../../third_party/pkg/file/packages/file
+  glob:
+    path: ../../third_party/pkg/glob
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index 7432ff2..add8fe5 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -7,7 +7,9 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
+import 'package:file/file.dart' as pkg_file;
 import 'package:glob/glob.dart';
+import 'package:glob/list_local_fs.dart';
 import 'package:path/path.dart' as p;
 
 import 'package:test_runner/src/command_output.dart';
@@ -130,7 +132,7 @@
   for (var entry in glob.listSync(root: root)) {
     if (!entry.path.endsWith(".dart")) continue;
 
-    if (entry is File) {
+    if (entry is pkg_file.File) {
       await _processFile(entry,
           dryRun: dryRun,
           remove: removeSources,
diff --git a/tools/VERSION b/tools/VERSION
index e8cbc46..c5859ca 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 77
+PRERELEASE 78
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch b/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch
new file mode 100644
index 0000000..da7f66b
--- /dev/null
+++ b/tools/patches/flutter-engine/ce76503f5b461590926ba619351518d593b81153.patch
@@ -0,0 +1,14 @@
+diff --git a/DEPS b/DEPS
+index 17f3f9f68..39b78c735 100644
+--- a/DEPS
++++ b/DEPS
+@@ -198,6 +198,9 @@ deps = {
+   'src/third_party/dart/third_party/pkg/ffi':
+    Var('dart_git') + '/ffi.git@a5d4232cd38562c75a3ed847baa340e399538028',
+ 
++  'src/third_party/dart/third_party/pkg/file':
++   Var('dart_git') + '/external/github.com/google/file.dart@0e09370f581ab6388d46fda4cdab66638c0171a1',
++
+   'src/third_party/dart/third_party/pkg/fixnum':
+    Var('dart_git') + '/fixnum.git@16d3890c6dc82ca629659da1934e412292508bba',
+