[dart] Remove obsolete browser fallback on test-matrix versions

Change-Id: I6fed7fd166e442a6a76f4c521cabf81af895f7ee
Reviewed-on: https://dart-review.googlesource.com/c/recipes/+/203620
Reviewed-by: Karl Klose <karlklose@google.com>
Commit-Queue: Alexander Thomas <athom@google.com>
diff --git a/README.recipes.md b/README.recipes.md
index 82c6b92..90d9b21 100644
--- a/README.recipes.md
+++ b/README.recipes.md
@@ -87,13 +87,11 @@
 
 Deletes the debug log file
 
-&mdash; **def [download\_browser](/recipe_modules/dart/api.py#1001)(self, runtime, version):**
-
 &mdash; **def [get\_secret](/recipe_modules/dart/api.py#93)(self, name):**
 
 Decrypts the specified secret and returns the location of the result
 
-&mdash; **def [has\_infra\_failure](/recipe_modules/dart/api.py#1290)(self, failure):**
+&mdash; **def [has\_infra\_failure](/recipe_modules/dart/api.py#1256)(self, failure):**
 
 Returns whether failure is an aggregated failure that directly or
 indirectly contains an InfraFailure.
@@ -185,39 +183,39 @@
 &mdash; **def [RunSteps](/recipes/dart/external.py#27)(api, properties):**
 ### *recipes* / [dart/flutter\_engine](/recipes/dart/flutter_engine.py)
 
-[DEPS](/recipes/dart/flutter_engine.py#17): [build/goma][build/recipe_modules/goma], [bisect\_build](#recipe_modules-bisect_build), [dart](#recipe_modules-dart), [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
+[DEPS](/recipes/dart/flutter_engine.py#16): [build/goma][build/recipe_modules/goma], [bisect\_build](#recipe_modules-bisect_build), [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
 
-&mdash; **def [AnalyzeDartUI](/recipes/dart/flutter_engine.py#80)(api, engine_src):**
+&mdash; **def [AnalyzeDartUI](/recipes/dart/flutter_engine.py#79)(api, engine_src):**
 
-&mdash; **def [Build](/recipes/dart/flutter_engine.py#63)(api, engine_src, config, \*targets):**
+&mdash; **def [Build](/recipes/dart/flutter_engine.py#62)(api, engine_src, config, \*targets):**
 
-&mdash; **def [BuildAndTest](/recipes/dart/flutter_engine.py#402)(api, start_dir, engine_src, flutter_rev):**
+&mdash; **def [BuildAndTest](/recipes/dart/flutter_engine.py#401)(api, start_dir, engine_src, flutter_rev):**
 
-&mdash; **def [BuildLinux](/recipes/dart/flutter_engine.py#113)(api, engine_src):**
+&mdash; **def [BuildLinux](/recipes/dart/flutter_engine.py#112)(api, engine_src):**
 
-&mdash; **def [BuildLinuxAndroidArm](/recipes/dart/flutter_engine.py#97)(api, engine_src):**
+&mdash; **def [BuildLinuxAndroidArm](/recipes/dart/flutter_engine.py#96)(api, engine_src):**
 
-&mdash; **def [BuildLinuxAndroidx86](/recipes/dart/flutter_engine.py#90)(api, engine_src):**
+&mdash; **def [BuildLinuxAndroidx86](/recipes/dart/flutter_engine.py#89)(api, engine_src):**
 
-&mdash; **def [CopyArtifacts](/recipes/dart/flutter_engine.py#194)(api, engine_src, cached_dest, file_paths):**
+&mdash; **def [CopyArtifacts](/recipes/dart/flutter_engine.py#193)(api, engine_src, cached_dest, file_paths):**
 
-&mdash; **def [GetCheckout](/recipes/dart/flutter_engine.py#140)(api, start_dir, engine_src):**
+&mdash; **def [GetCheckout](/recipes/dart/flutter_engine.py#139)(api, start_dir, engine_src):**
 
-&mdash; **def [KillTasks](/recipes/dart/flutter_engine.py#49)(api, engine_src, ok_ret='any'):**
+&mdash; **def [KillTasks](/recipes/dart/flutter_engine.py#48)(api, engine_src, ok_ret='any'):**
 
 Kills leftover tasks from previous runs or steps.
 
-&mdash; **def [RunGN](/recipes/dart/flutter_engine.py#72)(api, engine_src, \*args):**
+&mdash; **def [RunGN](/recipes/dart/flutter_engine.py#71)(api, engine_src, \*args):**
 
-&mdash; **def [RunSteps](/recipes/dart/flutter_engine.py#372)(api):**
+&mdash; **def [RunSteps](/recipes/dart/flutter_engine.py#371)(api):**
 
-&mdash; **def [TestEngine](/recipes/dart/flutter_engine.py#85)(api, engine_src):**
+&mdash; **def [TestEngine](/recipes/dart/flutter_engine.py#84)(api, engine_src):**
 
-&mdash; **def [TestFlutter](/recipes/dart/flutter_engine.py#292)(api, start_dir, engine_src, just_built_dart_sdk):**
+&mdash; **def [TestFlutter](/recipes/dart/flutter_engine.py#291)(api, start_dir, engine_src, just_built_dart_sdk):**
 
-&mdash; **def [TestObservatory](/recipes/dart/flutter_engine.py#129)(api, engine_src):**
+&mdash; **def [TestObservatory](/recipes/dart/flutter_engine.py#128)(api, engine_src):**
 
-&mdash; **def [UpdateCachedEngineArtifacts](/recipes/dart/flutter_engine.py#207)(api, flutter, engine_src):**
+&mdash; **def [UpdateCachedEngineArtifacts](/recipes/dart/flutter_engine.py#206)(api, flutter, engine_src):**
 ### *recipes* / [dart/forward\_branch](/recipes/dart/forward_branch.py)
 
 [DEPS](/recipes/dart/forward_branch.py#8): [dart](#recipe_modules-dart), [depot\_tools/git][depot_tools/recipe_modules/git], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
@@ -252,7 +250,7 @@
 
 [DEPS](/recipe_modules/dart/examples/example.py#21): [build](#recipe_modules-build), [dart](#recipe_modules-dart), [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/swarming][recipe_engine/recipe_modules/swarming]
 
-&mdash; **def [RunSteps](/recipe_modules/dart/examples/example.py#303)(api):**
+&mdash; **def [RunSteps](/recipe_modules/dart/examples/example.py#299)(api):**
 ### *recipes* / [dart:examples/example-get\_secret](/recipe_modules/dart/examples/example-get_secret.py)
 
 [DEPS](/recipe_modules/dart/examples/example-get_secret.py#7): [dart](#recipe_modules-dart), [recipe\_engine/platform][recipe_engine/recipe_modules/platform]
diff --git a/recipe_modules/dart/api.py b/recipe_modules/dart/api.py
index fbdcadf..948622d 100644
--- a/recipe_modules/dart/api.py
+++ b/recipe_modules/dart/api.py
@@ -710,7 +710,6 @@
       if builder.endswith(('-beta', '-dev', 'experimental', '-stable', '-try')):
         builder = builder[0:builder.rfind('-')]
       isolate_hashes = {}
-      global_config = test_matrix['global']
       config = None
       for c in test_matrix['builder_configurations']:
         if builder in c['builders']:
@@ -721,7 +720,7 @@
             'Error, could not find builder by name %s in test-matrix' % builder)
       self.delete_debug_log()
       self._write_file_sets(test_matrix['filesets'])
-      self._run_steps(config, isolate_hashes, builder, global_config)
+      self._run_steps(config, isolate_hashes, builder)
 
 
   def _write_file_sets(self, filesets):
@@ -774,7 +773,7 @@
     return self._get_specific_argument(arguments, options) is not None
 
 
-  def _run_steps(self, config, isolate_hashes, builder_name, global_config):
+  def _run_steps(self, config, isolate_hashes, builder_name):
     """Executes all steps from a json test-matrix builder entry"""
     # Find information from the builder name. It should be in the form
     # <info>-<os>-<mode>-<arch>-<runtime> or <info>-<os>-<mode>-<arch>.
@@ -838,8 +837,6 @@
     assert SDK_PACKAGE in packages
     assert CO19_PACKAGE in packages
     assert CO19_LEGACY_PACKAGE in packages
-    has_firefox = FIREFOX_PACKAGE in packages
-    has_chrome = CHROME_PACKAGE in packages
 
     out = 'xcodebuild' if self.m.platform.name == 'mac' else 'out'
     build_root = out + '/' + mode.capitalize() + arch.upper()
@@ -851,25 +848,13 @@
         'build_root': build_root,
         'copy-coredumps': False,
         'packages': packages,
+        'runtime': runtime,
         'out': out
     }
     # Linux and vm-*-win builders should use copy-coredumps
     environment['copy-coredumps'] = (system == 'linux' or system == 'mac' or
             (system.startswith('win') and builder_name.startswith('vm-')))
 
-    if runtime is not None:
-      if runtime == 'ff':
-        runtime = 'firefox' # pragma: no cover
-      environment['runtime'] = runtime
-      if ((not has_chrome and runtime == 'chrome') or
-          (not has_firefox and runtime == 'firefox')):
-        # TODO(athom): remove legacy download browser feature when release
-        # branches have the browser DEPS (2.9 has merged to stable).
-        version = global_config[runtime]
-        self.download_browser(runtime, version)
-        package = CHROME_PACKAGE if runtime == 'chrome' else FIREFOX_PACKAGE
-        path = 'third_party/browsers/%s' % runtime
-        packages[package] = (package, 'version:%s' % version, path)
     test_steps = []
     sharded_steps = []
     try:
@@ -997,24 +982,6 @@
         finally:
           self._present_results(logs_str, results_str, flaky_json_str)
 
-
-  def download_browser(self, runtime, version):
-    # Download CIPD package
-    #  dart/browsers/<runtime>/${platform} <version>
-    # to directory
-    #  [sdk root]/third_party/browsers
-    # Shards must install this CIPD package to the same location -
-    # there is an argument to the swarming module task creation api for this.
-    browser_path = self.m.path['checkout'].join('third_party', 'browsers',
-                                                runtime)
-    self.m.file.ensure_directory('create browser cache', browser_path)
-    version_tag = 'version:%s' % version
-    package = 'dart/browsers/%s/${platform}' % runtime
-    ensure_file = self.m.cipd.EnsureFile().add_package(package, version_tag)
-    self.m.cipd.ensure(browser_path, ensure_file)
-    return browser_path
-
-
   def _upload_results_to_bq(self, results_str):
     if self._is_bisecting() or not results_str:
       return  # pragma: no cover
@@ -1107,13 +1074,13 @@
     # global runtime.
     ensure_file = self.m.cipd.EnsureFile()
 
-    def _add_package(condition, name, browser_arg):
+    def _add_package(name, browser_arg):
       if browser_arg and environment['packages'].get(name):
         ensure_file.add_package(*environment['packages'][name])
         args.append(browser_arg)
 
-    _add_package('chrome', CHROME_PACKAGE, CHROME_PATH_ARGUMENT.get(system))
-    _add_package('firefox', FIREFOX_PACKAGE, FIREFOX_PATH_ARGUMENT.get(system))
+    _add_package(CHROME_PACKAGE, CHROME_PATH_ARGUMENT.get(system))
+    _add_package(FIREFOX_PACKAGE, FIREFOX_PATH_ARGUMENT.get(system))
 
     with self.m.step.defer_results():
       self._run_script(
@@ -1135,8 +1102,7 @@
     Args:
       * step (TestMatrixStep) - The test-matrix step.
       * args ([str]) - Overrides the arguments specified in the step.
-      * cipd_packages ([tuple]) - list of 3-tuples specifying a cipd package
-        to be downloaded
+      * cipd_ensure_file ([EnsureFile]) - specifies cipd package dependencies.
       * ignore_failure ([bool]) - Do not turn step red if this script fails.
       * shards ([int]) - Overrides the number of shards specified in the step.
     """
diff --git a/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json b/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json
index c5ca164..291042b 100644
--- a/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json
+++ b/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/basic-mac.json b/recipe_modules/dart/examples/example.expected/basic-mac.json
index 93d9d75..8d1a54f 100644
--- a/recipe_modules/dart/examples/example.expected/basic-mac.json
+++ b/recipe_modules/dart/examples/example.expected/basic-mac.json
@@ -406,10 +406,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/basic-missing-name.json b/recipe_modules/dart/examples/example.expected/basic-missing-name.json
index 284956f..770bc4b 100644
--- a/recipe_modules/dart/examples/example.expected/basic-missing-name.json
+++ b/recipe_modules/dart/examples/example.expected/basic-missing-name.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/basic.json b/recipe_modules/dart/examples/example.expected/basic.json
index b2435fa..666ba88 100644
--- a/recipe_modules/dart/examples/example.expected/basic.json
+++ b/recipe_modules/dart/examples/example.expected/basic.json
@@ -445,10 +445,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/bisection-does-not-refer-to-latest-build-or-publish-results.json b/recipe_modules/dart/examples/example.expected/bisection-does-not-refer-to-latest-build-or-publish-results.json
index 0b70c50..13e7dce 100644
--- a/recipe_modules/dart/examples/example.expected/bisection-does-not-refer-to-latest-build-or-publish-results.json
+++ b/recipe_modules/dart/examples/example.expected/bisection-does-not-refer-to-latest-build-or-publish-results.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
@@ -500,50 +496,6 @@
   },
   {
     "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox"
-    ],
-    "infra_step": true,
-    "name": "create browser cache"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox",
-      "-ensure-file",
-      "dart/browsers/firefox/${platform} version:61",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:61------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"dart/browsers/firefox/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
       "cipd",
       "ensure",
       "-root",
@@ -556,7 +508,7 @@
       "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "ensure_installed (2)",
+    "name": "ensure_installed",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
@@ -677,7 +629,7 @@
       "-server",
       "https://example.swarmingserver.appspot.com",
       "-json-input",
-      "{\"requests\": [{\"name\": \"test1_shard_1\", \"priority\": \"25\", \"service_account\": \"\", \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cas_input_root\": {\"cas_instance\": \"projects/example-cas-server/instances/default_instance\", \"digest\": {\"hash\": \"test_hash\", \"size_bytes\": \"47\"}}, \"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/browsers/firefox/${platform}\", \"path\": \"third_party/browsers/firefox\", \"version\": \"version:61\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"version:2.9.0-18.0.dev\"}]}, \"command\": [\"/usr/bin/xvfb-run\", \"-a\", \"--server-args=-screen 0 1024x768x24\", \"python\", \"-u\", \"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-linux-firefox\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--copy-coredumps\", \"--firefox=third_party/browsers/firefox/firefox/firefox\", \"--shards=2\", \"--shard=1\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Linux\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"io_timeout_secs\": \"1200\", \"outputs\": [], \"relative_cwd\": \"\"}, \"wait_for_capacity\": false}]}, {\"name\": \"test1_shard_2\", \"priority\": \"25\", \"service_account\": \"\", \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cas_input_root\": {\"cas_instance\": \"projects/example-cas-server/instances/default_instance\", \"digest\": {\"hash\": \"test_hash\", \"size_bytes\": \"47\"}}, \"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/browsers/firefox/${platform}\", \"path\": \"third_party/browsers/firefox\", \"version\": \"version:61\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"version:2.9.0-18.0.dev\"}]}, \"command\": [\"/usr/bin/xvfb-run\", \"-a\", \"--server-args=-screen 0 1024x768x24\", \"python\", \"-u\", \"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-linux-firefox\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--copy-coredumps\", \"--firefox=third_party/browsers/firefox/firefox/firefox\", \"--shards=2\", \"--shard=2\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Linux\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"io_timeout_secs\": \"1200\", \"outputs\": [], \"relative_cwd\": \"\"}, \"wait_for_capacity\": false}]}]}",
+      "{\"requests\": [{\"name\": \"test1_shard_1\", \"priority\": \"25\", \"service_account\": \"\", \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cas_input_root\": {\"cas_instance\": \"projects/example-cas-server/instances/default_instance\", \"digest\": {\"hash\": \"test_hash\", \"size_bytes\": \"47\"}}, \"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"version:2.9.0-18.0.dev\"}]}, \"command\": [\"/usr/bin/xvfb-run\", \"-a\", \"--server-args=-screen 0 1024x768x24\", \"python\", \"-u\", \"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-linux-firefox\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--copy-coredumps\", \"--shards=2\", \"--shard=1\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Linux\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"io_timeout_secs\": \"1200\", \"outputs\": [], \"relative_cwd\": \"\"}, \"wait_for_capacity\": false}]}, {\"name\": \"test1_shard_2\", \"priority\": \"25\", \"service_account\": \"\", \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cas_input_root\": {\"cas_instance\": \"projects/example-cas-server/instances/default_instance\", \"digest\": {\"hash\": \"test_hash\", \"size_bytes\": \"47\"}}, \"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"version:2.9.0-18.0.dev\"}]}, \"command\": [\"/usr/bin/xvfb-run\", \"-a\", \"--server-args=-screen 0 1024x768x24\", \"python\", \"-u\", \"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-linux-firefox\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--copy-coredumps\", \"--shards=2\", \"--shard=2\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Linux\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"io_timeout_secs\": \"1200\", \"outputs\": [], \"relative_cwd\": \"\"}, \"wait_for_capacity\": false}]}]}",
       "-json-output",
       "/path/to/tmp/json"
     ],
@@ -770,11 +722,6 @@
       "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:3.8.1rc1.chromium.10\"@@@",
       "@@@STEP_LOG_LINE@json.input@                }, @@@",
       "@@@STEP_LOG_LINE@json.input@                {@@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"package_name\": \"dart/browsers/firefox/${platform}\", @@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"path\": \"third_party/browsers/firefox\", @@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:61\"@@@",
-      "@@@STEP_LOG_LINE@json.input@                }, @@@",
-      "@@@STEP_LOG_LINE@json.input@                {@@@",
       "@@@STEP_LOG_LINE@json.input@                  \"package_name\": \"dart/dart-sdk/${platform}\", @@@",
       "@@@STEP_LOG_LINE@json.input@                  \"path\": \"tools/sdks\", @@@",
       "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:2.9.0-18.0.dev\"@@@",
@@ -800,7 +747,6 @@
       "@@@STEP_LOG_LINE@json.input@              \"--bar\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"-e co19, language_2\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--copy-coredumps\", @@@",
-      "@@@STEP_LOG_LINE@json.input@              \"--firefox=third_party/browsers/firefox/firefox/firefox\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--shards=2\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--shard=1\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--output-directory=${ISOLATED_OUTDIR}\"@@@",
@@ -899,11 +845,6 @@
       "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:3.8.1rc1.chromium.10\"@@@",
       "@@@STEP_LOG_LINE@json.input@                }, @@@",
       "@@@STEP_LOG_LINE@json.input@                {@@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"package_name\": \"dart/browsers/firefox/${platform}\", @@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"path\": \"third_party/browsers/firefox\", @@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:61\"@@@",
-      "@@@STEP_LOG_LINE@json.input@                }, @@@",
-      "@@@STEP_LOG_LINE@json.input@                {@@@",
       "@@@STEP_LOG_LINE@json.input@                  \"package_name\": \"dart/dart-sdk/${platform}\", @@@",
       "@@@STEP_LOG_LINE@json.input@                  \"path\": \"tools/sdks\", @@@",
       "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:2.9.0-18.0.dev\"@@@",
@@ -929,7 +870,6 @@
       "@@@STEP_LOG_LINE@json.input@              \"--bar\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"-e co19, language_2\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--copy-coredumps\", @@@",
-      "@@@STEP_LOG_LINE@json.input@              \"--firefox=third_party/browsers/firefox/firefox/firefox\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--shards=2\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--shard=2\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--output-directory=${ISOLATED_OUTDIR}\"@@@",
@@ -1127,7 +1067,6 @@
       "--bar",
       "co19",
       "--copy-coredumps",
-      "--firefox=third_party/browsers/firefox/firefox/firefox",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_2"
     ],
@@ -1484,7 +1423,7 @@
       "-server",
       "https://example.swarmingserver.appspot.com",
       "-json-input",
-      "{\"requests\": [{\"name\": \"test1_shard_1\", \"priority\": \"25\", \"service_account\": \"\", \"tags\": [\"optional:true\"], \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cas_input_root\": {\"cas_instance\": \"projects/example-cas-server/instances/default_instance\", \"digest\": {\"hash\": \"test_hash\", \"size_bytes\": \"47\"}}, \"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/browsers/firefox/${platform}\", \"path\": \"third_party/browsers/firefox\", \"version\": \"version:61\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"version:2.9.0-18.0.dev\"}]}, \"command\": [\"/usr/bin/xvfb-run\", \"-a\", \"--server-args=-screen 0 1024x768x24\", \"python\", \"-u\", \"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-linux-firefox\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--repeat=5\", \"--tests\", \"Flaky/Test/1\\nFlaky/Test/2\", \"--copy-coredumps\", \"--firefox=third_party/browsers/firefox/firefox/firefox\", \"--shards=1\", \"--shard=1\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Linux\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"io_timeout_secs\": \"1200\", \"outputs\": [], \"relative_cwd\": \"\"}, \"wait_for_capacity\": false}]}]}",
+      "{\"requests\": [{\"name\": \"test1_shard_1\", \"priority\": \"25\", \"service_account\": \"\", \"tags\": [\"optional:true\"], \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cas_input_root\": {\"cas_instance\": \"projects/example-cas-server/instances/default_instance\", \"digest\": {\"hash\": \"test_hash\", \"size_bytes\": \"47\"}}, \"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"version:2.9.0-18.0.dev\"}]}, \"command\": [\"/usr/bin/xvfb-run\", \"-a\", \"--server-args=-screen 0 1024x768x24\", \"python\", \"-u\", \"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-linux-firefox\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--repeat=5\", \"--tests\", \"Flaky/Test/1\\nFlaky/Test/2\", \"--copy-coredumps\", \"--shards=1\", \"--shard=1\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Linux\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"io_timeout_secs\": \"1200\", \"outputs\": [], \"relative_cwd\": \"\"}, \"wait_for_capacity\": false}]}]}",
       "-json-output",
       "/path/to/tmp/json"
     ],
@@ -1569,11 +1508,6 @@
       "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:3.8.1rc1.chromium.10\"@@@",
       "@@@STEP_LOG_LINE@json.input@                }, @@@",
       "@@@STEP_LOG_LINE@json.input@                {@@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"package_name\": \"dart/browsers/firefox/${platform}\", @@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"path\": \"third_party/browsers/firefox\", @@@",
-      "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:61\"@@@",
-      "@@@STEP_LOG_LINE@json.input@                }, @@@",
-      "@@@STEP_LOG_LINE@json.input@                {@@@",
       "@@@STEP_LOG_LINE@json.input@                  \"package_name\": \"dart/dart-sdk/${platform}\", @@@",
       "@@@STEP_LOG_LINE@json.input@                  \"path\": \"tools/sdks\", @@@",
       "@@@STEP_LOG_LINE@json.input@                  \"version\": \"version:2.9.0-18.0.dev\"@@@",
@@ -1602,7 +1536,6 @@
       "@@@STEP_LOG_LINE@json.input@              \"--tests\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"Flaky/Test/1\\nFlaky/Test/2\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--copy-coredumps\", @@@",
-      "@@@STEP_LOG_LINE@json.input@              \"--firefox=third_party/browsers/firefox/firefox/firefox\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--shards=1\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--shard=1\", @@@",
       "@@@STEP_LOG_LINE@json.input@              \"--output-directory=${ISOLATED_OUTDIR}\"@@@",
@@ -1707,7 +1640,6 @@
       "--tests",
       "Flaky/Test/1\nFlaky/Test/2",
       "--copy-coredumps",
-      "--firefox=third_party/browsers/firefox/firefox/firefox",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_5"
     ],
diff --git a/recipe_modules/dart/examples/example.expected/branch-builder-does-not-publish-results.json b/recipe_modules/dart/examples/example.expected/branch-builder-does-not-publish-results.json
index 5ef08c8..7259bc2 100644
--- a/recipe_modules/dart/examples/example.expected/branch-builder-does-not-publish-results.json
+++ b/recipe_modules/dart/examples/example.expected/branch-builder-does-not-publish-results.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/ci-test-data-branch-builder-does-publish-results.json b/recipe_modules/dart/examples/example.expected/ci-test-data-branch-builder-does-publish-results.json
index 74bae01..776773c 100644
--- a/recipe_modules/dart/examples/example.expected/ci-test-data-branch-builder-does-publish-results.json
+++ b/recipe_modules/dart/examples/example.expected/ci-test-data-branch-builder-does-publish-results.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/example-android.json b/recipe_modules/dart/examples/example.expected/example-android.json
index 8a1aed7..cae8be0 100644
--- a/recipe_modules/dart/examples/example.expected/example-android.json
+++ b/recipe_modules/dart/examples/example.expected/example-android.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/example-mac.json b/recipe_modules/dart/examples/example.expected/example-mac.json
index 063420b..712e043 100644
--- a/recipe_modules/dart/examples/example.expected/example-mac.json
+++ b/recipe_modules/dart/examples/example.expected/example-mac.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/fuzz-test.json b/recipe_modules/dart/examples/example.expected/fuzz-test.json
index e2948e7..eb743e2 100644
--- a/recipe_modules/dart/examples/example.expected/fuzz-test.json
+++ b/recipe_modules/dart/examples/example.expected/fuzz-test.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/release-builder-does-not-publish-results.json b/recipe_modules/dart/examples/example.expected/release-builder-does-not-publish-results.json
index cd72f2e..57b8240 100644
--- a/recipe_modules/dart/examples/example.expected/release-builder-does-not-publish-results.json
+++ b/recipe_modules/dart/examples/example.expected/release-builder-does-not-publish-results.json
@@ -397,10 +397,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.expected/vm-win.json b/recipe_modules/dart/examples/example.expected/vm-win.json
index b9e6b85..173db0b 100644
--- a/recipe_modules/dart/examples/example.expected/vm-win.json
+++ b/recipe_modules/dart/examples/example.expected/vm-win.json
@@ -411,10 +411,6 @@
       "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"test\": \"[]\", @@@",
       "@@@STEP_LOG_LINE@json.output@    \"trigger\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"61\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@}@@@",
       "@@@STEP_LOG_END@json.output@@@"
diff --git a/recipe_modules/dart/examples/example.py b/recipe_modules/dart/examples/example.py
index 5b41e7f..d9311d6 100644
--- a/recipe_modules/dart/examples/example.py
+++ b/recipe_modules/dart/examples/example.py
@@ -94,10 +94,6 @@
         "test": "[]",
         "trigger": "[]"
     },
-    "global": {
-        "chrome": "66.0.3359.139",
-        "firefox": "61"
-    },
     "builder_configurations": [{
         "builders": ["vm-kernel-win-release-simarm_x64",],
         "meta": {},
diff --git a/recipes/dart/flutter_engine.py b/recipes/dart/flutter_engine.py
index 5ada220..c303570 100644
--- a/recipes/dart/flutter_engine.py
+++ b/recipes/dart/flutter_engine.py
@@ -7,7 +7,6 @@
 from recipe_engine import recipe_api
 from recipe_engine.post_process import (
     DoesNotRunRE,
-    DropExpectation,
     Filter,
     MustRun,
     StatusSuccess,
@@ -16,13 +15,13 @@
 
 DEPS = [
     'bisect_build',
-    'dart',
     'depot_tools/bot_update',
     'depot_tools/depot_tools',
     'depot_tools/gclient',
     'depot_tools/gitiles',
     'build/goma',
     'recipe_engine/buildbucket',
+    'recipe_engine/cipd',
     'recipe_engine/context',
     'recipe_engine/file',
     'recipe_engine/json',
@@ -425,7 +424,7 @@
     # The chrome version is the version of a package at:
     # http://go/cipd/p/dart/browsers/chrome/linux-amd64/
     chrome_version = '84'
-    browser_dir = api.dart.download_browser('chrome', chrome_version)
+    browser_dir = _download_browser(api, 'chrome', chrome_version)
     chrome_executable = browser_dir.join('chrome', 'google-chrome')
     flutter_env = {
         'PATH':
@@ -458,6 +457,20 @@
         TestFlutter(api, start_dir, engine_src, just_built_dart_sdk)
 
 
+def _download_browser(api, runtime, version):
+  # Download CIPD package
+  #  dart/browsers/<runtime>/${platform} <version>
+  # to directory
+  #  [sdk root]/third_party/browsers
+  browser_path = api.path['checkout'].join('third_party', 'browsers', runtime)
+  api.file.ensure_directory('create browser cache', browser_path)
+  version_tag = 'version:%s' % version
+  package = 'dart/browsers/%s/${platform}' % runtime
+  ensure_file = api.cipd.EnsureFile().add_package(package, version_tag)
+  api.cipd.ensure(browser_path, ensure_file)
+  return browser_path
+
+
 def _test(api, name, failure=False):
   data = api.test(
       name,
diff --git a/recipes/dart/neo.expected/failing-test-step-starts-bisection.json b/recipes/dart/neo.expected/failing-test-step-starts-bisection.json
index 6e113f0..217e387 100644
--- a/recipes/dart/neo.expected/failing-test-step-starts-bisection.json
+++ b/recipes/dart/neo.expected/failing-test-step-starts-bisection.json
@@ -291,56 +291,6 @@
   },
   {
     "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "create browser cache"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox",
-      "-ensure-file",
-      "dart/browsers/firefox/${platform} version:60.0.1",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:60.0.1--\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"dart/browsers/firefox/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
       "python",
       "-u",
       "[CACHE]/builder/sdk/tools/task_kill.py",
@@ -854,7 +804,6 @@
       "-e co19",
       "language_2",
       "--cleanup-dart-processes",
-      "--firefox=third_party/browsers/firefox/firefox/firefox.exe",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_1"
     ],
@@ -951,7 +900,6 @@
       "-mdebug",
       "-nfirefox-foo-debug-x64-bar",
       "--cleanup-dart-processes",
-      "--firefox=third_party/browsers/firefox/firefox/firefox.exe",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_2"
     ],
diff --git a/recipes/dart/neo.expected/infra-failure-does-not-start-bisection.json b/recipes/dart/neo.expected/infra-failure-does-not-start-bisection.json
index 971a419..1ced915 100644
--- a/recipes/dart/neo.expected/infra-failure-does-not-start-bisection.json
+++ b/recipes/dart/neo.expected/infra-failure-does-not-start-bisection.json
@@ -291,56 +291,6 @@
   },
   {
     "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "create browser cache"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox",
-      "-ensure-file",
-      "dart/browsers/firefox/${platform} version:60.0.1",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:60.0.1--\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"dart/browsers/firefox/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
       "python",
       "-u",
       "[CACHE]/builder/sdk/tools/task_kill.py",
@@ -854,7 +804,6 @@
       "-e co19",
       "language_2",
       "--cleanup-dart-processes",
-      "--firefox=third_party/browsers/firefox/firefox/firefox.exe",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_1"
     ],
@@ -951,7 +900,6 @@
       "-mdebug",
       "-nfirefox-foo-debug-x64-bar",
       "--cleanup-dart-processes",
-      "--firefox=third_party/browsers/firefox/firefox/firefox.exe",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_2"
     ],
diff --git a/recipes/dart/neo.expected/successful-build-does-not-start-bisection.json b/recipes/dart/neo.expected/successful-build-does-not-start-bisection.json
index cabbee5..09b47b4 100644
--- a/recipes/dart/neo.expected/successful-build-does-not-start-bisection.json
+++ b/recipes/dart/neo.expected/successful-build-does-not-start-bisection.json
@@ -291,56 +291,6 @@
   },
   {
     "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "ensure-directory",
-      "--mode",
-      "0777",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "create browser cache"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/builder/sdk/third_party/browsers/firefox",
-      "-ensure-file",
-      "dart/browsers/firefox/${platform} version:60.0.1",
-      "-max-threads",
-      "0",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:60.0.1--\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"dart/browsers/firefox/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
       "python",
       "-u",
       "[CACHE]/builder/sdk/tools/task_kill.py",
@@ -854,7 +804,6 @@
       "-e co19",
       "language_2",
       "--cleanup-dart-processes",
-      "--firefox=third_party/browsers/firefox/firefox/firefox.exe",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_1"
     ],
@@ -951,7 +900,6 @@
       "-mdebug",
       "-nfirefox-foo-debug-x64-bar",
       "--cleanup-dart-processes",
-      "--firefox=third_party/browsers/firefox/firefox/firefox.exe",
       "--output-directory",
       "[CLEANUP]/tmp_tmp_2"
     ],