diff --git a/tools/testing/__init__.py b/tools/testing/__init__.py
deleted file mode 100644
index 4df76e2..0000000
--- a/tools/testing/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-# for 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 test_runner
-import utils
-
-
-# Constants used for test outcomes
-SKIP = 'skip'
-FAIL = 'fail'
-PASS = 'pass'
-OKAY = 'okay'
-TIMEOUT = 'timeout'
-CRASH = 'crash'
-SLOW = 'slow'
-
-HOST_CPUS = utils.GuessCpus()
-USE_DEFAULT_CPUS = -1
diff --git a/tools/testing/browser_README.txt b/tools/testing/browser_README.txt
deleted file mode 100644
index 2ec2f35..0000000
--- a/tools/testing/browser_README.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-Overview:
- These are the instructions to run a wide variety of browser tests using 
- test.dart or dart/tools/testing/perf_testing/run_perf_tests.py. Currently 
- the results of run_perf_tests are uploaded to
- https://dartperf.googleplex.com/. 
- 
-========= General Browser Setup ==========
-
-See instructions on:
-https://code.google.com/p/dart/wiki/BrowserTestSetup
-
-========= Proceed further only if you also want to run performance tests.======
-
-1) Pull down benchmarks from internal repo (Google only): goto/dartbrowsersetup
-
-2) Create a directory in called appengine-python in third_party. Download the 
-   Linux/Other Platforms .zip file, and place the contents in the directory 
-   you just created. 
-   http://code.google.com/appengine/downloads.html#Google_App_Engine_SDK_for_Python
-
-3) Run the tests! While standing in dart/tools/testing/perf_testing, run 
-   $> python run_perf_tests.py --forever --verbose 
-   to run all the tests (browser performance, language correctness in the
-   browser, command line performance, and self-hosted compile time and compiled
-   code size). 
-
-   You can run individual tests by adding the particular option (such as 
-   --language) when running create_graph.py. Type "create_graph.py -h" for a 
-   full list of the options.
diff --git a/tools/testing/extensions/chrome/ConsoleCollector.crx b/tools/testing/extensions/chrome/ConsoleCollector.crx
deleted file mode 100644
index f853917..0000000
--- a/tools/testing/extensions/chrome/ConsoleCollector.crx
+++ /dev/null
Binary files differ
diff --git a/tools/testing/extensions/chrome/ConsoleCollector/background.js b/tools/testing/extensions/chrome/ConsoleCollector/background.js
deleted file mode 100644
index 21ae577..0000000
--- a/tools/testing/extensions/chrome/ConsoleCollector/background.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This is the background window. It can access the necessary APIs to get
- * at the console messages. It can only communicate with the content
- * window through message passing.
- *
- * There is no way to query the console messages, as such, but we can
- * set up a handler that is called when there are console messages. This 
- * will be called with any console messages already present, so it can be set
- * up after the fact. However, if there are no messages it won't be called.
- * To handle the end of the messages (or no messages) we have to use a 
- * sentinel message that is logged by the content page.
- */
-var version = "1.0";
-var messages = []; // An array that we can put messages in.
-var debuggeeId; // An object that identifies the browser tab we are talking to.
-var callback; // For passing back the response to the content window.
-var timer; // To time out if no messages are available.
-
-/**
- * When we have collected all the messages, we send them back to the
- * content page via the callback, turn off message collection, and
- * detach the debugger from the browser tab.
- */
-function allDone() {
-  callback(messages); 
-  chrome.debugger.sendCommand(debuggeeId, "Console.clearMessages", {},
-      function() {
-        chrome.debugger.sendCommand(debuggeeId, "Console.disable", {},
-            function() {});
-        chrome.debugger.detach(debuggeeId, function() {});
-  });
-  messages = [];
-}
-
-/**
- * Debugger event handler. We only care about console.messageAdded
- * events, in which case we add a new message object with the fields
- * we care about to our messages array.
- */
-function onEvent(debuggeeId, method, params) {
-  var tabId = debuggeeId.tabId;
-  if (method == "Console.messageAdded") {
-    var msg = params.message;
-    // More fields are available if we want them later. See
-    // https://developers.google.com/chrome-developer-tools/docs/protocol/1.0/console#type-ConsoleMessage
-    if (msg.text == 'getMessages/end') {
-      allDone();
-    } else {
-      messages.push({"source":msg.url, "line": msg.line,
-          "category":msg.source, "message":msg.text });
-    }
-  }
-}
-
-/**
- * Handle requests sent by the content script. We save the callback,
- * get the window and tab that is currently active, attach the 
- * debugger to that tab, and then turn on console message event 
- * handling, which will result in onEvent calls for each console 
- * message, including the ones that are already present in the console.
- */
-function onRequest(request, sender, sendResponse) {
-  if (request.command == "getMessages") {
-    callback = sendResponse;
-    chrome.windows.getCurrent(function(win) {
-      chrome.tabs.getSelected(win.id, function(tab) {
-        debuggeeId = {tabId:tab.id};
-        chrome.debugger.attach(debuggeeId, version, function() {
-          if (chrome.extension.lastError) {
-            // Attach failed; send an empty response.
-            callback([]);
-          } else {
-            chrome.debugger.sendCommand(debuggeeId, "Console.enable", {},
-              function() {});
-            //timer = setTimeout(allDone, 1000);
-          }
-        });
-      });
-    });
-  }
-}
-
-// Set up the general handler for debug events.
-chrome.debugger.onEvent.addListener(onEvent);
-// Listen for the content script to send a message to the background page.
-chrome.extension.onRequest.addListener(onRequest);
diff --git a/tools/testing/extensions/chrome/ConsoleCollector/content.js b/tools/testing/extensions/chrome/ConsoleCollector/content.js
deleted file mode 100644
index 6339f81..0000000
--- a/tools/testing/extensions/chrome/ConsoleCollector/content.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * This is the content page script. This runs in the context of the browser
- * page, and communicates with the background page by relaying a getMessages
- * request, and the forwarding the messages back to the browser page as a
- * gotMessages message.
- */
-window.addEventListener("message", function(event) {
-  if (event.source == window && event.data == "getMessages") {
-    // Log a special sentinel message to mark the end of the messages.
-    console.log('getMessages/end');
-    chrome.extension.sendRequest({command: "getMessages"}, function(messages) {
-      window.postMessage({ "type": "gotMessages", "messages" : messages}, "*");
-    });
-  }
-}, false);
diff --git a/tools/testing/extensions/chrome/ConsoleCollector/manifest.json b/tools/testing/extensions/chrome/ConsoleCollector/manifest.json
deleted file mode 100644
index 6f6b439..0000000
--- a/tools/testing/extensions/chrome/ConsoleCollector/manifest.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "name": "Console Collector",
-  "version": "1.0",
-  "manifest_version": 2,
-  "description": "Allow querying of the Javascript console.",
-  "browser_action": {
-    "name": "ConsoleCollector"
-  },
-  "background": {
-    "scripts": ["background.js"],
-    "persistent": true
-  },
-  "content_scripts": [
-    {
-      "matches": ["http://*/*", "file://*" ],
-      "js": [ "content.js" ]
-    }
-  ],
-  "permissions": [
-    "tabs", "http://*/*", "file://*", "debugger"
-  ]
-}
diff --git a/tools/testing/extensions/firefox/ConsoleCollector.xpi b/tools/testing/extensions/firefox/ConsoleCollector.xpi
deleted file mode 100644
index 40c261e..0000000
--- a/tools/testing/extensions/firefox/ConsoleCollector.xpi
+++ /dev/null
Binary files differ
diff --git a/tools/testing/extensions/firefox/ConsoleCollector/Makefile b/tools/testing/extensions/firefox/ConsoleCollector/Makefile
deleted file mode 100644
index f6c8610..0000000
--- a/tools/testing/extensions/firefox/ConsoleCollector/Makefile
+++ /dev/null
@@ -1,2 +0,0 @@
-../ConsoleCollector.xpi: chrome.manifest install.rdf  chrome/content/console.js chrome/content/overlay.xul
-	zip -r ../ConsoleCollector.xpi chrome.manifest install.rdf  chrome/content/console.js chrome/content/overlay.xul
diff --git a/tools/testing/extensions/firefox/ConsoleCollector/chrome.manifest b/tools/testing/extensions/firefox/ConsoleCollector/chrome.manifest
deleted file mode 100644
index 5425ba6..0000000
--- a/tools/testing/extensions/firefox/ConsoleCollector/chrome.manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-content   ConsoleCollector                chrome/content/
-overlay   chrome://browser/content/browser.xul   chrome://ConsoleCollector/content/overlay.xul
diff --git a/tools/testing/extensions/firefox/ConsoleCollector/chrome/content/console.js b/tools/testing/extensions/firefox/ConsoleCollector/chrome/content/console.js
deleted file mode 100644
index af46de4..0000000
--- a/tools/testing/extensions/firefox/ConsoleCollector/chrome/content/console.js
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This Firefox add-on exposes the Javascript console contents to Javascript
-// running in the browser. Once this is installed there will be a new
-// window.ConsoleCollector object with read() and clear() functions.
-
-var ConsoleCollector = {};
- 
-(function() {
-  // An array for collecting the messages.
-  var messages = [];
-
-  // Add a console message to the collection.
-  this.add = function(message) {
-    messages.push(message);
-  };
-
-  // Read the message collection. As a side effect we clear the message list.
-  this.read = function(type) {
-    var rtn = [];
-    for (var i = 0; i < messages.length; i++) {
-      var message = messages[i];
-      if (message.errorMessage) {
-        rtn.push({ 'time' : message.timeStamp,
-                 'source' : message.sourceName,
-                 'line': message.lineNumber,
-                 'column': message.columnNumber,
-                 'category': message.category,
-                 'message' : message.errorMessage });
-      }
-    }
-    messages = [];
-    return rtn;
-  };
-
-  // Clear the message list.
-  this.clear = function() {
-    messages = [];
-  };
-}).apply(ConsoleCollector);
-
-// A Console Listener.
-// See https://developer.mozilla.org/en-US/docs/Console_service for
-// details.
-(function() {
-
-  var consoleService;
-
-  var consoleListener = {
-    observe: function(e) {
-      try {
-        var message = e.QueryInterface(Components.interfaces.nsIScriptError);
-        ConsoleCollector.add(message);
-      } catch (exception) {
-        ConsoleCollector.add(e);
-      }      
-    },
-
-    QueryInterface: function (iid) {
-      if (!iid.equals(Components.interfaces.nsIConsoleListener) &&
-      !iid.equals(Components.interfaces.nsISupports)) {
-        throw Components.results.NS_ERROR_NO_INTERFACE;
-      }
-      return this;
-    }
-  };
-  
-  // Start collecting console messages.
-  function initialize(event) {
-    consoleService = Components.classes['@mozilla.org/consoleservice;1']
-                   .getService(Components.interfaces.nsIConsoleService);
-    if (consoleService) {
-      consoleService.registerListener(consoleListener); 
-    }                              
-    // Add the handler for hooking in to each page's DOM. This handler
-    // is for each "gBrowser", representing a tab/window.
-    window.getBrowser().addEventListener("load", onPageLoad, true);
-  }
-
-  // Stop collecting console messages.
-  function shutdown(event) {
-    window.getBrowser().removeEventListener("load", onPageLoad);
-    consoleService.unregisterListener(consoleListener);   
-    ConsoleCollector.clear();
-  }
-  
-  // Hook the ConsoleCollector into the DOM as window.ConsoleCollector.
-  var onPageLoad = function(e) {
-    var win = e.originalTarget.defaultView;
-    if (win) {
-      win.wrappedJSObject.ConsoleCollector = ConsoleCollector;
-    }
-  };
-
-  // Add the handlers to initialize the add-on and shut it down.
-  // These handlers are for the application as a whole.
-  window.addEventListener('load', initialize, false);
-  window.addEventListener('unload', shutdown, false);
-}());
-
-
-
diff --git a/tools/testing/extensions/firefox/ConsoleCollector/chrome/content/overlay.xul b/tools/testing/extensions/firefox/ConsoleCollector/chrome/content/overlay.xul
deleted file mode 100644
index 21347fb..0000000
--- a/tools/testing/extensions/firefox/ConsoleCollector/chrome/content/overlay.xul
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<overlay id="ConsoleCollector-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script src="console.js"/>
-</overlay>
diff --git a/tools/testing/extensions/firefox/ConsoleCollector/install.rdf b/tools/testing/extensions/firefox/ConsoleCollector/install.rdf
deleted file mode 100644
index 3966143..0000000
--- a/tools/testing/extensions/firefox/ConsoleCollector/install.rdf
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
-    xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-  <Description about="urn:mozilla:install-manifest">
-    <em:id>ConsoleCollector@google.com</em:id>
-    <em:name>Console collector</em:name>
-    <em:version>0.2</em:version>    
-    <em:description>Exposes the Javascript console to each browser window.
-    </em:description>
-    <em:creator>Graham Wheeler</em:creator>
-    <em:homepageURL>http://www.dartlang.org</em:homepageURL>
-    <em:targetApplication>
-      <Description>
-        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- Firefox -->
-        <em:minVersion>3.0</em:minVersion>
-        <em:maxVersion>15.0</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-  </Description>
-</RDF>
diff --git a/tools/testing/run_selenium.py b/tools/testing/run_selenium.py
deleted file mode 100755
index e270619..0000000
--- a/tools/testing/run_selenium.py
+++ /dev/null
@@ -1,390 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-#
-
-"""Script to actually open a browser and perform the test, and reports back with
-the result. It uses Selenium WebDriver when possible for running the tests. It
-uses Selenium RC for Safari.
-
-If started with --batch this script runs a batch of in-browser tests in
-the same browser process.
-
-Normal mode:
-$ python run_selenium.py --browser=ff --timeout=60 path/to/test.html
-
-Exit code indicates pass or fail
-
-Batch mode:
-$ python run_selenium.py --batch
-stdin:  --browser=ff --timeout=60 path/to/test.html
-stdout: >>> TEST PASS
-stdin:  --browser=ff --timeout=60 path/to/test2.html
-stdout: >>> TEST FAIL
-stdin:  --terminate
-$
-"""
-
-import os
-import optparse
-import platform
-import selenium
-from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
-from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
-from selenium.webdriver.support.ui import WebDriverWait
-import shutil
-import signal
-import socket
-import sys
-import time
-import urllib2
-import threading
-
-TIMEOUT_ERROR_MSG = 'FAIL (timeout)'
-CRASH_ERROR_MSG = 'CRASH'
-
-def correctness_test_done(source):
-  """Checks if test has completed."""
-  return ('PASS' in source) or ('FAIL' in source)
-
-def perf_test_done(source):
-  """Tests to see if our performance test is done by printing a score."""
-  #This code is written this way to work around a current instability in the
-  # python webdriver bindings if you call driver.get_element_by_id.
-  #TODO(efortuna): Access these elements in a nicer way using DOM parser.
-  string = '<div id="status">'
-  index = source.find(string)
-  end_index = source.find('</div>', index+1)
-  source = source[index + len(string):end_index]
-  return 'Score:' in source
-
-# TODO(vsm): Ideally, this wouldn't live in this file.
-CONFIGURATIONS = {
-    'correctness': correctness_test_done,
-    'perf': perf_test_done
-}
-
-def run_test_in_browser(browser, html_out, timeout, mode, refresh):
-  """Run the desired test in the browser using Selenium 2.0 WebDriver syntax,
-  and wait for the test to complete. This is the newer syntax, that currently
-  supports Firefox, Chrome, IE, Opera (and some mobile browsers)."""
-
-  if isinstance(browser, selenium.selenium):
-    return run_test_in_browser_selenium_rc(browser, html_out, timeout, mode,
-        refresh)
-
-  browser.get(html_out)
-  if refresh:
-    browser.refresh()
-  try:
-    def pythonTimeout():
-      # The builtin quit call for chrome will call close on the RemoteDriver
-      # which may hang. Explicitly call browser.service.stop()
-      if (type(browser) is selenium.webdriver.chrome.webdriver.WebDriver):
-        # Browser may be dead
-        try:
-          browser.service.stop()
-        except:
-          print("Trying to close browser that has already been closed")
-    # If the browser is crashing selenium may not time out.
-    # Explicitly catch this case with a python timer.
-    t = threading.Timer(timeout, pythonTimeout)
-    t.start()
-    test_done = CONFIGURATIONS[mode]
-    element = WebDriverWait(browser, float(timeout)).until(
-        lambda driver: test_done(driver.page_source))
-    t.cancel()
-    return browser.page_source
-  except selenium.common.exceptions.TimeoutException:
-    return TIMEOUT_ERROR_MSG
-  except:
-    return CRASH_ERROR_MSG
-
-def run_test_in_browser_selenium_rc(sel, html_out, timeout, mode, refresh):
-  """ Run the desired test in the browser using Selenium 1.0 syntax, and wait
-  for the test to complete. This is used for Safari, since it is not currently
-  supported on Selenium 2.0."""
-  sel.open(html_out)
-  if refresh:
-    sel.refresh()
-  source = sel.get_html_source()
-  end_condition = CONFIGURATIONS[mode]
-
-  elapsed = 0
-  while (not end_condition(source)) and elapsed <= timeout:
-    sec = .25
-    time.sleep(sec)
-    elapsed += sec
-    source = sel.get_html_source()
-  return source
-
-def parse_args(args=None):
-  parser = optparse.OptionParser()
-  parser.add_option('--out', dest='out',
-      help = 'The path for html output file that we will running our test from',
-      action = 'store', default = '')
-  parser.add_option('--browser', dest='browser',
-      help = 'The browser type (default = chrome)',
-      action = 'store', default = 'chrome')
-  parser.add_option('--executable', dest='executable',
-      help = 'The browser executable path (only for browser=dartium)',
-      action = 'store', default = None)
-  # TODO(efortuna): Put this back up to be more than the default timeout in
-  # test.dart. Right now it needs to be less than 60 so that when test.dart
-  # times out, this script also closes the browser windows.
-  parser.add_option('--timeout', dest = 'timeout',
-      help = 'Amount of time (seconds) to wait before timeout', type = 'int',
-      action = 'store', default=58)
-  parser.add_option('--mode', dest = 'mode',
-      help = 'The type of test we are running',
-      action = 'store', default='correctness')
-  parser.add_option('--force-refresh', dest='refresh',
-      help='Force the browser to refresh before getting results from this test '
-      '(used for browser multitests).', action='store_true', default=False)
-  args, _ = parser.parse_args(args=args)
-  args.out = args.out.strip('"')
-  if args.executable and args.browser != 'dartium':
-    print 'Executable path only supported when browser=dartium.'
-    sys.exit(1)
-  return (args.out, args.browser, args.executable, args.timeout, args.mode,
-      args.refresh)
-
-def print_server_error():
-  """Provide the user an informative error message if we attempt to connect to
-  the Selenium remote control server, but cannot access it. Then exit the
-  program."""
-  print ('ERROR: Could not connect to Selenium RC server. Are you running'
-      ' java -jar tools/testing/selenium-server-standalone-*.jar? If not, '
-      'start it before running this test.')
-  sys.exit(1)
-
-def start_browser(browser, executable_path, html_out):
-  if browser == 'chrome' or browser == 'dartium':
-    # Note: you need ChromeDriver *in your path* to run Chrome, in addition to
-    # installing Chrome. Also note that the build bot runs have a different path
-    # from a normal user -- check the build logs.
-    options = selenium.webdriver.chrome.options.Options()
-    if browser == 'dartium':
-      script_dir = os.path.dirname(os.path.abspath(__file__))
-      dartium_dir = os.path.join(script_dir, '..', '..', 'client', 'tests',
-                                 'dartium')
-      # enable ShadowDOM and style scoped for Dartium
-      options.add_argument('--enable-shadow-dom')
-      options.add_argument('--enable-style-scoped')
-      if executable_path is not None:
-        options.binary_location = executable_path
-      elif platform.system() == 'Windows':
-        options.binary_location = os.path.join(dartium_dir, 'chrome.exe')
-      elif platform.system() == 'Darwin':
-        options.binary_location = os.path.join(dartium_dir, 'Chromium.app',
-                                               'Contents', 'MacOS', 'Chromium')
-      else:
-        options.binary_location = os.path.join(dartium_dir, 'chrome')
-    return selenium.webdriver.Chrome(chrome_options=options)
-  elif browser == 'ff':
-    script_dir = os.path.dirname(os.path.abspath(__file__))
-    profile = selenium.webdriver.firefox.firefox_profile.FirefoxProfile()
-    profile.set_preference('dom.max_script_run_time', 0)
-    profile.set_preference('dom.max_chrome_script_run_time', 0)
-    profile.set_preference('app.update.auto', True)
-    profile.set_preference('app.update.enabled', True)
-    return selenium.webdriver.Firefox(firefox_profile=profile)
-  elif ((browser == 'ie9' or browser == 'ie10') and
-      platform.system() == 'Windows'):
-    return selenium.webdriver.Ie()
-  elif browser == 'safari' and platform.system() == 'Darwin':
-    # TODO(efortuna): Ensure our preferences (no pop-up blocking) file is the
-    # same (Safari auto-deletes when it has too many "crashes," or in our case,
-    # timeouts). Come up with a less hacky way to do this.
-    backup_safari_prefs = os.path.dirname(__file__) + '/com.apple.Safari.plist'
-    if os.path.exists(backup_safari_prefs):
-      shutil.copy(backup_safari_prefs,
-           '/Library/Preferences/com.apple.Safari.plist')
-    sel = selenium.selenium('localhost', 4444, "*safari", html_out)
-    try:
-      sel.start()
-      return sel
-    except socket.error:
-      print_server_error()
-  elif browser == 'opera':
-    try:
-      driver = RemoteWebDriver(desired_capabilities=DesiredCapabilities.OPERA)
-      # By default, Opera sets their script timeout (the amount of time they
-      # expect to hear back from the JavaScript file) to be 10 seconds. We just
-      # make it an impossibly large number so that it doesn't time out for this
-      # reason, so it behaves like all of the other browser drivers.
-      driver.set_script_timeout(9000)
-      # If the webpage contains document.onreadystatechanged = function() {...}
-      # page load event does not correctly get fired and caught (OperaDriver
-      # bug). This is a band-aid.
-      driver.set_page_load_timeout(1)
-      return driver
-    except urllib2.URLError:
-      print_server_error()
-  else:
-    raise Exception('Incompatible browser and platform combination.')
-
-def close_browser(browser):
-  if browser is None:
-    return
-  if isinstance(browser, selenium.selenium):
-    browser.stop()
-    return
-
-  # A timeout exception is thrown if nothing happens within the time limit.
-  if (type(browser) is not selenium.webdriver.chrome.webdriver.WebDriver and
-      type(browser) is not selenium.webdriver.ie.webdriver.WebDriver):
-    browser.close()
-
-  browser.quit()
-
-def report_results(mode, source, browser):
-  if mode != 'correctness':
-    # We're running a performance test.
-    print source.encode('utf8')
-    sys.stdout.flush()
-    if 'NaN' in source:
-      return 1
-    else:
-      return 0
-  else:
-    # We're running a correctness test. Mark test as passing if all individual
-    # test cases pass.
-    if 'FAIL' not in source and 'PASS' in source:
-      print 'Content-Type: text/plain\nPASS'
-      return 0
-    else:
-      #The hacky way to get document.getElementById('body').innerHTML for this
-      # webpage, without the JavaScript.
-      #TODO(efortuna): Access these elements in a nicer way using DOM parser.
-      index = source.find('<body>')
-      index += len('<body>')
-      end_index = source.find('</body')
-      print unicode(source[index : end_index]).encode("utf-8")
-      return 1
-
-
-def run_batch_tests():
-  '''
-  Runs a batch of in-browser tests in the same browser process. Batching
-  gives faster throughput and makes tests less subject to browser starting
-  flakiness, issues with too many browser processes running, etc.
-
-  When running this function, stdin/stdout is used to communicate with the test
-  framework. See BatchRunnerProcess in test_runner.dart for the other side of
-  this communication channel
-
-  Example of usage:
-  $ python run_selenium.py --batch
-  stdin:  --browser=ff --timeout=60 path/to/test.html
-  stdout: >>> TEST PASS
-  stdin:  --browser=ff --timeout=60 path/to/test2.html
-  stdout: >>> TEST FAIL
-  stdin:  --terminate
-  $
-  '''
-
-  print '>>> BATCH START'
-  browser = None
-  current_browser_name = None
-
-  # TODO(jmesserly): It'd be nice to shutdown gracefully in the event of a
-  # SIGTERM. Unfortunately dart:io cannot send SIGTERM, see dartbug.com/1756.
-  signal.signal(signal.SIGTERM, lambda number, frame: close_browser(browser))
-
-  try:
-    try:
-      while True:
-        line = sys.stdin.readline()
-        if line == '--terminate\n':
-          print("Terminating selenium driver")
-          break
-
-        (html_out, browser_name, executable_path,
-         timeout, mode, refresh) = parse_args(line.split())
-
-        # Sanity checks that test.dart is passing flags we can handle.
-        if mode != 'correctness':
-          print 'Batch test runner not compatible with perf testing'
-          return 1
-        if browser and current_browser_name != browser_name:
-          print('Batch test runner got multiple browsers: %s and %s'
-              % (current_browser_name, browser_name))
-          return 1
-
-        # Start the browser on the first run
-        if browser is None:
-          current_browser_name = browser_name
-          browser = start_browser(browser_name, executable_path, html_out)
-
-        source = run_test_in_browser(browser, html_out, timeout, mode, refresh)
-
-        # Test is done. Write end token to stderr and flush.
-        sys.stderr.write('>>> EOF STDERR\n')
-        sys.stderr.flush()
-
-        # print one of:
-        # >>> TEST {PASS, FAIL, OK, CRASH, FAIL, TIMEOUT}
-        status = report_results(mode, source, browser)
-        if status == 0:
-          print '>>> TEST PASS'
-        elif source == TIMEOUT_ERROR_MSG:
-          print '>>> TEST TIMEOUT'
-        elif source == CRASH_ERROR_MSG:
-          print '>>> TEST CRASH'
-          # The browser crashed, set the browser to None so that we will
-          # create a new instance on next iteration.
-          browser = None
-        else:
-          print '>>> TEST FAIL'
-        sys.stdout.flush()
-    except:
-      type, value, traceback = sys.exc_info()
-      print "run_selenium.py: Unexpected exception occured: "
-      print "    type: ", type
-      print "    value: ", value
-      print "    traceback: ", traceback
-      raise
-  finally:
-    sys.stdin.close()
-    print("Closing browser");
-
-    def close_output_streams():
-      sys.stdout.flush()
-      sys.stdout.close()
-      sys.stderr.flush()
-      sys.stderr.close()
-
-    def close_and_exit():
-      print("Timed out waiting for browser to close")
-      close_output_streams()
-      exit(1)
-
-    timer = threading.Timer(5.0, close_and_exit)
-    timer.start()
-    try:
-      close_browser(browser)
-      timer.cancel()
-    finally:
-      close_output_streams()
-
-def main(args):
-  # Run in batch mode if the --batch flag is passed.
-  # TODO(jmesserly): reconcile with the existing args parsing
-  if '--batch' in args:
-    return run_batch_tests()
-
-  # Run a single test
-  html_out, browser_name, executable_path, timeout, mode, refresh = parse_args()
-  browser = start_browser(browser_name, executable_path, html_out)
-
-  try:
-    output = run_test_in_browser(browser, html_out, timeout, mode, refresh)
-    return report_results(mode, output, browser)
-  finally:
-    close_browser(browser)
-
-if __name__ == "__main__":
-  sys.exit(main(sys.argv))
diff --git a/tools/testing/webdriver_test_setup.py b/tools/testing/webdriver_test_setup.py
deleted file mode 100755
index c68543b..0000000
--- a/tools/testing/webdriver_test_setup.py
+++ /dev/null
@@ -1,434 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 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.
-
-# Run to install the necessary components to run webdriver on the buildbots or
-# on your local machine.
-# Note: The setup steps can be done fairly easily by hand. This script is
-# intended to simply and reduce the time for setup since there are a fair number
-# of steps.
-
-# TODO(efortuna): Rewrite this script in Dart when the Process module has a
-# better high level API.
-import HTMLParser
-import optparse
-import os
-import platform
-import re
-import shutil
-import string
-import subprocess
-import sys
-import urllib
-import urllib2
-import zipfile
-
-def run_cmd(cmd, stdin=None):
-  """Run the command on the command line in the shell. We print the output of
-  the command.
-  """
-  print cmd
-  p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-      stdin=subprocess.PIPE, shell=True)
-  output, stderr = p.communicate(input=stdin)
-  if output:
-    print output
-  if stderr:
-    print stderr
-
-def parse_args():
-  parser = optparse.OptionParser()
-  parser.add_option('--firefox', '-f', dest='firefox',
-      help="Don't install Firefox", action='store_true', default=False)
-  parser.add_option('--opera', '-o', dest='opera', default=False,
-      help="Don't install Opera", action='store_true')
-  parser.add_option('--chromedriver', '-c', dest='chromedriver',
-      help="Don't install chromedriver.", action='store_true', default=False)
-  parser.add_option('--iedriver', '-i', dest='iedriver',
-      help="Don't install iedriver (only used on Windows).",
-      action='store_true', default=False)
-  parser.add_option('--seleniumrc', '-s', dest='seleniumrc',
-      help="Don't install the Selenium RC server (used for Safari and Opera "
-           "tests).", action='store_true', default=False)
-  parser.add_option('--python', '-p', dest='python',
-      help="Don't install Selenium python bindings.", action='store_true',
-      default=False)
-  parser.add_option('--buildbot', '-b', dest='buildbot', action='store_true',
-      help='Perform a buildbot selenium setup (buildbots have a different' +
-      'location for their python executable).', default=False)
-  args, _ = parser.parse_args()
-  return args
-
-def find_depot_tools_location(is_buildbot):
-  """Depot_tools is our default install location for chromedriver, so we find
-  its location on the filesystem.
-  Arguments:
-  is_buildbot - True if we are running buildbot machine setup (we can't detect
-      this automatically because this script is not run at build time).
-  """
-  if is_buildbot:
-    depot_tools = os.sep + os.path.join('b', 'depot_tools')
-    if 'win32' in sys.platform or 'cygwin' in sys.platform:
-      depot_tools = os.path.join('e:', depot_tools)
-    return depot_tools
-  else:
-    path = os.environ['PATH'].split(os.pathsep)
-    for loc in path:
-      if 'depot_tools' in loc:
-        return loc
-  raise Exception("Could not find depot_tools in your path.")
-
-class GoogleBasedInstaller(object):
-  """Install a project from a Google source, pulling latest version."""
-
-  def __init__(self, project_name, destination, download_path_func):
-    """Create an object that will install the project.
-    Arguments:
-    project_name - Google code name of the project, such as "selenium" or
-    "chromedriver."
-    destination - Where to download the desired file on our filesystem.
-    download_path_func - A function that takes a dictionary (currently with keys
-    "os" and "version", but more can be added) that calculates the string
-    representing the path of the download we want.
-    """
-    self.project_name = project_name
-    self.destination = destination
-    self.download_path_func = download_path_func
-
-  @property
-  def get_os_str(self):
-    """The strings to indicate what OS a download is for."""
-    os_str = 'win'
-    if 'darwin' in sys.platform:
-      os_str = 'mac'
-    elif 'linux' in sys.platform:
-      os_str = 'linux32'
-      if '64bit' in platform.architecture()[0]:
-        os_str = 'linux64'
-    if self.project_name == 'chromedriver' and (
-        os_str == 'mac' or os_str == 'win'):
-      os_str += '32'
-    return os_str
-
-  def run(self):
-    """Download and install the project."""
-    print 'Installing %s' % self.project_name
-    os_str = self.get_os_str
-    version = self.find_latest_version()
-    download_path = self.download_path_func({'os': os_str, 'version': version})
-    download_name = os.path.basename(download_path)
-    urllib.urlretrieve(os.path.join(self.source_path(), download_path),
-        os.path.join(self.destination, download_name))
-    if download_name.endswith('.zip'):
-      if platform.system() != 'Windows':
-        # The Python zip utility does not preserve executable permissions, but
-        # this does not seem to be a problem for Windows, which does not have a
-        # built in zip utility. :-/
-        run_cmd('unzip -u %s -d %s' % (os.path.join(self.destination,
-                download_name), self.destination), stdin='y')
-      else:
-        z = zipfile.ZipFile(os.path.join(self.destination, download_name))
-        z.extractall(self.destination)
-        z.close()
-      os.remove(os.path.join(self.destination, download_name))
-    chrome_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
-        'orig-chromedriver')
-    if self.project_name == 'chromedriver' and os.path.exists(chrome_path):
-      # We have one additional location to make sure chromedriver is updated.
-      # TODO(efortuna): Remove this. See move_chrome_driver_if_needed in
-      # perf_testing/run_perf_tests.py
-      driver = 'chromedriver'
-      if platform.system() == 'Windows':
-        driver += '.exe'
-      shutil.copy(os.path.join(self.destination, driver),
-          os.path.join(chrome_path, driver))
-
-class ChromeDriverInstaller(GoogleBasedInstaller):
-  """Install chromedriver from Google Storage."""
-
-  def __init__(self, destination):
-    """Create an object to install ChromeDriver
-    destination - Where to download the desired file on our filesystem.
-    """
-    super(ChromeDriverInstaller, self).__init__('chromedriver', destination,
-        lambda x: '%(version)s/chromedriver_%(os)s.zip' % x)
-
-  def find_latest_version(self):
-    """Find the latest version number of ChromeDriver."""
-    source_page = urllib2.urlopen(self.source_path())
-    source_text = source_page.read()
-    regex = re.compile('(?:<Key>)(\d+\.\d+)')
-    latest = max(regex.findall(source_text))
-    return latest
-
-  def source_path(self):
-    return 'http://chromedriver.storage.googleapis.com'
-
-class GoogleCodeInstaller(GoogleBasedInstaller):
-  """Install a project from Google Code."""
-
-  def google_code_downloads_page(self):
-    return 'http://code.google.com/p/%s/downloads/list' % self.project_name
-
-  def find_latest_version(self):
-    """Find the latest version number of some code available for download on a
-    Google code page. This was unfortunately done in an ad hoc manner because
-    Google Code does not seem to have an API for their list of current
-    downloads(!).
-    """
-    google_code_site = self.google_code_downloads_page()
-    f = urllib2.urlopen(google_code_site)
-    latest = ''
-
-    download_regex_str = self.download_path_func({'os': self.get_os_str,
-        'version': '.+'})
-
-    for line in f.readlines():
-      if re.search(download_regex_str, line):
-        suffix_index = line.find(
-            download_regex_str[download_regex_str.rfind('.'):])
-        name_end = download_regex_str.rfind('.+')
-        name = self.download_path_func({'os': self.get_os_str, 'version': ''})
-        name = name[:name.rfind('.')]
-        version_str = line[line.find(name) + len(name) : suffix_index]
-        orig_version_str = version_str
-        if version_str.count('.') == 0:
-          version_str = version_str.replace('_', '.')
-          version_str = re.compile(r'[^\d.]+').sub('', version_str)
-        if latest == '':
-          latest = '0.' * version_str.count('.')
-          latest += '0'
-          orig_latest_str = latest
-        else:
-          orig_latest_str = latest
-          latest = latest.replace('_', '.')
-          latest = re.compile(r'[^\d.]+').sub('', latest)
-        nums = version_str.split('.')
-        latest_nums = latest.split('.')
-        for (num, latest_num) in zip(nums, latest_nums):
-          if int(num) > int(latest_num):
-            latest = orig_version_str
-            break
-          else:
-            latest = orig_latest_str
-    if latest == '':
-      raise Exception("Couldn't find the desired download on " + \
-          ' %s.' % google_code_site)
-    return latest
-
-  def source_path(self):
-    return 'http://%s.googlecode.com/files/' % self.project_name
-
-
-class FirefoxInstaller(object):
-  """Installs the latest version of Firefox on the machine."""
-
-  def ff_download_site(self, os_name):
-    return 'http://releases.mozilla.org/pub/mozilla.org/firefox/releases/' + \
-        'latest/%s/en-US/' % os_name
-
-  @property
-  def get_os_str(self):
-    """Returns the string that Mozilla uses to denote which operating system a
-    Firefox binary is for."""
-    os_str = ('win32', '.exe')
-    if 'darwin' in sys.platform:
-      os_str = ('mac', '.dmg')
-    elif 'linux' in sys.platform:
-      os_str = ('linux-i686', '.tar.bz2')
-      if '64bit' in platform.architecture()[0]:
-        os_str = ('linux-x86_64', '.tar.bz2')
-    return os_str
-
-  def get_download_url(self):
-    """Parse the html on the page to determine what is the latest download
-    appropriate for our system."""
-    f = urllib2.urlopen(self.ff_download_site(self.get_os_str[0]))
-    download_name = ''
-    for line in f.readlines():
-      suffix = self.get_os_str[1]
-      if (suffix + '"') in line:
-        link_str = '<a href="'
-        download_name = line[line.find(link_str) + len(link_str) : \
-            line.find(suffix) + len(suffix)]
-        break
-    return '%s%s' % (self.ff_download_site(self.get_os_str[0]), download_name)
-
-  def run(self):
-    print 'Installing Firefox'
-    if 'darwin' in sys.platform:
-      urllib.urlretrieve(self.get_download_url(), 'firefox.dmg')
-      run_cmd('hdiutil mount firefox.dmg')
-      run_cmd('sudo cp -R /Volumes/firefox/Firefox.app /Applications')
-      run_cmd('hdiutil unmount /Volumes/firefox/')
-    elif 'win' in sys.platform:
-      urllib.urlretrieve(self.get_download_url(), 'firefox_install.exe')
-      run_cmd('firefox_install.exe -ms')
-    else:
-      run_cmd('wget -O - %s | tar -C ~ -jxv' % self.get_download_url())
-
-
-class SeleniumBindingsInstaller(object):
-  """Install the Selenium Webdriver bindings for Python."""
-
-  SETUPTOOLS_SITE = 'http://python-distribute.org/distribute_setup.py'
-  PIP_SITE = 'https://raw.github.com/pypa/pip/master/contrib/get-pip.py'
-  def __init__(self, is_buildbot):
-    self.is_buildbot = is_buildbot
-
-  def run(self):
-    print 'Installing Selenium Python Bindings'
-    admin_keyword = ''
-    python_cmd = 'python'
-    pip_cmd = 'pip'
-    if 'win32' not in sys.platform and 'cygwin' not in sys.platform:
-      admin_keyword = 'sudo'
-      pip_cmd = '/usr/local/bin/pip'
-    else:
-      # The python installation is "special" on Windows buildbots.
-      if self.is_buildbot:
-        python_loc = os.path.join(
-            find_depot_tools_location(self.is_buildbot), 'python_bin')
-        python_cmd = os.path.join(python_loc, 'python')
-        pip_cmd = os.path.join(python_loc, 'Scripts', pip_cmd)
-      else:
-        path = os.environ['PATH'].split(os.pathsep)
-        for loc in path:
-          if 'python' in loc or 'Python' in loc:
-            pip_cmd = os.path.join(loc, 'Scripts', pip_cmd)
-            break
-    page = urllib2.urlopen(self.SETUPTOOLS_SITE)
-    run_cmd('%s %s' % (admin_keyword, python_cmd), page.read())
-    page = urllib2.urlopen(self.PIP_SITE)
-    run_cmd('%s %s' % (admin_keyword, python_cmd), page.read())
-    run_cmd('%s %s install -U selenium' % (admin_keyword, pip_cmd))
-
-class OperaHtmlParser(HTMLParser.HTMLParser):
-  """A helper class to parse Opera pages listing available downloads to find the
-  correct download we want."""
-
-  def initialize(self, rejection_func, accept_func):
-    """Initialize some state for our parser.
-    Arguments:
-    rejection_func: A function that accepts the value of the URL and determines
-      if it is of the type we are looking for.
-    accept_func: A function that takes the URL and the "current best" URL and
-      determines if it is better than our current download url."""
-    self.latest = 0
-    self.rejection_func = rejection_func
-    self.accept_func = accept_func
-
-  def handle_starttag(self, tag, attrs):
-    """Find the latest version."""
-    if (tag == 'a' and attrs[0][0] == 'href' and
-        self.rejection_func(attrs[0][1])):
-      self.latest = self.accept_func(attrs[0][1], self.latest)
-
-class OperaInstaller(object):
-  """Install from the Opera FTP website."""
-
-  def find_latest_version(self, download_page, rejection_func, accept_func):
-    """Get the latest non-beta version.
-    Arguments:
-    download_page: The initial page that lists all the download options.
-    rejection_func: A function that accepts the value of the URL and determines
-      if it is of the type we are looking for.
-    accept_func: A function that takes the URL and the "current best" URL and
-      determines if it is better than our current download url."""
-    f = urllib2.urlopen(download_page)
-    parser = OperaHtmlParser()
-    parser.initialize(rejection_func, accept_func)
-    parser.feed(f.read())
-    return str(parser.latest)
-
-  def run(self):
-    """Download and install Opera."""
-    print 'Installing Opera'
-    os_str = self.get_os_str
-    download_name = 'http://ftp.opera.com/pub/opera/%s/' % os_str
-
-    def higher_revision(new_version_str, current):
-      version_string = new_version_str[:-1]
-      if int(version_string) > current:
-        return int(version_string)
-      return current
-
-    version = self.find_latest_version(
-        download_name,
-        lambda x: x[0] in string.digits and 'b' not in x and 'rc' not in x,
-        higher_revision)
-    download_name += version
-    if ('linux' in sys.platform and
-        platform.linux_distribution()[0] == 'Ubuntu'):
-      # Last time I tried, the .deb file you download directly from opera was
-      # not installing correctly on Ubuntu. This installs Opera more nicely.
-      os.system("sudo sh -c 'wget -O - http://deb.opera.com/archive.key | "
-          "apt-key add -'")
-      os.system("""sudo sh -c 'echo "deb http://deb.opera.com/opera/ """
-          """stable non-free" > /etc/apt/sources.list.d/opera.list'""")
-      run_cmd('sudo apt-get update')
-      run_cmd('sudo apt-get install opera', stdin='y')
-    else:
-      if 'darwin' in sys.platform:
-        dotted_version = '%s.%s' % (version[:2], version[2:])
-        download_name += '/Opera_%s_Setup_Intel.dmg' % dotted_version
-        urllib.urlretrieve(download_name, 'opera.dmg')
-        run_cmd('hdiutil mount opera.dmg', stdin='qY\n')
-        run_cmd('sudo cp -R /Volumes/Opera/Opera.app /Applications')
-        run_cmd('hdiutil unmount /Volumes/Opera/')
-      elif 'win' in sys.platform:
-        download_name += '/en/Opera_%s_en_Setup.exe' % version
-        urllib.urlretrieve(download_name, 'opera_install.exe')
-        run_cmd('opera_install.exe -ms')
-      else:
-        # For all other flavors of linux, download the tar.
-        download_name += '/'
-        extension = '.tar.bz2'
-        if '64bit' in platform.architecture()[0]:
-          platform_str = '.x86_64'
-        else:
-          platform_str = '.i386'
-        def get_acceptable_file(new_version_str, current):
-          return new_version_str
-        latest = self.find_latest_version(
-            download_name,
-            lambda x: x.startswith('opera') and x.endswith(extension)
-                and platform_str in x,
-            get_acceptable_file)
-        download_name += latest
-        run_cmd('wget -O - %s | tar -C ~ -jxv' % download_name)
-        print ('PLEASE MANUALLY RUN "~/%s/install" TO COMPLETE OPERA '
-            'INSTALLATION' %
-            download_name[download_name.rfind('/') + 1:-len(extension)])
-
-  @property
-  def get_os_str(self):
-    """The strings to indicate what OS a download is."""
-    os_str = 'win'
-    if 'darwin' in sys.platform:
-      os_str = 'mac'
-    elif 'linux' in sys.platform:
-      os_str = 'linux'
-    return os_str
-
-def main():
-  args = parse_args()
-  if not args.python:
-    SeleniumBindingsInstaller(args.buildbot).run()
-  if not args.chromedriver:
-    ChromeDriverInstaller(find_depot_tools_location(args.buildbot)).run()
-  if not args.seleniumrc:
-    GoogleCodeInstaller('selenium', os.path.dirname(os.path.abspath(__file__)),
-        lambda x: 'selenium-server-standalone-%(version)s.jar' % x).run()
-  if not args.iedriver and platform.system() == 'Windows':
-    GoogleCodeInstaller('selenium', find_depot_tools_location(args.buildbot),
-        lambda x: 'IEDriverServer_Win32_%(version)s.zip' % x).run()
-  if not args.firefox:
-    FirefoxInstaller().run()
-  if not args.opera:
-    OperaInstaller().run()
-
-if __name__ == '__main__':
-  main()
